[코드트리 조별과제] Python 08. 2차원 배열

김지민·2024년 7월 31일

1. 배열 입력 받기

n개의 줄에 걸쳐 각 n개의 숫자를 공백을 사이에 두고 입력받는 코드

n = 4
arr_2d = []
for _ in range(n):
    arr_1d = list(map(int, input().split()))
    arr_2d.append(arr_1d)

print(arr_2d)

>> 출력 결과
[[1, 2, 3, 4], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]]
  • 어떤 배열을 정의하고 for loop 안에 append만 사용하는 경우는 list comprehension을 이용할 수 있습니다.
n = 4
arr_2d = [
    list(map(int, input().split()))
    for _ in range(n)
]
print(arr_2d)

2. 배열 원소에 대한 접근

"""
i/j  0  1  2  3
0    1  2  3  4
1    7  8  9 10
2   11 12 13 14
3   15 16 17 18
"""
arr_2d = [[1, 2, 3, 4], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]]
print(arr_2d[0][0]) # 1행 1열 -> 1
print(arr_2d[1][2]) # 2행 3열 -> 9

3. 새로운 2차원 배열 선언

n * m 크기의 격자라면 다음과 같이 초기화가 가능합니다. list comprehension 사용시 n, m 위치에 유의합니다.

n, m = 4, 5
arr_2d = [
    [0 for _ in range(m)] # m개의 0을 가진 리스트를 생성(열)
    for _ in range(n) # n개의 행을 가진 2차원 리스트를 생성(행)
]
print(arr_2d)

>> 출력 결과
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

4. 2차원 배열 출력

n = 4
arr_2d = [[1, 2, 3, 4], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]]

#방법 1
for i in range(n): #행
    for j in range(n): #열
        print(arr_2d[i][j], end=" ")
    print()

#방법2
for row in arr_2d: #행
    for elem in row: #열
        print(elem, end=" ")
    print()

5. 다양한 활용

  • 신기한 규칙: 손으로 숫자를 쭉 적다가 내려서 다시 반대 방향으로 적는 것을 반복하는 것
입력
n = 4

출력
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13

=> 홀수번째 행에 대해서는 우측으로 이동하며 숫자를 적어야 하고, 짝수번째 행에 대해서는 좌측으로 이동하며 숫자를 적는 식으로 코드를 작성하면 됩니다. & num 변수 사용해서 계속 더해줌

# 0으로 채워진 배열 만들기 
n = 4
arr_2d = [
    [0 for _ in range(n)]
    for _ in range(n)
]

num = 1
# 짝수, 홀수에 따른 배열 숫자 입력(대체)
for i in range(n):
    if i % 2 == 0:
        for j in range(n):
            arr_2d[i][j] = num
            num += 1
    else:
        for j in range(n - 1, -1, -1):
            arr_2d[i][j] = num
            num += 1

# 출력
for row in arr_2d:
    for elem in row:
        print(elem, end=" ")
    print()

어디를 기준으로 연속성이 있는지 봐야됨. if 같은 행으로 쭉 가는 경우, 행이 밖 loop 이런 식

2차 격자점으로서의 배열

2차 평면 상에 n개의 점이 주어졌을 때, (a, b)가 해당 점들 중 하나인지를 쉽게 판단할 수는 없을까요?

  • 방법1: n개의 점들 중 (a, b)가 있는지를 직접 확인
a, b = 1, 3
exists = False
for _ in range(n):
    r, c = tuple(map(int, input().split()))
    if r == a and c == b:
        exists = True

print(exists)
  • 방법2: 점들의 위치 (r, c)의 범위가 1에서 10 사이라면 다음과 같이 0으로 초기화된 2차원 배열을 만든 뒤, 각 점들이 주어질때마다 해당 위치에 1로 표시해주는 방식
a, b = 1, 3

placed = [
   [0 for _ in range(10)]
   for _ in range(10)
]

for _ in range(n):
   r, c = tuple(map(int, input().split()))
   placed[r - 1][c - 1] = 1

exists = True if placed[a - 1][b - 1] == 1 else False
print(exists)
  • 도전문제
    첫 번째 줄에 격자의 크기 n과 점의 개수 m이 공백을 두고 주어집니다.
    두 번째 줄부터 m개의 줄에 걸쳐 각 점의 행 번호와 열 번호가 공백을 사이에 두고 주어집니다.
    주어진 m개의 점의 위치는 모두 다름을 가정해도 좋습니다.
  • 1 ≤ n ≤ 10
  • 1 ≤ m ≤ n * n
    예제1
    입력:
    3 3
    1 1
    3 2
    3 3
    출력:
    1 0 0
    0 0 0
    0 6 9
    정답
k = input().split()
n, m = int(k[0]), int(k[1])

arr = []  

for _ in range(m):
    arr.append(tuple(map(int, input().split())))

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

for i in range(1, n+1):
    for j in range(1, n+1):
        if (i, j) in arr: #헷갈림 - tuple이므로 ( , )
            arr2[i-1][j-1] = i*j
for i in range(n):
    for j in range(n):
        print(arr2[i][j], end =" ")

    print()
profile
열혈개발자~!!

0개의 댓글