코테 준비

[프로그래머스] 삼각 달팽이

우디혜 2020. 10. 11. 22:51

programmers.co.kr/learn/courses/30/lessons/68645

 

ㅎ...ㅏ 규칙성이 이리도 쉬운걸 왜 코딩 챌린지 당시에는 안보였을까..

 

 

로직

n = 4 일 경우

[1]
[2, 9]
[3, 10, 8]
[4, 5, 6, 7]

위와 같이 나타낼 수 있다

 

여기서 나타나는 규칙성은 

숫자를 순서대로 넣는다고 할 때,

 

  1. x 인덱스 값 증가(왼쪽 면 채우기)
  2. y 인덱스 값 증가(바닥 면 채우기)
  3. x, y 인덱스 값 감소(오른쪽 면 채우기)

가 한 사이클이다.

python에서는 case 문이 따로 존재하지 않아 채워야 하는 면이 바뀔 때마다 mode라는 변수에 1씩 더하고, % 3을 해주어 case 문과 비슷한 방식으로 동작하게끔 했다.

 

 

그리고

 

( 1, 2, 3, 4 )가 왼쪽 면

( 5, 6, 7 )가 바닥 면

( 8, 9 )가 오른쪽 면

( 10 ) 가 왼쪽 면

 

면이 달라질 때마다 채워야 하는 숫자의 길이가 1씩 감소한다는 규칙성도 찾을 수 있다.

 

 

코드

def solution(n):
    answer = [[0] * i for i in range(1, n + 1)]
    
    final = int((n + 1) / 2 * n)
    mode, counter = 0, n
    x, y = -1, 0
    
    for num in range(1, final + 1):
        if counter == 0:
            n -= 1
            counter = n
            mode += 1
        
        if mode % 3 == 0: # left side, x값 증가
            x += 1
            
        elif mode % 3 == 1: # bottom side, y값 증가
            y += 1
            
        else: # right side, x와 y값 감소
            x -= 1
            y -= 1
            
        counter -= 1
        answer[x][y] = num
        
    final_answer = []
    for sub_answer in answer:
        final_answer.extend(sub_answer)
    
    return final_answer