본문 바로가기
백준 (코테)

7. [7단계] 제목: 2차원 배열

by 코린이의 세계 2024. 8. 15.

https://infinitt.tistory.com/106

 

파이썬 (Python) 2중 리스트, 2차원 배열 선언 및 출력

https://infinitt.tistory.com/17 파이썬(Python) 기초 (6) 데이터 타입(Data Type) - 리스트 (list) 와 튜플 (tuple) 그리고 관련 함수(sort reverse insert remove pop append extend 등.. ) 리스트와 튜플은 모두 데이터를 한번에

infinitt.tistory.com

(2차원 배열 선언 및 관리)

1단계.
N*M크기의 두 행렬 A와 B가 주어졌을 때, 두 행렬을 더하는 프로그램을 작성하시오.

첫째 줄에 행렬의 크기 N과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 차례대로 주어진다. 이어서 N개의 줄에 행렬 B의 원소 M개가 차례대로 주어진다.

답: N,M = map(int, input().split())
A,B = [],[]
 
for i in range(N):
    a = list(map(int,input().split()))
    A.append(a)
    
for i in range(N):
    b = list(map(int,input().split()))
    B.append(b)
 
for i in range(N):
    for j in range(M):
        result = A[i][j] + B[i][j]
        print(result,end=' ')
    print() #줄 바꾸기

배열은 N차원으로 커질 수 있다. 선언도 다양하게 할 수 있다. 차원이 높아질수록 더 상위 개념이 나오게 된다.

1차원에서는 그냥 "행"만 있다면, 2차원에서는 "열"이 추가된다.

선언하고 싶으면 ~~[][] 이런 식으로 편하게 선언할 수 있다.


2단계.
9 ×9 격자판에 쓰인 81개의 자연수 또는 0이 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

답: field = []

for a in range(9):
    field.append(list(map(int, input().split())))

value = 0
row = 0 #행
col = 0 #열

for i in range(9):
    for j in range(9):
        if (field[i][j] >= value) :
            value = field[i][j]
            row = i+1
            col = j+1

print(value) #번호 출력
print(row, col)

키 포인트는 "0"이 리스트에 들어갈 수 있다는 것이다. 그래서 크기 비교를 할 때 "크거나 같을 때"가 들어가야 런타임 오류가 생기지 않는다. (행은 row , 열은 col로 설정)


3단계.
총 다섯 줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.

세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다. 

답: sum_word , length = [],[]
for a in range(5):
    word = input()
    sum_word.append(word)
    length.append(len(word))

rest = ""
for i in range(max(length)):
    for j in range(5):
        if (i < length[j]):
            rest += sum_word[j][i] #세로 정렬
print(rest)

전체 길이를 받을 수 있는 단어와 길이를 배열로 정의한다. 그리고 세로 길이는 5이니 5번 for문을 돌려야 한다. 이후 단어를 입력받고 , 이 단어를 "전체 단어"에 넣어준다. 단어의 길이도 길이 배열에 넣어준다. 출력 때 공백을 체크하기 위해 rest에 공백을 초기화한다. 이후 최대 길이만큼 외부 for문을 돌리고 크기를 넘어갈 시 전체 단어 + 공백을 넣어준다.

공백도 출력되지만, 붙여서 출력해야 해서 rest를 ""으로 초기화해야 한다.


4단계.
가로, 세로의 크기가 각각 100인 정사각형 모양의 흰색 도화지가 있다. 이 도화지 위에 가로, 세로의 크기가 각각 10인 정사각형 모양의 검은색 색종이를 색종이의 변과 도화지의 변이 평행하도록 붙인다. 이러한 방식으로 색종이를 한 장 또는 여러 장 붙인 후 색종이가 붙은 검은 영역의 넓이를 구하는 프로그램을 작성하시오.

첫째 줄에 색종이의 수가 주어진다. 이어 둘째 줄부터 한 줄에 하나씩 색종이를 붙인 위치가 주어진다. 색종이를 붙인 위치는 두 개의 자연수로 주어지는데 첫 번째 자연수는 색종이의 왼쪽 변과 도화지의 왼쪽 변 사이의 거리이고, 두 번째 자연수는 색종이의 아래쪽 변과 도화지의 아래쪽 변 사이의 거리이다.

답: N = int(input()) # 사각형 개수
array = [[0] * 100 for _ in range(100)]  # 도화지 범위 초기화
for a in range(N):  # 입력받은 도화지 개수만큼 돈다.
    y, x = map(int, input().split())  # 왼쪽아래 x,y 좌표를 받는다.

    for i in range(x, x + 10):  # 세로를 돈다.
        for j in range(y, y + 10):  # 가로를 돈다.
            array[i][j] = 1  # 해당 범위 값을 0에서 1로 바꿔준다.

result = 0  # 넓이를 출력할 변수
for k in range(100):  # 전체 도화지를 돌면서
    result += array[k].count(1)  # 1 개수만 세어준다

print(result)

(구글링의 힘을 이용할 수밖에 없었다.) 100 x 100의 도화지에 1 x 1 픽셀이 100개 있다고 생각하면 쉽게 풀린다. (이런 생각은 어떻게 하는지... 진짜 대단하다.)

array = [[0] * 100 for _ in range(100)]  < array라는 배열을 선언한다. 이 배열은 100 x 100 사이즈의 도화지 전체 범위를 뜻한다. 1부터 100까지의 for문에서 모든 배별에 0을 넣어준다. 여기서 0은 "없는 픽셀"을 뜻한다. 1은 있는 픽셀을 뜻한다.

색종이의 크기는 10 x 10으로 정해있다. 고로 입력받은 x 좌표와 y좌표가 있다면 전체 길이를 x +10 , y + 10이라고 말할 수 있다. 2중 for문을 도는데, 전체 세로 길이와 가로길이를 돌린다. 이때 돌아간 값을 0에서 1로 바꾸어야 한다.

이후 result를 0으로 초기화. result는 넓이를 출력할 변수다. 이후 전체 도화지 사이즈(100)만큼 돌린다. array라는 도화지에서 1이 몇 개인지를 count함수로 개수를 세준다. 이후 초기화된 result(0) + array의 1의 개수를 카운트한 개수를 다 더해서 다시 result에 넣어준다. 이 짓을 100번 할 것이다. 그럼 모든 카운팅이 result에 들어갈 것이고, result를 출력하면 된다.

결론

4번이 진짜 어려웠다. 도화지를 100 곱하기 100 픽셀로 생각한다는 부분에서 감탄했다.

구글링 아니었으면 진짜 어렵게 풀었거나 풀지도 못했을 것이다.