본문 바로가기

코딩테스트

[백준] 2444번: 별 찍기 - 7 (브론즈3, Python, for문 한번 사용)

반응형

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

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

 

문제 해결 아이디어

1. 내 구현 코드를 여러번 확인해가면서 문제를 풀었음.

2. for문 한번에 해결할 수 있지 않을까 라는 물음에서 규칙성을 찾기 위해 노력함.

3. ans라는 문자열 변수를 선언하여 공백과 별을 추가한 후 출력

4. n이 주어졌을 때, 출력되는 행의 수는 2n-1임. (5를 입력하면 9줄이 출력돼야함.)

5. n번째 행을 기점으로 별의 수는 감소. 공백은 증가

6. n을 기준으로 n보다 작거나 같을 때의 규칙, n보다 클때의 규칙을 고민해봄.

7. n=5를 예시로 규칙 찾아보기

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
회차 (n=5) 공백
1 4 (5-1) 1 (2x1 -1)
2 3 (5-2) 3 (2x2 -1)
3 2 (5-3) 5 (3x2 -1)
4 1 (5-4) 7 (4x2 -1)
5 0 (5-5) 9 (5x2 -1)
6 1 (6-5) 7 (2x(2x5-6)-1)
7 2 (7-5) 5 (2x(2x5-7)-1)
8 3 (8-5) 3 (2x(2x5-8)-1)
9 4 (9-5) 1 (2x(2x5-9)-1)

 

요상한 식이 세워졌다..

이 식이 나오게 된 이유는 시행착오 단계에서 n보다 클때 2n-i을 별에 곱했을 때 다음과 같은 결과가 나왔다.

    *
   ***
  *****
 *******
*********
 ****
  ***
   **
    *

2n-i의 2배에서 1을 빼면 되지 않을까 라고 생각하여 다음과 같은 소스코드를 작성하였다.

 

소스코드 (Python)

def stars(n):
    
    for i in range(1, 2*n):
        ans = ''
        if i <= n:
            ans += (n-i)*' '+'*'*(2*i-1)
        else:
            ans += (i-n)*' '+'*'*(4*n-2*i-1)
        print(ans)
        
if __name__ == '__main__':
    stars(int(input()))

for문 한번에 별을 찍을 수 있게 되었음. ㅎㅎ

 

 

결과

굿굿

반응형