Algorithm/프로그래머스
[프로그래머스] 삼각 달팽이 파이썬
junha6316
2021. 4. 13. 08:58
programmers.co.kr/learn/courses/30/lessons/68645#
코딩테스트 연습 - 삼각 달팽이
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
programmers.co.kr
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