programmers.co.kr/learn/courses/30/lessons/68645#
1. 문제 설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
2. 제한사항
- n은 1 이상 1,000 이하입니다.
3. 풀이
구현문제
def solution(n):
answer = []
snail = [[0 for j in range(i+1)] for i in range(n)]
target = n*(n+1)/2 # 삼각 달팽이에 들어갈 숫자 개수 n층이면 1부터 n까지의 합
cnt =0 # 숫자를 채워 넣은 횟수
direction =1
# 방향은 1,2,3 으로 나눠 왼쪽 아래로 향하면 1 오른쪽으로 향하면 2 왼쪽 위로 향하면 3
length = n #하나의 방향으로 얼마나 갈지 정하는 변수로 방향을 바꿀 때마다 1씩 감소된다.
row, col =0, 0 #처음 시작 위치
direc_move_cnt = 0 #방향 전환 횟수를 세는 변수
#while문을 돌면서 하나씩 채워넣는 방식으로 구현
while cnt != target:
if direction == 1: #첫번째 방향이면
for i in range(length): #정해진 길이만큼
cnt +=1
snail[row][col] = cnt
row += 1 #열은 변하지 않고 행만 변하므로 행에 1씩 더해가면서 숫자를 채워넣는다
row -= 1 #마지막에 행이 한번더 더해졌으므로 빼주고
length -=1 #길이를 감소시키고
direc_move_cnt +=1 #방향 전환 횟수에 +1
direction = 2 #이제 두번쨰 방향으로 바꾼다.
if direction == 2: # 두번쨰 방향에서는 오른쪽으로만 움직이므로
for i in range(length):
cnt +=1
col +=1 #열 방향으로 +1 씩 해주면서
snail[row][col] = cnt # 숫자를 채워넣는다.
length -=1 #길이를 하나 줄여주고
direction = 3 #방향은 3
direc_move_cnt +=1 # 방향 전환 횟수 추가
if direction == 3:
col = -( direc_move_cnt // 3) -1
#3번째 방향에서는 다시 이방향이 올때마다 열방향으로 뒤쪽에서 앞쪽으로 한칸씩 오게된다.
#다른부분은 동일
for i in range(length):
cnt +=1
row -= 1
snail[row][col] = cnt
length -=1
direction = 1 #다시 방향 1로 바꾸고
direc_move_cnt +=1
col += len(snail[row]) # 열을 제자리로 돌려주고
row +=1 #마지막에 행이 한번 더 감소했으므로 1을 더해준다.
for row in snail: # for문이 종료되면
answer.extend(row) # answer에 순서대로 넣어준다.
return answer
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] N으로 표현 python (0) | 2021.04.22 |
---|---|
[프로그래머스] 파일명 정렬 python (0) | 2021.04.15 |
[프로그래머스] 징검다리 파이썬 (0) | 2021.02.25 |
[프로그래머스] 입국심사 파이썬 (0) | 2021.02.24 |
프로그래머스 코딩테스트 연습 - 해시-베스트앨범 (0) | 2020.06.12 |