[ 백준 / 파이썬 ] 골드 4 - 2448. 별 찍기 - 11

박제현·2024년 3월 3일
0

코딩테스트

목록 보기
68/101

난이도

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제

입력출력
3*
* *
*****

풀이

N 이 3일 때, 삼각형을 그린다.
삼각형은 밑변의 길이가 2 * N, 높이가 N이다.

삼각형은 좌에서 우로 2 * N까지 이동하고, 위에서 아래로 N까지 이동한다.

즉 N 이 6 일때, (0,0) 에서 삼각형을 그리기 시작하고, (0, 3), (0, 6) 을 차례로 그린다.
그리고 y 를 3만큼 움직여 다시 (3, 0), (3, 3), (3, 6) 을 그린다.

이렇게 2차원 배열을 N 등분 하여 모든 경우의 수를 그리게 된다.

여기서 중요한 점은 (n, m) 의 좌표일 때 삼각형을 그려서는 안되는 경우를 잘 체크해야한다.

가장 작은 검사 범위가 6이므로, (3 일때는 그냥 그림) 총 6번의 움직임을 검사해야한다.

N이 6일때
(0, 0) → False, (0, 3) → True, (0, 6) → False
(3, 0) → True, (3, 3) → False, (3, 6) &rarr True

이 그림 처럼 해당 위치에서만 삼각형을 그려야 한다.

그렇다면, 이를 위한 True, False 배열이 필요하고 해당 배열은 N / 3 번 마다 반전 시켜 주면 원하는 삼각형을 그릴 수 있게 된다.

코드

N = int(input())

maps = [[' ' for _ in range(N * 2)] for _ in range(N)]


def patterns(n, x, y, is_blank, maps, status, cnt):
    if is_blank:
        return

    if n == 3:

        for i in range(y, y + 3):
            for j in range(x, x + 5):
                if i == y and j == x + 2:
                    maps[i][j] = '*'
                elif i == y + 1 and (j == x + 1 or j == x + 3):
                    maps[i][j] = '*'
                elif i == y + 2:
                    maps[i][j] = '*'
        return

    if cnt == N // 3:
        for i in range(6):
            status[i] = not status[i]

        cnt = 0

    patterns(n // 2, x, y, status[0], maps, status, cnt + 1)
    patterns(n // 2, x + n // 2, y, status[1], maps, status, cnt + 1)
    patterns(n // 2, x + n, y, status[2], maps, status, cnt + 1)

    patterns(n // 2, x, y + n // 2, status[3], maps, status, cnt + 1)
    patterns(n // 2, x + n // 2, y + n // 2, status[4], maps, status, cnt + 1)
    patterns(n // 2, x + n, y + n // 2, status[5], maps, status, cnt + 1)


patterns(N, 0, 0, False, maps, [True, False, True, False, True, False], 0)

for _ in maps:
    print(''.join(_))

profile
닷넷 새싹

0개의 댓글