[코드트리 조별과제] #08. 새로운 2차원 배열 선언과 활용

1. n * n 크기의 0으로 초기화된 2차원 배열 만들기

1. list comprehension 이용

n = 4
arr_2d = [
    [0 for _ in range(n)]
    for _ in range(n)
]
print(arr_2d)

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

 

  • n * m 크기의 격자라면 다음과 같이 초기화가 가능함
  • list comprehension 사용시 n, m 위치에 유의해야 함
n, m = 4, 5
arr_2d = [
    [0 for _ in range(m)]
    for _ in range(n)
]
print(arr_2d)

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

 

 

2. 중첩 반복문을 활용하여 range 함수 사용

n = 4
arr_2d = [[1, 2, 3, 4], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]]
for i in range(n):
    for j in range(n):
        print(arr_2d[i][j], end=" ")
    print()

 

  • range 없이 리스트 내 각 원소를 바로 접근하는 식으로 표현이 가능함
  • 2차원 배열의 원소는 각 행이 되며, 각 행에 있는 원소들을 조회하며 값을 출력함
n = 4
arr_2d = [[1, 2, 3, 4], [7, 8, 9, 10], [11, 12, 13, 14], [15, 16, 17, 18]]
for row in arr_2d:
    for elem in row:
        print(elem, end=" ")
    print()

 

 

2. n * n 크기의 격자에 특정 규칙에 맞춰 숫자를 출력하는 문제

예제1

입력
n = 3

출력
1 3 5
7 9 11
13 15 17

 

  • 처음에 크기가 n * n인, 전부 0으로 초기화된 배열을 선언하여, 순서대로 숫자를 2씩 증가시키며 각 칸에 숫자를 적음
  • 이때, 숫자를 2씩 증가시키기 위해서 num이라는 변수를 활용함
n = 3
arr_2d = [
    [0 for _ in range(n)]
    for _ in range(n)
]

num = 1
for i in range(n):
    for j in range(n):
        arr_2d[i][j] = num
        num += 2

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

 

 

예제2

입력
n = 4

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

 

  • 홀수번째 행에 대해서는 우측으로 이동하며 숫자를 적어야 하고, 짝수번째 행에 대해서는 좌측으로 이동하며 숫자를 적는 식으로 코드를 작성함
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()

 

 

예제3

첫 번째 행은 전부 숫자 1로 이루어져 있고, 두 번째 행 부터는 바로 위의 칸에 적혀있는 숫자에 2를 더해서 적어주는 코드

  1. 첫 번째 행에 전부 숫자 1을 채움
  2. 두 번째 행부터 마지막 행까지 전부 숫자를 채움
  3. 결과를 출력함
n = 3
arr_2d = [
    [0 for _ in range(n)]
    for _ in range(n)
]

# 1. 첫 번째 행에 전부 숫자 1을 채웁니다.
for j in range(n):
    arr_2d[0][j] = 1

# 2. 두 번째 행부터 마지막 행까지 전부 숫자를 채웁니다.
for i in range(1, n):
    for j in range(n):
        arr_2d[i][j] = arr_2d[i - 1][j] + 2

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

 

 

3. 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)

하지만 만약 특정 점 (a, b)가 존재하는지를 여러번 확인해야 하는 경우라면, 일일이 모든 점에 대해 확인하는 것은 굉장히 비효율적임

 

 

2. 2차원 배열 사용

  • 만약 점들의 위치 (r, c)의 범위가 1에서 10 사이라면 다음과 같이 0으로 초기화된 2차원 배열을 만든 뒤, 각 점들이 주어질때마다 해당 위치에 1로 표시해주는 방식으로 해결
  • 이때, for문을 11까지 돌아야 함
a, b = 1, 3

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

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

exists = True if placed[a][b] == 1 else False
print(exists)

 

만약 (2, 5), (3, 2) 이렇게 2개의 점이 주어지는 문제 였다면 placed 배열은 다음과 같음

placed
i/j  0 1 2 3 4 5 6 7 8 9 10
0    0 0 0 0 0 0 0 0 0 0  0
1    0 0 0 0 0 0 0 0 0 0  0
2    0 0 0 0 0 1 0 0 0 0  0
3    0 0 1 0 0 0 0 0 0 0  0
4    0 0 0 0 0 0 0 0 0 0  0
5    0 0 0 0 0 0 0 0 0 0  0
6    0 0 0 0 0 0 0 0 0 0  0
7    0 0 0 0 0 0 0 0 0 0  0
8    0 0 0 0 0 0 0 0 0 0  0
9    0 0 0 0 0 0 0 0 0 0  0
10   0 0 0 0 0 0 0 0 0 0  0

 

  • 0번지부터 값을 채우는 식으로 진행하는 것도 가능함
  • 이 경우에는 placed 배열의 (r, c)가 아닌 (r - 1, c - 1)에 표기하는 식으로 진행할 수 있음
  • 이번에는 11이 아닌 10까지만 배열을 만들어도 됨
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)

 

이 경우에는 주어진 점이 (2, 5), (3, 2) 인 경우에 placed 배열의 (1, 4), (2, 1)에 1이 표기된 그림으로 그려짐

placed
i/j  0 1 2 3 4 5 6 7 8 9
0    0 0 0 0 0 0 0 0 0 0
1    0 0 0 0 1 0 0 0 0 0
2    0 1 0 0 0 0 0 0 0 0
3    0 0 0 0 0 0 0 0 0 0
4    0 0 0 0 0 0 0 0 0 0
5    0 0 0 0 0 0 0 0 0 0
6    0 0 0 0 0 0 0 0 0 0
7    0 0 0 0 0 0 0 0 0 0
8    0 0 0 0 0 0 0 0 0 0
9    0 0 0 0 0 0 0 0 0 0