본문 바로가기
I am a developer

백준 / Python / 2444 / 별 찍기 - 7 / 문제풀이

by Echinacea 2023. 5. 18.
반응형

 

문제 설명

 

 

 

 

문제의 포인트

  • 별 찍기는 세상 간단하게 생겼지만 어쩌면 능력을 제대로 시험하는 거름망 같은 역할을 하고 있을지도 모른다
  • 공백을 일부러 만들어야 하니, 원치 않은 공백이 생기는 것에 주의해야 한다.
  • 문제에 나온 조건(2*N-1)을 풀이에 정확히 포함해서 풀어야 한다.

 

 

 

문제 풀이 방법

 

 

별 찍기는 잘 모르겠으면 노가다로 푸는게 제일 쉽고 정확하다.




  1. 문제에서 첫 줄에 정수를 입력받으라고 했으니, 첫 줄에 정수를 입력받아준다.
N = int(input())

 

 

 

2. 별 찍기는 보통 [상단 부분]과 [하단 부분]으로 이루어져있으니, 당연히 상단 부분 하단 부분을 나눠서 출력해야 한다.

 

 

3. 그러니 먼저 상단 부분을 출력하기 위해 for문을 만들어준다. 이 때, 문제에서 요구한 조건을 확인하고 코드에 넣어줘야 한다.

 

 

4. 3에 따라 일단 출력해보자.(노가다 시작)

N = int(input())
for i in range(N):
    print((2*N-1)*"*")

-----------------------console---------------------------
4
*******
*******
*******
*******

 

 

5. 이제부터 원하는 상단 모양이 나올 때까지 약간씩 수정하며 결과값을 보면 된다. 이미 입력해서 변하지 않는 수인 N이 아닌 i를 대신 넣어서 결과를 보자

for i in range(N):
    print((2*i-1)*"*")

-----------------------console---------------------------
4

*
***
*****

뭔가 슬슬 모양이 나온다

 

 

 

6. i가 0부터 시작하니 첫 줄에 공백이 생긴 것 같다. i를 강제로 1부터 시작하게 만들어보자.

for i in range(1,N+1):
    print((2*i-1)*"*")

-----------------------console---------------------------
4
*
***
*****
*******

공백 없이 첫 줄부터 깔끔하게 잘 나온다.

 

 

 

7. 별 모양은 순서대로 잘 나왔으니 이제 공백 차례. 공백은 첫 줄에 대략 N개부터 시작해 조금씩 줄어드는 형태가 되어야 하니 큰 숫자인 N에서 점점 늘어나는 숫자인 i를 빼준다. N-i 를 입력하라는 말.

for i in range(1,N+1):
    print((N-i)*" ",(2*i-1)*"*")

-----------------------console---------------------------
4
    *
   ***
  *****
 *******

뭔가 예쁘게 나왔다. 하지만 이 때 속으면 안 된다. 공백은 눈에 보이지 않기 때문에 내가 원하는 만큼, 그러니까 몰래 숨어들어온 공백이 없는지 점검을 해 보아야 한다. 이럴 땐 공백 자리에 1을 넣어서 테스트해보면 된다.

 

 

 

8. 바로 이렇게 말이다. 그러면 내가 입력한 공백 외의 숨은 공백을 찾아낼 수 있다. 이런 경우 절대로 정답으로 인정이 될 수 없으니 주의해야 한다.

for i in range(1,N+1):
    print((N-i)*"1",(2*i-1)*"*")

-----------------------console---------------------------
4
111 *
11 ***
1 *****
 *******

공백을 입력해야 하는 경우 이러한 검증 과정은 반드시 지키는 것이 좋다.

 

 

 

9. 8번에서 생긴 함정 공백들을 제거해보자.

for i in range(1,N+1):
    print((N-i)*"1"+(2*i-1)*"*")

-----------------------console---------------------------
4
111*
11***
1*****
*******

드디어 공백으로 들어갈 자리와 별 모양이 딱 붙었다. 8번과 다른 점은 print 문에서 ‘ , ‘ 대신 ‘+’ 기호를 사용했다는 점이다.

 

 

 

 

10. 이제 1을 넣었던 부분을 공백으로 바꿔주기만 하면 문제에서 요구한 별찍기의 상단 부분이 완성된다.

#상단부분 완성
for i in range(1,N+1):
    print((N-i)*" "+(2*i-1)*"*")

-----------------------console---------------------------
4
   *
  ***
 *****
*******

 

 

 

11. 이제 하단 부분을 만들 차례다. 상단 부분을 처음 만들었던 것처럼 별모양부터 찍되, 아까처럼 문제가 요구하는 2*N-1 을 꼭 이용하도록 하자. 6번에서 별 갯수를 맞췄으니 하단 부분의 print문도 같은 내용으로 맞춘 뒤, for문만 수정한다.

for i in range(N, 0, -1):
    print((2*i-1)*"*")

-----------------------console---------------------------
4 
*******
*****
***
*

(N, 0, -1) << N부터 0-1까지, 값은 -1가 되어야 한다. N이 5이면 [5,4,3,2,1] 순서로 된다. (파이썬 배열 참고)

 

 

 

 

12. 별 모양은 예쁘게 나왔지만 상단도 4줄, 하단도 4줄이면 문제가 요구하는 출력값을 만족하지 못한다. 상단이 4줄이면 하단은 3줄이 되어야 하므로, for문의 시작값을 수정한다.

for i in range(N-1, 0, -1):
    print((2*i-1)*"*")

-----------------------console---------------------------
4
*****
***
*

 

 

13. 하단의 공백 부분을 채울 차례다. 일단 무지성으로 아무거나 넣어서 출력해보자.

for i in range(N-1, 0, -1):
    print(i*" "+(2*i-1)*"*")

-----------------------console---------------------------
4
   *****
  ***
 *

정말 무지성의 값이 나왔다. 여기서 조금씩 수정해보자.

 

 

 

14. 무지성 출력하기222

for i in range(N-1, 0, -1):
    print((N)*" "+(2*i-1)*"*")

-----------------------console---------------------------
4
    *****
    ***
    *

 

 

 

 

15. 무지성 출력하기333 + a

for i in range(N-1, 0, -1):
    print((i+N)*" "+(2*i-1)*"*")

-----------------------console---------------------------
4
       *****
      ***
     *

for i in range(N-1, 0, -1):
    print((i)*" "+(2*i-1)*"*")
-----------------------console---------------------------
4
   *****
  ***
 *

for i in range(N-1, 0, -1):
    print((N-i)*" "+(2*i-1)*"*")
-----------------------console---------------------------
4
 *****
  ***
   *

 

 

 

 

16. 이것저것 입력하다보면 결과값 비슷한 결과가 출력된다. 이제부턴 공백 체크를 한다.

for i in range(N-1, 0, -1):
    print((N-i)*"1"+(2*i-1)*"*")

-----------------------console---------------------------
4
1*****
11***
111*

결과가 잘 나왔다. 1만 공백으로 바꿔주면 하단도 완성이다.

 

 

 

 

17. 상단+하단 합치기

#상단부분+하단부분
for i in range(1,N+1):
    print((N-i)*" "+(2*i-1)*"*")
for i in range(N-1, 0, -1):
    print((N-i)*" "+(2*i-1)*"*")

-----------------------console---------------------------

4
   *
  ***
 *****
*******
 *****
  ***
   *

완성했다.

 

정답 코드

N = int(input())
#상단부분+하단부분
for i in range(1,N+1):
    print((N-i)*" "+(2*i-1)*"*")
for i in range(N-1, 0, -1):
    print((N-i)*" "+(2*i-1)*"*")
반응형

댓글