Skip to main content

Command Palette

Search for a command to run...

[boj] 2447 별찍기-10

Updated
2 min read

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

문제 접근

이전에 풀어보려고 시도했던 문제로 일단 그림을 그려보면서 규칙을 찾기 위해서 노력했다. 아래 그림처럼 일단 별을 많이 그려보고 3X3의 패턴을 기본단위로 생각하기로 했다.

좌표로 나타냈을 때 1,1만 비우면 3X3의 패턴을 만들 수 있고, 9X9패턴도 3X3으로 이루어진 3X3 패턴으로 생각했을 때 마찬가지로 1,1에 해당하는 좌표를 비우면 만들 수 있음을 확인했다.

첫 번째, 두 번째 시도

접근에서 고민했던 내용들을 어떻게 식으로 표현할까를 고민했다. 다음과 같이 좌표를 (i, j)로 표현했을 때 3으로 나눈 나머지 중 하나가 1일 때 비우기로 했다.

또 9 이상의 패턴일 때 가운대를 비워주기 위하여 3으로 나눈 후에 3으로 나눴을 때 나머지가 1인 경우에 빈 칸을 출력하도록 바꾸어서 아래와 같은 코드를 만들었다.

def solve(i, j):
    if i % 3 == 1 and j % 3 == 1:
        print(" ", end="")
    elif (i//3) % 3 == 1 or (j//3) % 3 == 1:
        print(" ", end="")
    else:
        print("*", end="")

N = int(input())
for i in range(N):
    for j in range(N):
        solve(N, i, j, 1)
    print()

하지만 27 이상 부터는 제대로 작동을 하지 않아서 무엇이 문제인지 분석을 해보았다.

세 번째 시도

결국에는 인터넷 검색을 몇 번 해보니까 이 문제와 같이 같은 모양이 반복되는 구조를 프렉탈구조라 말하며 이런 문양의 경우에는 재귀함수로 쉽게 구현을 할 수 있다고 한다. (생각해보니 파이썬 처음 배울 때 Turtle 패키지로 비슷한 문양을 만들었던 기억이 났다.) 이 점을 착안해서 지금 구현한 내용을 재귀함수 형식으로 바꿔보았다.

Turtle로 프랙탈 구조를 만들었던 경험을 바탕으로 생각해보면 도형의 길이를 scale로 표현하여 scale을 점점 키워나가는 형태로 접근하여 아래와 같은 코드를 작성했다.

def solve(N, i, j, scale):
    if (i//scale) % 3 == 1 and (j//scale) % 3 == 1:
        print(" ", end="")
    elif N == scale:
        print("*", end="")
    else:
        solve(N, i, j, scale * 3)


N = int(input())
for i in range(N):
    for j in range(N):
        solve(N, i, j, 1)
    print()

결과는 Python3로 채점했을 때는 Timeout이 나왔지만 PyPy3로 채점 시 성공을 할 수 있었다. 그런데 PyPy3로 채점했을 때만 성공한다는 것은 뭔가 최적화를 더 할 수 있다는 뜻이 아닐까 싶은데.. 아직은 내공이 부족해서 그런지 어떤 점을 고쳐야할지 잘 모르겠다. 이후에 푼 문제들을 쭉 리뷰하면서 다시 한 번 살펴보면 좋을 것 같다.

More from this blog

오픈소스 기여모임 10기 후기 - 첫 Pr을 올리기까지

개발자라면 누구나 한 번쯤 오픈소스 기여에 대한 환상을 가져본 적 있을 거다. 하지만 막상 시작하려면 어디서부터 해야 할지 막막하고, 괜히 대단한 걸 해야 할 것 같은 부담감에 선뜻 시작하기는 어려운 것 같다. 나 또한 해보고 싶다는 마음만 가지고 계속 미뤄왔다. 그러다 2025년 말 쯤에 오픈채팅방과 글또 슬랙 채널에서 "오픈소스 기여모임" 10기 모집글을 봤다. 2년 넘게 500명 이상의 참가자와 함께 1000개 이상의 PR을 만들어온 커뮤...

Feb 5, 20265 min read

😢 글또 10기 활동 회고 — “글또야, 가지 마…”

들어가며 드디어 글또 10기 활동 회고를 정리해본다.6개월간의 여정을 뒤돌아보니 정말 많은 일들이 있었다. 글또라는 커뮤니티를 8기가 한창 진행되고 있을 때 알았는데 이름부터 인상이 강렬했다. "글쓰는 또라이가 세상을 바꾼다." 유쾌하고 독특한 문구에 피식 웃으며, '여긴 도대체 어떤 사람들이 모이는 곳이지?' 하고 넘겼었다. 재밌는 건 결국, 나도 그 "또라이들" 중 한 명이 되었다는 것이다. 😌 글또는 개발자들이 2주에 한 번 글을 ...

Jul 31, 20255 min read
😢 글또 10기 활동 회고 — “글또야, 가지 마…”

Serverless 환경에서 배포 전 환경변수 검증 자동화하기: TypeBox와 Bitbucket Pipeline 활용기

들어가며 배포 직후, 환경변수가 제대로 설정되지 않아 여러 API가 제대로 작동하지 않는 일이 있었습니다. 다행히 밤에 사용자가 없을 때 문제가 있었던 거라 영향도는 크지 않았지만 앞으로도 계속해서 발생할 수 있는 문제이기 때문에 해결해야 겠다고 생각했습니다. 개발 단계에서 문제가 발견되면 가장 좋겠지만, 현재 팀 상황에서는 백엔드 개발을 혼자 담당하고 있어 코드 리뷰나 검증 프로세스를 갖추기가 쉽지 않았습니다. 그래서 최소한 배포 전에 자동으...

Mar 16, 20254 min read

Cloudflare Tunnel로 포트포워딩 없이 홈서버 운영하기

이 글에서 다루는 내용 포트포워딩이 안 되는 이유 (CGNAT 환경 이해) CGNAT 우회 방법들의 장단점 비교 Cloudflare Tunnel 설정 방법 (MacOS 기준) 외부에서 내 PC로 접근할 수 있도록 허용하는 방법을 생각하면 포트포워딩이 가장 먼저 떠오릅니다. 공유기에서 특정 포트를 열어 외부에서 서버에 접속할 수 있도록 설정하는 방식으로, 마인크래프트 멀티를 해보셨던 분이라면 분명 해보셨을 방법입니다. 😊 작년에 저는 홈서...

Mar 2, 20256 min read
Cloudflare Tunnel로 포트포워딩 없이 홈서버 운영하기

구름고래 공방

48 posts