문제 링크
https://www.acmicpc.net/problem/2448
풀이
def top(x):
blank = " " * ((len(x[0]) + 1) // 2)
return [blank + i + blank for i in x]
def bottom(x):
return [i + " " + i for i in x]
def star(n):
if n == 3:
return [" * ", " * * ", "*****"]
n //= 2
x = star(n)
return top(x) + bottom(x)
for i in star(int(input())): print(i)
k가 1이상일 때의 모양을 윗 부분과 아랫 부분으로 나누면, 윗 부분은 (k-1)일 때의 모양에 양 옆으로 공백(k-1일 때 길이 +1을 2로 나눈 만큼)이 붙은 모양이고, 아랫 부분은 한 칸의 공백을 두고 (k-1)일 때의 모양이 두 개가 나란히 나열된 모양이다.
재귀함수를 통해 k=0일 때의 모양을 한 층씩 리스트에 담고, k>= 1일 때 이 리스트를 계속 늘려가며 모양을 저장하여 출력하도록 하였다.
※ 마지막 줄을 print('\n'.join(star(int(input()))))로 변경하면 잘 되다가 n=96일 때 제대로 출력이 되지 않습니다ㅜㅜ 이유를 전혀 모르겠네요... 아시는 분은 꼭 댓글 부탁드립니다!!
2021/12/13 풀이
import sys
N = int(sys.stdin.readline())
def top(x):
blank = " " * ((len(x[0]) + 1) // 2)
return [blank + i + blank for i in x]
def bottom(x):
return [i + " " + i for i in x]
def star(n):
if n == 3:
return [" * ", " * * ", "*****"]
n //= 2
x = star(n)
return top(x) + bottom(x)
print('\n'.join(star(N)))
sys.stdin.readline()을 쓰니까 위에서 말한 현상이 해결되었다. print를 여러 번 사용하면 속도가 느려지기 때문에 이 방법으로 속도가 두 배 이상 향상시켰다.
'연습장 > 백준(BOJ) 문제풀이' 카테고리의 다른 글
[백준 10994] 별 찍기 - 19 with Python (0) | 2021.07.06 |
---|---|
[백준 6603] 로또 with Python (0) | 2021.07.06 |
[백준 2630] 색종이 만들기 with Node.js (0) | 2021.06.04 |
[백준 1004] 어린 왕자 with Node.js (0) | 2021.05.29 |
[백준 11053] 가장 긴 증가하는 부분 수열 with Python (0) | 2021.05.29 |