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=",")
'『 Python 』 > Python 문제해결능력' 카테고리의 다른 글
[5] Python 문제해결 - 정렬 2 [선택 정렬] (0) | 2020.01.05 |
---|---|
[4] Python 문제해결 - List 2 검색 (0) | 2020.01.05 |
[2] Python 문제해결 - 정렬 (0) | 2020.01.05 |
[0] Python 문제해결 (0) | 2020.01.05 |
[1] Python 문제해결 - List (0) | 2019.11.05 |
댓글