📜 제목으로 보기

✏마지막 댓글로

input array

1차원 list

10 5
1 10 4 9 2 3 8 5 7 6
a, b = map(int, input().split())
print(a, b)

# 1개는 안된다. 튜플 언패킹시에만 따로 받아진다!!
c = map(int, input().split())
print(c)
10 5
<map object at 0x000001F38F7937C0>
arr = list( map(int, input().split()) )
arr
[1, 10, 4, 9, 2, 3, 8, 5, 7, 6]

2차원(구분자O)

9
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
0 0 0 1 1 1 -1 -1 -1
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0
0 1 -1 0 1 -1 0 1 -1
0 -1 1 0 1 -1 0 1 -1
0 1 -1 1 0 -1 0 1 -1
# - 행수만큼 list comp를 돌리고, 
# - 그 행의 내부요소들은 1줄을 split -> map(int, ) -> list 까지 만든다.

N = int(input().strip())

# paper = [ for i in range(N)]
paper = [ list(map(int, input().strip().split())) for i in range(N)]
paper
[[0, 0, 0, 1, 1, 1, -1, -1, -1],
 [0, 0, 0, 1, 1, 1, -1, -1, -1],
 [0, 0, 0, 1, 1, 1, -1, -1, -1],
 [1, 1, 1, 0, 0, 0, 0, 0, 0],
 [1, 1, 1, 0, 0, 0, 0, 0, 0],
 [1, 1, 1, 0, 0, 0, 0, 0, 0],
 [0, 1, -1, 0, 1, -1, 0, 1, -1],
 [0, -1, 1, 0, 1, -1, 0, 1, -1],
 [0, 1, -1, 1, 0, -1, 0, 1, -1]]

2차원 구분자X (숫자로 1character씩만 차지)

  • 문자열(no split) -> map(1글자를 1글자int로) -> list(1글자들을 열로)
3 3
011
111
110
list('1019')
['1', '0', '1', '9']
list(map(int, '1019'))
[1, 0, 1, 9]
# - split대신 list('문자열') -> 1글자씩 list
# - split대신 list( map(int, '문자열')) -> 숫자1개씩 list
# -- map(int, '문자열')은 문자열을 하나씩 쪼개받아서 int를씌운다.
N, M = map(int, input().split()) # map은 튜플로 할당 받을 수 있다. but 1개 변수에 할당시는 맵객체다.
# MIRO = [ for i in range(N) ]
# 열은 갯수는 M대신  split이 아닌 문자열->map->list -> list(map(())으로 쪼개서 받았다.
MIRO = [ list(map(int, input())) for i in range(N) ] 
MIRO
[[0, 1, 1], [1, 1, 1], [1, 1, 0]]

선언 array

  • input으로 받아서 쪼개서 열을 만들지말고, 이번에는 직접 선언해보자.
  • numpy를 지원하지 않을 때, 리스트로 만드는 n차원 배열이다.
INIT = -1 # 각 행렬 요소의 초기화 값이다.

W = row = N
H = column = M 
C = channel = 3
B = batch = 3

# 1차원 array : 초기화값이 요소 상태로 list comp 
D1 = [ INIT for _ in range(W)] # 1차원은 행길이만큼 list comp + [] X -> 행길이만큼 요소롤 복제하도록 list comp + 요소
# D1 = [ INIT ] * N # 요소복제의 2번째 방법, list든 str든 곱하면 extend된다.
# - but 내부 list comp 요소 + 외부 [] 그만큼 곱은 주의한다. id가 동일한놈들이 복사된다.

# 2차원 array : 행[]들 먼저 행길이만큼 list comp돌고 , 내부 1row를 요소 list comp 
# D2 = [ [] for _ in range(H)]
D2 = [ [ INIT for _ in range(W)  ] for _ in range(H)]

# 3차원 array : 2차원 밖에  [[]]행렬 갯수만큼 list comp 해줌.
D3 = [[[ [ INIT for _ in range(W)  ] for _ in range(H)]]     for _ in range(C)]

