본문 바로가기
Python3/백준 알고리즘

2022.02.21 [백준] (python 파이썬) 종이의 개수

by ian's coding 2022. 2. 21.
728x90
반응형

 

 

 

 

 

https://www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수

www.acmicpc.net


풀이

이 문제는 분할 정복, 재귀함수 문제이다.

(5~7) n이 1이면 더 이상 분할할 수 없기 때문에 해당 인덱스값의 카운트 증가

        (ans배열안에 arr+1을 해준 이유는 배열의 인덱스는 0부터 시작하기 때문에 -1을 처리하기 위해 +1을 해서 저장           함.)

(9~16) 우선 해당 종이의 범위에 숫자가 모두 같은지 확인한다.

(17~18) 같으면 해당 종이의 첫인덱스값을 ans배열에 저장한다.

(19~23) 해당 종이안에 값이 다르면 해당 종이를 9등분 해주고 분할된 종이를 재귀함수를 이용하여 다시 확인해줌.

 

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
n=int(input())
arr=[list(map(int, input().split())) for _ in range(n)]
ans=[0]*3
def Cal(n,x,y):
    if n==1:
        ans[arr[x][y]+1]+=1
        return
 
    check=True
    for i in range(x,x+n):
        for j in range(y,y+n):
            if arr[x][y]!=arr[i][j]:
                check=False
                break
        if not check:
            break
    if check:
        ans[arr[x][y]+1]+=1
    else:
        a=n//3
        for i in range(3):
            for j in range(3):
                Cal(a,x+a*i,y+a*j)
Cal(n,0,0)
for i in ans:
    print(i)
cs

 

 

 

 

728x90
반응형

댓글