IT 공부/코딩테스트

[백준 2445번] 별 찍기 - 8 - 파이썬

unnimm 2023. 7. 29. 16:02

해설

처음 문제에 접근했을 때

일단 반을 짤라서 접근하고 나머지는 뒤집으면 되겠다. 싶었다.

*

**

***

****

*****

이 문제를 응용해서 풀면 될 것 같다는 생각을 했다.

이 코드는

n = int(input())

for i in range(1, n+1):
    for j in range(0, i):
        print('*', end="")
    print()

이런식으로 문제를 풀면 된다.

근데, 지금 문제는 중간 빈칸이 있고 양 끝에 별이 찍히는 것이니까

매 반복마다 띄어쓰기를 어떻게 찍지? 생각했다.

그럼 띄어쓰기는 어떤 반복이 있지? 생각하니

8->6->4->2->0 이렇게 찍히는 걸 파악했고,

양 끝에 찍히는 *은 첫줄부터 1,2,3,4,5이런식으로 찍히되, 양쪽에 다 찍혀야한다는 걸 알았다.

그럼 일단 반복문을 쓸테고

 

그러면

n=5를 대입하면

띄어쓰기 먼저 보면

i=1일 때, 띄어쓰기는 4 * '  '

i=2일 때, 띄어쓰기는 3 * '  '

i=3일 때, 띄어쓰기는 2 * '  '

i=4일 때, 띄어쓰기는 1 * '  '

n과 i의 관계를 보았을 때, (n-i) * '  '

 

이걸 별 사이에 넣는 함수가 없을까 구글 검색을 해보니

sep 함수가 있었고

이 함수는 문자열과 문자열 사이에 어떤 것을 넣어주는 함수이었다. 

그래서

print('*'*i, '*'*i, sep='  ' * (n-i), end='')

별을 보면

i = 1일때, *은 양쪽으로부터 1개씩

i = 2일때, *은 양쪽으로부터 2개씩

i = 3일때, *은 양쪽으로부터 3개씩

i = 4일때, *은 양쪽으로부터 4개씩

 

이니까 i와 *의 규칙을 생각해봤을 때

i*'*'이 된다는 것을 확인

print('*'*i, '*'*i, sep='  ' * (n-i), end='')

 

밑은 그냥, i=1,2,3,4,5... 이것을

i=5,4,3,2,1... 이렇게 꺼꿀로 돌려주면 됨.

코드

n = int(input())
for i in range(1, n+1):
    print('*'*i, '*'*i, sep=' '*(n-i), end='')
    print()
for j in range(n-1, 0, -1):
    print('*'*j, '*'*j, sep=' ' * (n-j), end='')
    print()

결과

다른 풀이

n = int(input())
for i in range(1, n):
    print('*'*i + ' '*2*(n-i) + '*'*i)
for i in range(n, 0, -1):
    print('*'*i + ' '*2*(n-i) + '*'*i)

그냥 +로 엮을 수도 있네..ㅎ