미소를뿌리는감자의 코딩

[백준 2024/03/28] 2630번 색종이 만들기 본문

코딩 테스트/백준

[백준 2024/03/28] 2630번 색종이 만들기

미뿌감 2024. 3. 28. 16:37
728x90

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

 

2630번: 색종이 만들기

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

www.acmicpc.net

 

1. 접근 방법

2중 리스트로 값을 저장하고, 해당 리스트 합을 구한다. 즉, 종이에 적혀 있는 수들의 합을 구한다.

만약 그 수가 length**2 혹은 0 이 아니면, 종이가 파란색만 혹은 하얀색만 가지고 있는 것이 아니게 되어버릴 것이기 때문에 잘라줘야 한다.

 

이후, 다시 재귀적으로 종이를 4등분 한 후, 각각의 정사각형을 함수에 넣는다.

이후 해당 종이의 sum이 length**2 혹은 0 이 아니면 다시 4등분을 시켜주었다.

 

색의 값을 저장하는 변수를 전역 변수로 선언하여 값을 계산하였다.

이에 대해서 성공을 했지만, 전역 변수를 사용했다는 점이 조금 걸렸다.

 

따라서 지피티에게 코드를 구성해줄 것을 요청하였다.

재귀적으로 구성하는 것이 깊이 다가오지 않는 것 같다. 

이에 대해서 더 노력해야할 것 같다.

 

2. 코드

- 전역 변수 - 

def origami(square):
    global white
    global blue
    l = len(square)
    total = sum(sum(row) for row in square)
    if total == l ** 2:
        blue += 1
        return
    if total == 0:
        white += 1
        return
    origami([row[:l // 2] for row in square[:l // 2]])
    origami([row[l // 2:] for row in square[:l // 2]])
    origami([row[:l // 2] for row in square[l // 2:]])
    origami([row[l // 2:] for row in square[l // 2:]])

    return (white, blue)


white = 0
blue = 0
nums = []
for i in range(int(input())):
    lines = list(map(int, input().split()))
    nums.append(lines)

origami(nums)
print(white)
print(blue)

 

- 전역 변수 x - 

def origami(square):
    l = len(square)
    total = sum(sum(row) for row in square)
    
    # 전체 칸이 모두 파란색인 경우
    if total == l ** 2:
        return (0, 1)
    
    # 전체 칸이 모두 하얀색인 경우
    if total == 0:
        return (1, 0)
    
    # 사각형을 4분할하여 재귀적으로 탐색
    top_left = origami([row[:l // 2] for row in square[:l // 2]])
    top_right = origami([row[l // 2:] for row in square[:l // 2]])
    bottom_left = origami([row[:l // 2] for row in square[l // 2:]])
    bottom_right = origami([row[l // 2:] for row in square[l // 2:]])
    
    # 반환된 결과 합치기
    white = top_left[0] + top_right[0] + bottom_left[0] + bottom_right[0]
    blue = top_left[1] + top_right[1] + bottom_left[1] + bottom_right[1]
    
    return (white, blue)

# 입력 부분은 이전과 동일하게 처리
nums = []
for i in range(int(input())):
    lines = list(map(int, input().split()))
    nums.append(lines)

result = origami(nums)
print(result[0])  # 하얀색 부분의 수
print(result[1])  # 파란색 부분의 수
728x90