백준 - 10994 별찍기 19 (python)

손성수·2023년 3월 25일
0

알고리즘

목록 보기
6/10

문제

  • 예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

  • 첫째 줄에 n(1<= n <= 100) 이 주어진다.

출력 예제



직접 풀어보시고 아래의 글을 읽어주세요.
글쓴이보다 더 좋은 풀이와 코드가 있을 수 있습니다.


상단

n = 1 일땐 별이 하나만 찍히고,
n 값이 늘어갈때마다 일정한 규칙을 따라 값이 증가하고 있다.
다음과 같은 식으로 접근할 수 있다.

(nx2)-1

(1x2) -1 = 1
(2x2) -1 = 3
(3x2) -1 = 5
(4x2) -1 = 7


다음과 같은 코드를 작성하면

n=4
for i in range((n*2)-1) : 별 출력 !!

n을 4로 가정하고, 반복자 i의 값이 0부터 시작해서 6까지, 총 7회 반복한다.

노란색 글씨로 쓰여진 순서대로, 위에서 아래로
반복자 i의 값이 증가하게 된다.
반복자 i의 값에 따라 다음과 같은 규칙을 알 수 있다.

왼쪽,오른쪽 벽에 그려진 별과 공백을 포함하지 않고서 규칙성을 찾았는데,
이것은 잠시 뒤로 밀어두고, 박스안에 별과 공백이 있는지만 확인해보자.

반복자 i의 값을 토대로
i%2 로 계산하여 홀수, 짝수를 판단하여
i%2 = 0 이라면 별을 출력하고
i%2 = 1 이라면 공백을 출력한다.


두 그림을 합치면, 이러한 역 피라미드꼴로 점점 좁아지고 있는것을 확인할 수 있다.
가장 처음 높이를 구한 (nx2)-1의 식을 다시 떠올려보자

def print_star(x,y):
	 ㅡ 이 라인에 왼쪽 벽을 그리는 어떠한 코드가 있다고 가정합니다.#아래는 중앙 별과, 공백을 출력하는 코드입니다.
	for i in range(y+y-1):
    	pirnt("*" if x%2==0 else " ")
        
    ㅡ 이 라인에 오른쪽 벽을 그리는 어떠한 코드가 있다고 가정합니다. ㅡ
    
n=4
for i in range((n*2)-1) : print_star(n-i,i)

다음의 코드에서 매개변수로 전달되는 값은 다음과 같습니다.

xyy+y-1x%2
07130
16111
2590
3471
4350
5231
6110

def print_star(x,y):
    star = 0
    for i in range(x):
        star = 1 - star
       	pirnt("*" if star else " ",end='')
    for i in range(x):
        star = 1 - star
        print(" " if star else "*",end=' ')
  • x = n-i

  • x = 0
    실행 없음

  • x = 1

첫 번째 for문

i = 0 : star = 1 - 0 , 출력 : *

두 번째 for문

i = 0 : star = 1-1 , 출력 : *

star 값을 이용하여 삼항 연산자를 사용하지만
위의 for문과 아래 for문의 차이점은,
참일때 별을 출력하고, 거짓일때 공백을 출력하고 있다.



최종 코드

def print_star(x,y):
    s = ""
    star = 0
    for i in range(x):
        star = 1 - star
        s += "*" if star else " "
    for i in range(y+y-1):
        s += "*" if x%2==0 else " "
    for i in range(x):
        star = 1 - star
        s += " " if star else "*"
    s += "\n"
    return s

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

print 함수를 자주 사용하게 된다면 코드의 효율성이 떨어지기에
문자열에 담아두고, 마지막 결괏값을 출력하는 코드를 작성했다.

하단부의 for문 i 반복자의 초기값이 2로 설정하여,
하단부는 세로 중앙열 에서 시작하는것이 아닌
세로 중앙열 한칸 밑에서부터 출력값을 잡는다.

profile
더 노력하겠습니다

0개의 댓글

관련 채용 정보