# 3차원 array : 2차원 밖에  [[]]행렬 갯수만큼 list comp 해줌.
D4 = [[[[ [ INIT for _ in range(W)  ] for _ in range(H)]]     for _ in range(C)]          for _ in range(B)]
print(D1)
print(D2)
print(D3)
print(D4)
[-1, -1, -1]
[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]
[[[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]]]
[[[[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]]], [[[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]]], [[[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]], [[[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]]]]

2차원 응용 by range

  • INIT값이 아닌 1부터 순서대로 채운 N*N 행렬
    • range( , , 열길이)를 이용한다. N씩 건너뛰어서 가니까...
    • 시작은 1부터 n(n-1) + 2 로 1부터 n-1까지의 합으로 간다?

1부터 순서대로 채운 (N,N)행렬

  1. 각행의 첫째항을 등차수열(column : N개) 를 이용해서 만들어준다.

    • 1부터 N의 등차수열 range(1, , N)과 끝값은 N번째항 뽑은 것 + 1 을 넣어준다
    • An = a1 + (n-1)d = 1 + n(n-1) -> range( , n*n-1 + 1, )
  2. 각 행렬의 첫째항부터 1씩 증가하여 N개를 채운 행list를 완성한다.

# - 일단 1 ~ n*(n-1)/2 에서 마지막항의 의미는 그냥 찍어보면 모른다.
n = 6
for i in range(1, n*(n-1)+2, n):
    print(i)
print(n*(n-1)+2)
1
7
13
19
25
31
32
# - for문 안의 i가 1에서부터 **등차(k)수열**이 되어버림.
# 1부터, 등차가 n이면, n열짜리 행1개를 건너띈 다음 행 첫째항이 된다.
# 열의 갯수N을 등차로 하여 일반항을 잡고, 행 N개를 가야하므로
# An = 1 + (n-1)*d = n*(n-1) + 1 이 된다.
# 등차수열 range(1, ,n)이 n번째항 까지는 가야하므로,  n번째항+1을 넣어준 것이다.
for i in range(1, n*(n-1)+2, n):
    print(i, "<<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.")
1 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
7 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
13 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
19 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
25 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
31 <<< 1시작, N열(등차), N행까지 채워주는 행렬의 각 행 첫째항입니다.
# 2중 list comp는 요소만 노출할 경우, 1차원 행렬밖에 
# - list로 만들경우, 각 요소들이 list로..
# - 행단위로 묵어서는 못만든다 -> result = [] for문 이용
n = 5
result = []
for i in range(1, n*(n-1)+2, n):
    # 첫째항 i, 등차1 의 수열을 1~n항까지 listcomp로 모으기
    result.append([ i+(j-1)*1 for j in range(1, n+1)])

result
    
[[1, 2, 3, 4, 5],
 [6, 7, 8, 9, 10],
 [11, 12, 13, 14, 15],
 [16, 17, 18, 19, 20],
 [21, 22, 23, 24, 25]]
 # 행마다 돌면서 row에접근후 인덱싱..

[ row[4:6] for row in paper[4:7]]
[[0, 0], [0, 0], [1, -1]]
def check_valid(matrix):
    print("dict상태>>>", count_dict)
    if len(matrix) == 1:
        print("1개짜리 돌입. matrix >>>", matrix)
        # 1개짜리라면..  넣고 +1
        count_dict.setdefault(matrix[0][0], 0)
        count_dict[matrix[0][0]] +=1
        return True

    
    paper_0_0 = matrix[0][0]
    flag = False
    for i in range(len(matrix)):
        for j in range(len(matrix)):
            if paper_0_0 != matrix[i][j]:
                flag = True
                break
    if flag:
        print("다른게 나왔다. N/3으로 한번더.. 총 9개... 대상 matrix : ",matrix )
        N = len(matrix)
        
        # 3x3중 1x1 -> 열 3구간 다 
        check_valid([ row[:N//3] for row in matrix[:N//3]])
        check_valid([ row[N//3:(N//3)*2] for row in matrix[:N//3]])
        check_valid([ row[(N//3)*2:] for row in matrix[:N//3]])
        # 3x3중 2x2
        check_valid([ row[:N//3] for row in matrix[N//3:(N//3)*2]])
        check_valid([ row[N//3:(N//3)*2] for row in matrix[N//3:(N//3)*2]])
        check_valid([ row[(N//3)*2:] for row in matrix[N//3:(N//3)*2]])
        # 3x3중 3x3
        check_valid([ row[:N//3] for row in matrix[(N//3)*2:]])
        check_valid([ row[N//3:(N//3)*2] for row in matrix[(N//3)*2:]])
        check_valid([ row[(N//3)*2:] for row in matrix[(N//3)*2:]])
    else:
        print("다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix:", matrix)
        count_dict.setdefault(paper_0_0, 0)
        count_dict[paper_0_0] += 1
        return True



count_dict = {}

check_valid(paper)
dict상태>>> {}
다른게 나왔다. N/3으로 한번더.. 총 9개... 대상 matrix :  [[0, 0, 0, 1, 1, 1, -1, -1, -1], [0, 0, 0, 1, 1, 1, -1, -1, -1], [0, 0, 0, 1, 1, 1, -1, -1, -1], [1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0, 0, 0, 0], [0, 1, -1, 0, 1, -1, 0, 1, -1], [0, -1, 1, 0, 1, -1, 0, 1, -1], [0, 1, -1, 1, 0, -1, 0, 1, -1]]
dict상태>>> {}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
dict상태>>> {0: 1}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
dict상태>>> {0: 1, 1: 1}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[-1, -1, -1], [-1, -1, -1], [-1, -1, -1]]
dict상태>>> {0: 1, 1: 1, -1: 1}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
dict상태>>> {0: 1, 1: 2, -1: 1}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
dict상태>>> {0: 2, 1: 2, -1: 1}
다 똑같다 통과, dict에 넣고 저장후 return True로 종료 matrix: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
dict상태>>> {0: 3, 1: 2, -1: 1}
다른게 나왔다. N/3으로 한번더.. 총 9개... 대상 matrix :  [[0, 1, -1], [0, -1, 1], [0, 1, -1]]
dict상태>>> {0: 3, 1: 2, -1: 1}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 4, 1: 2, -1: 1}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 4, 1: 3, -1: 1}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 4, 1: 3, -1: 2}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 5, 1: 3, -1: 2}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 5, 1: 3, -1: 3}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 5, 1: 4, -1: 3}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 6, 1: 4, -1: 3}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 6, 1: 5, -1: 3}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 6, 1: 5, -1: 4}
다른게 나왔다. N/3으로 한번더.. 총 9개... 대상 matrix :  [[0, 1, -1], [0, 1, -1], [1, 0, -1]]
dict상태>>> {0: 6, 1: 5, -1: 4}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 7, 1: 5, -1: 4}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 7, 1: 6, -1: 4}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 7, 1: 6, -1: 5}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 8, 1: 6, -1: 5}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 8, 1: 7, -1: 5}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 8, 1: 7, -1: 6}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 8, 1: 8, -1: 6}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 9, 1: 8, -1: 6}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 9, 1: 8, -1: 7}
다른게 나왔다. N/3으로 한번더.. 총 9개... 대상 matrix :  [[0, 1, -1], [0, 1, -1], [0, 1, -1]]
dict상태>>> {0: 9, 1: 8, -1: 7}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 10, 1: 8, -1: 7}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 10, 1: 9, -1: 7}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 10, 1: 9, -1: 8}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 11, 1: 9, -1: 8}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 11, 1: 10, -1: 8}
1개짜리 돌입. matrix >>> [[-1]]
dict상태>>> {0: 11, 1: 10, -1: 9}
1개짜리 돌입. matrix >>> [[0]]
dict상태>>> {0: 12, 1: 10, -1: 9}
1개짜리 돌입. matrix >>> [[1]]
dict상태>>> {0: 12, 1: 11, -1: 9}
1개짜리 돌입. matrix >>> [[-1]]
print(*map(lambda x:x[1], sorted(count_dict.items(), key=lambda x:x[0])))
10 12 11