https://infinitt.tistory.com/106
(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 픽셀로 생각한다는 부분에서 감탄했다.
구글링 아니었으면 진짜 어렵게 풀었거나 풀지도 못했을 것이다.
'백준 (코테)' 카테고리의 다른 글
9. [9단계] 제목: 약수, 배수와 소수 단계 (0) | 2024.08.17 |
---|---|
8. [8단계] 제목: 일반 수학 1 (0) | 2024.08.16 |
6. [6단계] 제목: 심화 1단계 (0) | 2024.08.14 |
5. [5단계] 제목: 문자열 (0) | 2024.08.13 |
1~4단계 백준 복습 (0) | 2024.08.12 |