[ BOJ 2630 ] 색종이 만들기(Python)

uoayop·2021년 6월 1일
0

알고리즘 문제

목록 보기
77/103
post-thumbnail

문제

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

면의 모든 칸이 같은 색이 될 때까지 색종이를 1/4로 계속 분할하는 문제다.
파란색과 하얀색 종이의 갯수를 출력하면 된다.


문제 풀이

0. 입력 받기

n = int(input())
papers = []

for _ in range(n):
    row = list(map(int,input().rsplit()))
    papers.append(row)

1. 현재 칸과 다른 색일 경우 1/4로 분할한다.

# 현재 칸 색상
curr = papers[row][col]

for i in range(row, row + n):
    for j in range(col, col + n):
        if curr != papers[i][j]:
            # 길이를 절반으로 나눈다.
            next_n = n // 2
            
            check(row, col, next_n) # 1
            check(row, col + next_n, next_n) # 2
            check(row + next_n, col, next_n) # 3
            check(row + next_n, col + next_n, next_n) # 4
            return

2. 현재 칸의 색상에 따라 갯수 더해주기

# 현재 칸 색상이 흰 색이면
if curr == 0:
    white_cnt += 1
# 현재 칸 색상이 파란색이면
else:
    blue_cnt += 1
return

코드

import sys
input = sys.stdin.readline

n = int(input())
papers = []

for _ in range(n):
    row = list(map(int,input().rsplit()))
    papers.append(row)

blue_cnt, white_cnt = 0, 0

def check(row,col,n):
    global blue_cnt, white_cnt

    curr = papers[row][col]
    for i in range(row, row + n):
        for j in range(col, col + n):
            if curr != papers[i][j]:
                next_n = n // 2
                check(row, col, next_n)
                check(row, col + next_n, next_n)
                check(row + next_n, col, next_n)
                check(row + next_n, col + next_n, next_n)
                return
    if curr == 0:
        white_cnt += 1
    else:
        blue_cnt += 1
    return

check(0,0,n)
print(white_cnt)
print(blue_cnt)
profile
slow and steady wins the race 🐢

0개의 댓글