알고리즘 문제 풀이의 첫 번째 단계는 아마 모두 입출력 문제로 시작할 것이다.
그 중 조금 까다로워지는 부분이 "별 찍기 문제"이다.
출력 별 모습을 보여주고 해당하는 코드를 짜는 부분은 사실 조금 까다로울 뿐이지 어렵지는 않다.
그래도 이러한 문제를 풀 때마다 일관성을 유지하는 것이 좋을 것 같아서 나만의 별 찍기 문제 풀이 방법을 만들어보려고 한다.
일단 별 찍기 문제에 사용되는 기본적인 파이썬 문법을 정리해보려 한다.
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의 범위만 바꾸도록 한다.
'백준 알고리즘 > dp' 카테고리의 다른 글
[백준 1699][파이썬] 제곱수의 합 (0) | 2023.01.14 |
---|---|
[백준 1912][파이썬] 연속 합 (0) | 2023.01.13 |
[백준 11055, 11722, 11054][파이썬] 증가, 감소하는 수열 dp 문제 (0) | 2023.01.11 |
[백준][파이썬] 쉬운 계단 수 10844 (0) | 2023.01.09 |
[백준][파이썬] 알고리즘 문제 풀이 용 파이썬 문법 (업데이트 중) (0) | 2023.01.08 |
댓글