본문 바로가기
문제 해결/BOJ

[백준] 프렉탈 평면

by 자잘 2023. 4. 27.

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

 

1030번: 프렉탈 평면

첫째 줄에 7개의 정수 s, N, K, R1, R2, C1, C2가 주어진다.

www.acmicpc.net

 

1. 문제 이해

프랙탈 평면은 맨 처음 가장 큰 흰색 정사각형을 시작으로 규칙에 따라 흰색 정사각형과, 검은색 정사각형으로 쪼개지게 됩니다. 문제에서는 커진다고 표현했는데 점점 쪼개진다고 봐도 무방합니다. 한번 검정색인 정사각형은 쪼개져도 정사각형이 되고 흰색 정사각형은 시간에 지남에 따라 쪼개지면서 가운데 K X K 정사각형은 검은색으로 칠해지게 됩니다. 

2. 문제 접근

첫번째 풀이: 분할정복

출력해야하는 직사각형의 크기가 최대 50 * 50 밖에 되지 않기 때문에 하나의 좌표가 흰색인지 검은색인지 판단해주면 됩니다. 현재 사이즈 N * N 등분한 다음 찾고자 하는 좌표가 들어있는 칸이 검정색이면 1을 출력하고 그렇지 않으면 재귀를 통해 다음 사이즈로 넘어가게 됩니다. 

 

검정색 칸인지 판별하는 방법은 사각형의 정중앙에 위치하기  때문에 start + (현재 사이즈 - (k X 다음 사이즈)) // 2 가 되게 됩니다.

3. 풀이

import sys, heapq
from collections import defaultdict

#sys.stdin = open("input.txt")

input = sys.stdin.readline

s, n, k, r1, r2, c1, c2 = tuple(map(int, input().split()))

if s == 0:
    print(0)
    sys.exit(0)

def dq(startY, startX, length, y, x):
    # 기저 조건
    if length == 1:
        return 0

    next_length = length // n

    bStartY, bStartX = startY + (length - (k * next_length)) // 2, startX + (length - (k * next_length)) // 2

    for i in range(startY, startY + length, next_length):
        for j in range(startX, startX + length, next_length):
            # 범위 내에 있는 경우
            if i <= y < i + next_length and j <= x < j + next_length:
                # 검정 영역이면 리턴 1
                if bStartY <= y < bStartY + (k * next_length) and bStartX <= x < bStartX + (k * next_length):
                    return 1

                # 흰 영역이면 dq로 파고 들어간다.
                ret =  dq(i, j, next_length, y, x)
                return ret

for i in range(r1, r2 + 1):
    for j in range(c1, c2 + 1):
        print(dq(0, 0,  n ** s, i, j), end="")
    print()

4. 회고

분할정복을 통해 풀기는 했지만 식을 도출해내는데까지 시간이 조금 걸렸던 문제

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 등산 마니아  (0) 2023.04.30
[백준] 무기공학  (0) 2023.04.29
[백준] 파티  (0) 2023.04.26
[백준] Guess  (0) 2023.04.25
[백준] 비즈 공예  (0) 2023.04.24