본문 바로가기
백준 알고리즘/dp

[백준][파이썬] 기초 별 찍기 문제 유형 팁

by 웅대 2023. 1. 7.
728x90
반응형

알고리즘 문제 풀이의 첫 번째 단계는 아마 모두 입출력 문제로 시작할 것이다.

 

그 중 조금 까다로워지는 부분이 "별 찍기 문제"이다.

 

출력 별 모습을 보여주고 해당하는 코드를 짜는 부분은 사실 조금 까다로울 뿐이지 어렵지는 않다.

 

그래도 이러한 문제를 풀 때마다 일관성을 유지하는 것이 좋을 것 같아서 나만의 별 찍기 문제 풀이 방법을 만들어보려고 한다.

 

일단 별 찍기 문제에 사용되는 기본적인 파이썬 문법을 정리해보려 한다.

 

1. 문자열 곱셈, 덧셈

 

파이썬에서는 문자열과 정수의 곱셈과 문자열끼리의 덧셈이 가능하다.

 

문자열과 정수의 곱셈은 정수의 개수만큼 문자열이 늘어난다.

star = "*"
print(star*5)

출력

*****

 

공백 혹은 별을 연속해서 출력할 경우 곱셈을 사용해서 쉽게 구현할 수 있다.

 

2. for문 range

 

별 찍기 문제에서는 반복문을 사용하는데 주로 for문과 range를 사용한다.

 

형태는 아래와 같다.

 

for i in range(5):
    print(i)

출력

0
1
2
3
4

 

보다시피 range안의 숫자가 n이라고 한다면 0부터 n-1까지 i를 증가시키면서 반복문을 실행한다.

 

range 안의 인자 개수에 따라서 역할이 달라진다.

 

인자 1개

    for i in range(n):

i가 0부터 n-1까지 증가

 

인자 2개

    for i in range(n, m):

i가 n부터 m-1까지 증가

 

인자 3개

    for i in range(n, m, k):

k가 양수일 때 : i가 n부터 m-1까지 k만큼 건너뛰면서 증가

k가 음수일 때 : i가 n부터 m+1까지 k만큼 건너뛰면서 감소

 

ex)

for i in range(1,8,2):
    print(i)

출력

1
3
5
7

 

 

 

다음은 백준 2442번 문제이다.

코드는 다음과 같다.

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

 

별 찍기 문제의 경우 공백과 별만 사용하여 출력을 하는데 둘 중 기준을 정하는 것이 중요한 것 같다.

 

나는 2442번 문제에서 별을 기준으로 했다.(물론 공백을 기준으로 해도 된다.)

 

다음은 10992번 문제이다.

첫 줄과 마지막 줄을 제외하고는 일정한 규칙이 존재하기 때문에 첫 줄과 마지막 줄은 따로 출력하는 것이 좋아보인다.

 

n = int(input())
print(" "*(n-1)+"*")
if n!=1:
    for i in range(2,n):
        print(" "*(n-i)+"*"+" "*(2*i-3)+"*")
    print("*"*(2*n-1))

n이 1일 때는 별이 하나만 출력되어야 하는데 첫 줄과 마지막 줄을 따로 출력하도록 구현을 하면 n이 1일 때 별이 두 개 찍히게 된다.

 

그러므로 n이 1이 아닐 때만 그 다음 코드를 수행하도록 짰다.

 

다음은 백준 2446번 문제이다. 

조금 까다롭긴 하지만 시간만 조금 들이면 금방 알고리즘을 생각할 수 있다.

 

이러한 문제는 오름차순(내림차순)으로 한 번, 내림차순(오름차순)으로 한 번 진행한다.

 

나는 일관성을 유지하기 위해서 규칙을 정했는데 그 규칙은 range의 범위만 다르게 하는 것이다.

 

range의 범위만 바꿔서 코드를 짜게 되면 아래와 같다.

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

 

물론 range의 범위를 같게 해도 된다. range의 범위를 같게 한 코드는 아래와 같다.

 

n = int(input())
for i in range(n):
    print(" "*i, end="")
    m = 2*(n-i)-1
    print("*"*m)
for i in range(1, n):
    print(" "*(n-i-1), end="")
    m = 2*i+1
    print("*"*m)

첫 번째 방법은 range의 범위만 바꾸는 것으로 해결이 되었지만 두 번째 방법은 공백과 별의 개수를 바꿔야한다.

 

이를 바탕으로 2445번 문제를 풀어보겠다.

먼저 기준을 정한다. 공백보다는 별을 기준으로 삼는 것이 편할 것 같아서 별을 기준으로 삼는다.

 

일단 별이 오름차순으로 증가하는 구간만 구현해본다.

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

 

이제 별이 내림차순으로 감소하는 구간을 구현하는데 range의 범위만 바꾸어 간단하게 해결한다.

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

 

정리해보자면 다음과 같다.

1. 파이썬의 곱셈, 덧셈을 활용한다.
2. 처음에는 공백과 별 중 어느 것을 기준으로 삼을지 정한다.
3. 오르차순과 내림차순을 연속으로 출력하는 문제의 경우 range의 범위만 바꾸도록 한다.
728x90
반응형

댓글