본문 바로가기
『 Python 』/Python 문제해결능력

[3] Python 문제해결 - List 2

by Play IT 2020. 1. 5.
반응형

2차원 List 구조

1. 1차원 List를 묶어놓은 List

2. 2차우너 이상으 ㅣ다차원 List는 차원에 따라 index를 선언

3. 2차원 List의 선언 : 세로길이(행의 개수), 가로길이(열의 개수)를 필요로 함.

 

list 초기화

원소를 직접나열하기

arr = [0,0,0,0,0]

arr = [0]*5

arr = [ i for i in range(2,9) if i i%2==0]  --> 2 4 6 8

 

2차원도 동일하다.

 

2차원 List 입력받기

1.

n, m = map(int, input().split())

mylist = [0 for _ in range(n)]

# my list = [0] *n

 

for i in range(n):

  mylist[i] = list(map(int,input().split()))

시퀀스 자료형의 연산자로 반복이용하는 방법

 

2. 

n,m = map(int,input().split())

mylist = []

for i in range(n):

  mylist.append(list(map(int,input().split()))

 

3.

n, m = map(int, input().split())

mylist = [list(map(int,input().split()))for _ in range(n)]

 

데이터 위치 찾기

1. 주어진 데이터에서 1이 입력된 [행,열]의 위치 찾기

n, m = map(int, input().split())

newlist = []

mylist = [0 for _ in range(n)]

for i in range(n):

  mylist[i] = list(map(int,input().split()))

  for j in range(m):

    if mylist[i][j] == 1:

      newlist.append([i,j])

 

2. 1이 입력된 행,열에 저장

n,m = map(int,input().split())

mylist = [list(map(int,input().split()))for _ in range(n) ]

newlist = [(i,j) for i in range(n) for j in range(m) if mylist[i][j]==1]

 

list의 순회

n*m 개의 모든 원소를 빠짐없이 조사하는 방법

1. 행 우선 순회

List의 행을 우선으로 List의 원소를 조사하는 방법

for i in range(len(arr)):

  for j in range(len(arr[i])):

    arr[i][j] # 필요한 연산 수행

 

2. 열 우선 순회

List의 열부터 먼저 조사하는 방법

i : 행의 좌표 n = len(arr)

j : 열의 좌표 m = len(arr[0])

for j in range(len(arr[0])):

  for i in range(len(arr)):

    arr[i][j] #필요한 연산 수행

 

3. 지그재그 순회

List의 행을 좌우로 조사하는 방법

좌- 우 - 좌 - 우

for i in range(len(arr)):

  for j in range(len(arr[0])):

    arr[i][j+(m-1-2*j)*(i%2)]

    #필요한 연산 수행

 

4. 델타를 이용한 2차 list 탐색

1. 2차 list의 한 좌표에서 네 방향의 인접 List 요소를 탐색할 때 사용하는 방법

2. 델타 값은 한 좌표에서 네 방향의 좌표와 x, y 의 차이를 저장한 List로 구현

3. 델타 값을 이용하여 특정 원소의 상하좌우에 위치한 원소에 접근할 수 있음

tip  이차원 list의 가장자리 원소들은 상하좌우 네 방향에 원소가 존재하지 않을 경우가 있으므로 index를 체크하거나 index의 범위를 제한해야 한다.

# arr[0--n-1][0---n-1]

dx = [0,0,-1,1]

dy = [-1,1,0,0]

 

for x in range(len(arr)):

  for y in rnage(len(arr[x])):

    for i in range(4):

      testX = x +dx[i]

      textY = y + dy[i]

      print(arr[textx][textY])

 

전치 행렬

행과 열의 값이 반대인 행렬을 의미한다.

for i in range(3):

  for j in range(3):

    if i < j:

      arr[i][j], arr[j][i] = arr[j][i], arr[i][j]

 

zip(iterable*) 

동일한 개수로 이루어진 자료형들을 묶어 주는 역할을 하는 함수 [튜플로]

alpha = ['a','b','c']  index = [1,2,3]

zip( alpha, index) -> ('a',1),('b',2),('c',3)

 

alph_index = list(zip(alpha,index))   

 

부분 집합의 합 문제

유한 개의 정수로 이루어진 집합이 있을 떄, 이 집합의 부분 집합 중에서 그 집합의 원소를 모두 더한 값이 0이 되는 경우가 있는지를 알아내는 문제

1. 완전 검색기법으로 부분 집합 합 문제를 풀기 위해서는 우선 집합의 모든 부분 집합을 생성한 후 각 부분 집합으 ㅣ합을 계산한다.

2. 주어진 집합의 부분 집합을 생성하는 방법 

 

부분 집합의 수

집합의 원소가 n개 일때 부분집합의 수는 2의 n승이다.

 

loop을 이용하여 확인하고 부분 집합을 생성하는 방법

bit = [ 0,0,0,0]

for i in range(2):

  bit[0] = i                    보여주지않음 보여줌

  for j in range(2):

    bit[1] = j

    for k in range(2):

    bit[2] = k

      for l in range(2):

        bit[3] = l

        print(bit)

 

비트 List : 대상 List의 각 원소를 포함할지 말지를 정하는 List

 

비트 연산자 : 0과 1로 이루어진 이진수에 대한 연산을 수행하는 연산자

& : 비트 단위로 and 연산을 한다

| : 비트 단위로 or 연산을 함

<< 피연산자의 비트 열을 왼쪽으로 이동시킴

>> 피연산자의 비트 열을 오른쪽으로 이동시킴

 

보다 간결하게 부분 집합을 생성하는 방법

arr = [3,6,7,1,5,4]

n = len(arr) 

for i in range(1<<n) : # 1<<n: 부분 집합의 개수

  for j in range(n) : # 원소의 수만큼 비트를 비교한다.

    if i &(1<<j) : # i의 j번째 비트가 1이면 j번째 원소 출력

      print(arr[j], end=",")

반응형

댓글