문제
N과 시작 숫자 S가 주어지면 숫자 피라미드를 만드는 프로그램을 작성하시오. 예를 들어, N이 5이고 S가 3 이라면, 그 숫자 피라미드는 다음과 같다.
1
2
3
4
5
3
456
21987
3456789
987654321
- 시작 숫자 S는 꼭대기부터 1씩 증가한다.
- 시작 행의 번호가 1번이라고 했을때, 짝수번째 행은 왼쪽에서 오른쪽으로 1씩 증가하도록 적고, 홀수번째 행은 거꾸로 적는다.
- 숫자가 만약 10이 될 경우, 1로 바꾸고 다시 증가한다.
입력
입력의 첫 번째 줄에 N과 시작 숫자 S가 주어진다. ( 1≤N≤100, 1 ≤S≤ 9)
출력
첫 번째 줄부터 숫자 피라미드를 출력한다.
(각 줄에 존재하는 공백의 개수와 숫자의 개수를 정확하게 확인해주시바랍니다.)
아이디어
이 문제는 그렇게 쉽게 풀리지 않았다……
아래는 n = 5, s = 3일 경우 결과값이다.
1
2
3
4
5
3
456
21987
3456789
987654321
이 문제를 풀기 전에 생각해야 되는 경우가 몇 가지 있다.
- 홀수 번 째 줄에 있는 숫자는 감소한다.
- 짝수 번 째 줄에 있는 숫자는 증가한다.
- 각 줄에 첫 번째 숫자는 어떻게 구해야 될까?
- 짝수 줄의 첫 번째 숫자는 전 줄 첫 번째 숫자 + 1 이다.
- 홀수 줄의 첫 번째 숫자는 전 줄 마지막 숫자에서 다음 줄의 숫자 개수만큼 플러스하면 된다.
- 여기서 중요한 점이 있다. 위의 예시에서 세 번째 줄의 첫 번째 숫자를 구한다고 가정해 보자.
- 각 줄에서 규칙을 찾으면 각 줄의 숫자 개수는 1, 3, 5, 7……으로 증가하고 있다.
- 여기서 세 번째 줄의 첫 번째 숫자를 구하면
6(2번째 줄에 마지막 숫자) + 5(세 번째 줄에 숫자 개수)가 아니다.
6 에서 1씩 앞으로 가야 된다. 6+1=7, 7+1=8, 8+1=9, 9+1=10이 아니라 1이다. 1+1=2
따라서 세 번째 줄의 첫 번째 숫자는 1이다.
- 짝수 줄의 첫 번째 숫자는 전 줄 첫 번째 숫자 + 1 이다.
이 방법들을 생각하면서 천천히 코드를 작성해 봤다.
이 문제는 어려워서 반복해서 다시 봐야 될 문제이다.
코드
풀이보기(클릭)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
n, s = map(int, input().split())
space = n - 1
num = 1
firstNum = 0
endNum = 0
for i in range(1,n+1): # 숫자 출력 하기 전 공백 출력
for j in range(space):
print(' ',end="")
if i % 2 == 0: #짝수 일 경우
firstNum += 1
if firstNum == 10:
firstNum = 1
for k in range(num):
print(firstNum ,end="")
firstNum += 1
if firstNum == 10:
firstNum = 1
else: #홀수 일 경우
if i == 1: # 첫 번째 줄의 숫자는 무조건 s가 출력 된다.
print(s, end="")
firstNum = s
else:
endNum = firstNum
for p in range(num-1):
if endNum >= 10:
endNum = 1
endNum += 1
if endNum == 10:
endNum = 1
firstNum = endNum
for z in range(num):
print(endNum,end="")
endNum -= 1
if endNum == 0:
endNum = 9
num += 2
space -= 1
print()
문제 출처
ALGORITHM JOBS