728x90
반응형
1. 문제 설명
2. 풀이과정
해당 문제는 달팽이가 채우기를 하는 변과 원소의 위치에 관한 규칙을 찾으면 된다.
달팽이가 이동하면서 해당 변에 채워야 할 원소의 개수를 저장하고 이를 하나씩 불러오면 값을 채운다.
모든 원소를 1로 지정하고 이전 값을 더하며 값을 바꾼다.
먼저 내려가는 변은 채워야 할 열 중 제일 왼쪽을 내려가면서 채우면 된다. (행 위치 증가, 열 위치 고정)
다음으로 옆으로 가는 변은 해당 행을 그대로 채우면 된다. (행 위치 고정, 열 위치 증가)
마지막으로 올라가는 변은 채워야 할 열 중 제일 오른쪽을 올라가면서 채우면 된다. (행 위치 감소, 열 위치 고정)
이를 해당 변의 순서(i)와 값을 채워야 할 횟수(count[i] = j)를 활용하여 규칙을 정하면 된다. (아래 코드 참고)
- 삼각형의 각 행별로 숫자를 저장할 리스트를 생성한다. li = list()
- 각 행은 행 번호만큼 열의 개수가 존재하므로 모든 열의 원소 값을 1로 한 리스트를 생성하여 추가한다. for i in range(1, n + 1): li.append(list(1 for _ in range(i)))
- 달팽이가 채우기를 할 때 한 변에 채워야 하는 원소의 개수를 리스트로 저장한다. count = list(i for i in range(n, 0, -1))
- 이전 값을 저장할 변수를 생성하고 초기화한다. pre = 0
- 달팽이가 채우기를 할 전체 변의 개수만큼 반복하며 for i in range(len(count))
- 만약 해당 차례가 가로로 이동하는 변이면 if (i % 3 == 1)
- 행의 위치는 고정이므로 행의 값을 저장한다. row = i // 3 + i % 3
- 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
- 해당 원소의 값에 이전 값을 더하고 li[-row][row + j] += pre
- 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[-row][row + j]
- 만약 해당 차례가 위로 올라가는 변이면 elif (i % 3 == 2)
- 열의 위치는 고정이므로 열의 값을 저장한다. col = i // 3 + i % 3 - 1
- 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
- 해당 원소의 값에 이전 값을 더하고 li[-col - j - 1][-col] += pre
- 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[-col - j - 1][-col]
- 만약 해당 차례가 아래로 내려가는 변이면 else
- 마찬가지로 열의 위치는 고정이므로 열의 값을 저장한다. col = i // 3
- 해당 변에 채워야 하는 원소의 개수만큼 반복하며 for j in range(count[i])
- 해당 원소의 값에 이전 값을 더하고 li[2 * col + j][col] += pre
- 다음 연산을 위해 이전 값을 방금 변경한 원소의 결과로 저장한다. pre = li[2 * col + j][col]
- 전체 리스트를 행별로 불러오고 for i in li
- 다시 열의 원소별로 불러오며 for j in i
- 각 원소를 순서대로 추가한다. answer.append(j)
반응형
3. 소스코드
def solution(n):
answer = []
li = list()
for i in range(1, n + 1):
li.append(list(1 for _ in range(i)))
count = list(i for i in range(n, 0, -1))
pre = 0
for i in range(len(count)):
if (i % 3 == 1):
row = i // 3 + i % 3
for j in range(count[i]):
li[-row][row + j] += pre
pre = li[-row][row + j]
elif (i % 3 == 2):
col = i // 3 + i % 3 - 1
for j in range(count[i]):
li[-col - j - 1][-col] += pre
pre = li[-col - j - 1][-col]
else:
col = i // 3
for j in range(count[i]):
li[2 * col + j][col] += pre
pre = li[2 * col + j][col]
for i in li:
for j in i:
answer.append(j)
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 124 나라의 숫자 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.30 |
---|---|
[프로그래머스] 연속된 부분 수열의 합 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.28 |
[프로그래머스] 두 큐 합 같게 만들기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.26 |
[프로그래머스] 큰 수 만들기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.24 |
[프로그래머스] 베스트앨범 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.20 |
[프로그래머스] 쿼드압축 후 개수 세기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.18 |
[프로그래머스] 전력망을 둘로 나누기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.15 |
[프로그래머스] 기지국 설치 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2023.10.13 |