오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

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