728x90
# 조건
- 정수 n이 매개변수로 주어집니다.
- 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한 사항
- n은 1이상 1,000 이하
입출력 예
- n = 4 인 경우 [1,2,9,3,10,8,4,5,6,7]
# 접근 방법
- 주어진 입출력 예를 n x n 배열에 넣어 보자
- 1 0 0 0 0
- 2 12 0 0 0
- 3 13 11 0 0
- 4 14 15 10 0
- 5 6 7 8 9
- 숫자를 채우는 규칙이
- 세로로 이동하다가 범위를 벗어나거나 이미 채워진 경우 가로로,
- 가로로 이동하가 범위를 벗어나거나 채워진 경우 대각선 왼쪽위로,
- 대각선 왼쪽위로 ( i-1, j-1 ) 이동하다가 범위 벗어나거나 채워진 경우 세로로 이동한다.
- 즉, 해당 규칙을 while문을 돌리면서 변경시켜주면 된다.
- pattern = [[1,0],[0,1],[-1,-1]] 을 범위가 벗어나거나 이미 채워진 경우 % 3을 통하여 다음 규칙으로 변경해준다.
def solution(n):
answer = []
# 1 0 0 0 0
# 2 12 0 0 0
# 3 13 11 0 0
# 4 14 15 10 0
# 5 6 7 8 9
max_cnt = n*(n+1)//2
arr = [[0]*n for _ in range(n)]
pattern = [[1,0],[0,1],[-1,-1]]
si, sj, cnt = 0, 0, 2
pat_idx = 0
arr[0][0] = 1
while cnt <= max_cnt:
ni, nj = si+pattern[pat_idx][0],sj+pattern[pat_idx][1]
if 0<=ni<n and 0<=nj<n and not arr[ni][nj]:
arr[ni][nj] = cnt
si, sj = ni, nj
cnt += 1
else:
pat_idx = (pat_idx+1) % 3
for i in range(n):
for j in range(n):
if arr[i][j] != 0:
answer.append(arr[i][j])
return answer
728x90
'ALGORITHM > 정렬, 탐색,구현' 카테고리의 다른 글
[백준 14890번] 파이썬 - 경사로 (0) | 2023.06.08 |
---|---|
[백준 16566번] 파이썬 - 카드 게임 (0) | 2023.05.06 |
[백준 17143번] 파이썬 - 낚시왕 (1) | 2023.04.23 |
[프로그래머스] 파이썬 - 요격 시스템 (0) | 2023.04.21 |
[백준 1744번] 파이썬 - 수 묶기 (0) | 2023.04.15 |