티스토리 뷰

반응형

 

 

 문제

 

www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

 

 

 

 

 

 

 문제 상황

 

- 종이를 확인하여 종이가 하나의 숫자로만 되어있으면 그 종이는 더이상 자르지 않고, 다르다면 9분할해서 카운팅을 반복한다.

 

 

 

 

 

 

 

 

 해결 전략

 

- BOJ의 Z 문제와 유사한 풀이로, 함수를 설정해 재귀하도록 한다. 주어진 조건을 만족하면 글로벌을 통해 카운트를 증가시켜주고, 아니면 스플릿을 반복한다.

 

 

 

 

 

 

 

 

 코드

 

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
26
from sys import stdin
input = stdin.readline
= int(input())
paper = [ list(map(int, input().split())) for _ in range(N) ] # 종이를 입력
cnt_1, cnt0, cnt1 = 000 # -1 종이의 개수, 0 종이의 개수, 1 종이의 개수
def check_paper(paper):
    num = paper[0][0]
    for i in range(len(paper)):
        for j in range(len(paper)):
            if paper[i][j] != num:
                return -2
    return num
def split_paper(paper):
    global cnt_1, cnt0, cnt1
    if check_paper(paper) == -2:
        split_len = len(paper)//3
        for i in range(3):
            for j in range(3):
                piece = [row[j*split_len:(j+1)*split_len] for row in paper[i*split_len:(i+1)*split_len]]
                split_paper(piece) # 조각을 재검사
    elif check_paper(paper) == 1 : cnt1 += 1
    elif check_paper(paper) == 0 : cnt0 += 1
    elif check_paper(paper) == -1 : cnt_1 += 1
split_paper(paper)
for cnt in [cnt_1, cnt0, cnt1]:
    print(cnt)
cs

 

 

 

 

 

 

 

 

 해설

 

- 종이가 하나의 숫자로만 이루어져 있는지 확인하는 함수 check_paper와, 숫자가 하나로만 이루어져 있지 않을경우 종이를 자르는 split_paper 함수로 나누어 작업을 반복한다.

 

 

 

 

 

 

 

 새로 학습한 것 & 실수 

 

- 함수를 설정해놓고 실행을 시키는 구문을 빼먹어 0 0 0 이 나왔었다. 함수의 정의와 실행은 다르다.

 

 

 

 

 

 

 

 

반응형
댓글