https://www.acmicpc.net/problem/10992
문제가 쉬운듯하면서도 어렵게 느껴졌다. 규칙을 몇 가지는 찾았지만 만들어내야 하는 방법을 생각하지 못했다. 그래서 외부의 도움을 조금 받았다.
N = int(input())
for i in range(1, N + 1):
if (i == 1 or i == N):
print(' ' * (N - i) + '*' * (2 * i - 1))
else:
print(' ' * (N - i) + '*' + ' ' * (2 * (i - 1) - 1) + '*')
코드는 이러한 형태로 작성했다.
*
* *
* *
* *
*********
이러한 형태를 만들어야한다고 생각했을 때, 어떻게 해야할지 규칙부터 찾아보았다. 반복문의 시작을 어떻게 할 것인지에 따라 차이가 조금 생길수도 있는 것을 확인했다. 나는 1부터 5라는 인덱스 값을 반복해서 사용할 것이라고 하면 2 * 1 - 1, 2 * 5 - 1을 하면 상단과 하단의 *의 갯수가 되는 것을 볼 수 있다.
또한 기존까지 별 찍기 문제를 해왔기에 공백에 대한 부분도 처리할 수 있다. ' ' * (입력받은 수 - 인덱스)를 하면 각 행마다의 공백을 기입할 수 있다.
문제는 상단과 하단을 제외한 로직이다. 내가 정했던 인덱스 상으로는 2부터 4까지에 해당하는 인덱스이다. 2일 때는 가운데 공백 1개, 3일 때는 3개, 4일 때는 5개를 만들어주어야했는데 1, 3, 5라는 홀수의 규칙적인 숫자로 증가하는 것을 확인했지만 만들지는 못했다. 2 * ((해당 인덱스) - 1) - 1을 하면 가운데 공백을 만들 수 있는 걸 다른 블로그를 통해 확인했다.
코드로써 저걸 정리해 풀어나가면 맨 위의 코드로 적을 수 있을 것이다.
n=int(input())
print(' '*(n-1)+"*")
for i in range(n-2):
print(' '*(n-2-i), "*", ' '*(2*i+1), "*", sep='')
if n>1:
print("*"*(2*n-1))
정답으로 인정된 후에 랭커의 풀이법을 찾아보았다. 마찬가지로 상단과 하단은 먼저 구해주고 그 나머지 것들을 반복문 처리한 것을 알 수 있었다. 이 사람은 인덱스를 0부터 정했다. 0일 때는 1, 1일 때는 3, 2일 때는 5를 만드는 로직이다. 2 * (해당 인덱스) + 1을 하면 되는데 오히려 이 방법이 반복되는 규칙을 쉽게 찾을 수 있지 않을까라는 생각을 했다. 또 하나의 풀이 방법을 터득할 수 있었다.
'ps > boj' 카테고리의 다른 글
11726번 Python (0) | 2024.08.18 |
---|---|
1463번 Python (0) | 2024.08.18 |
10991번 Python (0) | 2024.04.23 |
2446번 Python (0) | 2024.04.22 |
8393번 Python (0) | 2024.04.06 |