알고리즘/백준 문제풀이

[백준] 2630번 : 색종이 만들기 (python 파이썬)

매일_공부 2024. 4. 18. 19:03
반응형

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

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

 

하얀색과 파란색 종이의 개수 출력

 

아주 깔끔한 문제인 거 같다.

 

 

문제를 읽고 직관적으로 바로 이해되는 문제가 나는 가장 좋은 문제라고 생각한다.

 

 

이 문제는 저번에 포스팅했었던 1074번 Z 문제와 흡사하다.

https://mail-study.tistory.com/12

 

[백준] 1074번 : Z (python 파이썬)

https://www.acmicpc.net/problem/1074 1074번: Z 한수는 크기가 2N × 2N인 2차원 배열을 Z모양으로 탐색하려고 한다. 예를 들어, 2×2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문

mail-study.tistory.com

 

 

 

문제를 보면 직관적으로 알 수 있을 것이다.

 

일단 색종이를 확인해서 모든 부분이 1 또는 0인지 확인한다.

 

만약 1과 0이 모두 있다면

 

4등분한다

 

그리고 각각의 부분에서 다시 반복한다.

 

 

이런 단순한 작업의 반복이기 때문에 구현이 간단할 것이다. 

 

 

 

import sys
def l_sum(l):  #리스트의 합 구하는 함수
    ans = 0
    for i in l:
        for j in i:
            ans = ans + j
    return ans

def list_chunk(lst, n):  #리스트를 쪼개 2차로 만드는 기능
    return [lst[i:i+n] for i in range(0, len(lst), n)]

def func(l,n):
    global blue
    global white
    if l_sum(l) == n**2:
        blue = blue+1
        
    elif l_sum(l) == 0:
        white = white+1
        
    else:
        first_l = []
        second_l = []
        third_l = []
        forth_l = []

        for i in range(n):
            for j in range(n):
                if i < n//2 and j < n//2: # 1사분면
                    first_l.append(l[i][j])

                elif i < n//2 and j >= n//2: #2사분면
                    second_l.append(l[i][j])

                elif i >= n//2 and j < n//2: #3사분면
                    third_l.append(l[i][j])
                
                elif i >= n//2 and j >= n//2:#4사분면
                    forth_l.append(l[i][j])
                    
        #일차리스트를 n//2 줄로 나누어야 하기에 함수를 사용한다.
        func(list_chunk(first_l , n//2) , n//2)
        func(list_chunk(second_l , n//2) , n//2)
        func(list_chunk(third_l, n//2) , n//2)
        func(list_chunk(forth_l , n//2) , n//2)



n = int(sys.stdin.readline())

blue =0
white = 0
l = []

for i in range(n):
    l2 = list(map(int, sys.stdin.readline().split(" ")))
    l.append(l2)

func(l,n)
print(white)
print(blue)

 

 

 

 

약간의 팁이라면 

이 문제를 풀기 위해 필요한 기능은 다음과 같다.

 

1. 색종이의 합을 구하는 기능 

2. 색종이를 4등분 하는 기능

 

이 두 부분을 잘 구현해야한다.

 

하지만 나도 그렇듯이 실력이 좋지 않아 구현에 문제가 어려우면 

함수화해서 테스트와 보기에 깔끔하게 정리하는 장점을 챙겨보자!

반응형