본문 바로가기

코딩테스트/파이썬

백준 1780번 종이의 개수

728x90

문제 설명

 

count_1은 -1로만 채워진 종이의 개수, count0은 0로만 채워진 종이의 개수, count1은 1로만 채워진 종이의 개수를 뜻한다. count_1,count0,count1을 전역변수로 선언하고 재귀함수의 인자로는 검사할 배열의 시작점 (a,b)와 종이의 길이 N을 넣어준다. (a,b)부터 시작하여 이중for문을 사용하여 종이를 확인하고 만약 해당 위치의 종이와 시작점 (a,b)의 종이와 다르다면 배열을 9등분하여 재귀함수를 호출한다.

 

 

이중for문을 통과하면 해당 종이는 모두 같은 종이로 되어있음을 뜻하므로 종이의 종류에 맞게 개수를 더해준다.

 

 

전체 코드

count_1 = 0
count0 = 0
count1 = 0
arr = []

def func(a,b,N):
    global count_1
    global count0
    global count1
    for i in range(a,a+N):
        for j in range(b,b+N):
            if arr[i][j] != arr[a][b]:
                func(a,b,N//3)
                func(a,b+N//3,N//3)
                func(a,b+N*2//3,N//3)
                func(a+N//3,b,N//3)
                func(a+N//3,b+N//3,N//3)
                func(a+N//3,b+N*2//3,N//3)
                func(a+N*2//3,b,N//3)
                func(a+N*2//3,b+N//3,N//3)
                func(a+N*2//3,b+N*2//3,N//3)
                return

    if arr[a][b] == -1:
        count_1 += 1
    elif arr[a][b] == 0:
        count0 += 1
    else:
        count1 += 1
    return


def main():
    global count_1
    global count0
    global count1
    num = int(input())
    tmp = num
    while tmp:
        plist = list(map(int,input().split()))
        arr.append(plist)
        tmp -= 1
    func(0,0,num)
    print(count_1)
    print(count0)
    print(count1)


if __name__ == "__main__":
    main()
728x90
반응형