본문 바로가기
알고리즘/BOJ

[BOJ] 2630. 색종이 만들기

by ㅣlㅣl 2024. 6. 25.

문제

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

  • 잘라진 하얀색 색종이와 파란색 색종이의 개수를 구하기

 


주요 아이디어

  • 영역 전체가 같은 색이 아니라면 절반으로 계속 잘라주기 -> 재귀로 구현
  • 파란색 / 하얀색 종이 판단해서 cnt 올리기

 

코드 구현 (Python 3)

더보기

 

import sys
from collections import Counter
sys.setrecursionlimit(10**5)

result = []

# 색종이의 color 판단
def check_color(paper):
    total = sum(sum(paper, []))
    if total == len(paper) * len(paper[0]):
        return 'B'
    elif total == 0:
        return 'W'
    else:
        return None
    

def recursive_cut(paper):
    global result
    paper_color = check_color(paper)

    # 4분할 하기
    if paper_color == None:
        r_mid = len(paper) // 2
        c_mid = len(paper[0])//2

        # 좌상단
        recursive_cut([row[:c_mid] for row in paper[:r_mid]])
        # 우상단
        recursive_cut([row[c_mid:] for row in paper[:r_mid]])
        # 좌하단
        recursive_cut([row[:c_mid] for row in paper[r_mid:]])
        # 우하단
        recursive_cut([row[c_mid:] for row in paper[r_mid:]])

    # 분할된 경우
    else:
        result.append(paper_color)

N = int(input())
paper = [[int(i) for i in sys.stdin.readline().split()] for r in range(N)]
recursive_cut(paper)
counter = Counter(result)
print(counter['W'])
print(counter['B'])

 

 


 

제출 결과

 

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 16954. 움직이는 미로 탈출  (0) 2024.06.25
[BOJ] 3190. 뱀  (0) 2024.06.25
[BOJ] 15686. 치킨 배달  (0) 2024.06.25
[BOJ] 15683. 감시  (1) 2024.05.21
[BOJ] 13414. 수강신청  (0) 2024.05.21