백준1780(파이썬) - 종이의 개수

resilient

·

2021. 6. 1. 22:08

728x90
반응형

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

 

1780번: 종이의 개수

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

www.acmicpc.net

  • 이 문제는 처음 풀때는 각 길이마다 끊어가지고 오른쪽, 아래쪽으로 bfs를 사용해서 풀었다. 
  • 근데 계속 답이 맞지 않아서 결국에는 시간이 좀 걸리더라도 for문을 이용한 풀이로 풀었다.
  • 이중 for문으로 2차원 배열을 돌면서 처음 시작했던 x,y값과 다르면 한 변을 나누어 가면서 함수를 돌리는 방식으로 풀었다.
import sys
input = sys.stdin.readline

n = int(input())
graph =[list(map(int,input().split())) for _ in range(n)]

#-1,0,1 카운트를 저장함
minus_cnt = 0
zero_cnt = 0
one_cnt = 0
def function(x,y,length):
    global cnt,minus_cnt,zero_cnt,one_cnt
    for i in range(x,x+length):
        for j in range(y,y+length):
            #다른 수의 종이조각이 나왔을때
            if graph[x][y] != graph[i][j]:
                for a in range(3):
                    for b in range(3):
                        function(x+length//3*a,y+length//3*b,length//3)
                return
    # 다 같은수로 이루어진 종이조각일 때,
    print(x,y)
    if graph[x][y] == 0:
        zero_cnt += 1
    elif graph[x][y] == -1:
        minus_cnt +=1
    elif graph[x][y] == 1:
        one_cnt += 1
    
#9개로 자르려면 3 x 3 으로 나눠야한다.
function(0,0,n)
print(minus_cnt)
print(zero_cnt)
print(one_cnt)


반응형