본문 바로가기

Algorithm/프로그래머스

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

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 해결방법

이 문제에 대한 아이디어가 40% 정도밖에 떠오르지 않아 결국 포기한 문제이다.
수학적으로 접근해서 아이디어를 생각해내 해결해야 하는 구현 문제이다.


n = 4일 경우에는 [1, 2, 3, 4], [5, 6, 7], [8, 9], [10] 순서대로 배열에 값이 들어가는 것을 확인할 수 있다.
각 순서의 배열은 0 ~ 3 번째로 두고, 0번째의 배열에는 4개, 1번째는 3개... 이러한 부분으로 보면 "n - 회차"의 개수가 각 순서의 배열에 값이 들어간다는 것을 확인할 수 있다.

삼각형에서 위에서 아래로, 왼쪽에서 오른쪽으로, 아래에서 위로 총 세 가지의 이동 방법이 있다. 
그렇기 때문에 한 가지 더 생각해 볼 수 있는 방법이 생기는데,

회차 % 3 == 0 이면 위에서 아래로, 
회차 % 3 == 1 이면 왼쪽에서 오른쪽으로, 
회차 % 3 == 2 이면 아래에서 위로,
로 유추할 수 있다.

하지만 알고리즘을 해결하는데 있어서 삼각형의 이차원 배열을 처리하기엔 복잡하다. 그래서 우리는 정사각형으로 먼저 만들고 위의 수학적인 로직을 보면서 해결하면 된다.


당연히 2차원 배열을 만들기 전에 모든 값을 '0'으로 초기화를 하고, 위 수학적 논리 과정을 통해서 2차원 배열의 인덱스 값을 갱신하면 된다.

 

 

2. 정답코드

def solution(n):
    answer = []
    maps = [[0] * (n) for _ in range(n)]
    y, x = -1, 0
    num = 1
    
    # 방향 체크
    for i in range(n):
        for _ in range(i, n):
            # 위에서 아래로
            if i % 3 == 0:
                y += 1
            # 왼쪽에서 오른쪽으로
            elif i % 3 == 1:
                x += 1
            # 아래에서 위로
            else:
                y -= 1
                x -= 1
            
            # maps에 값 갱신
            maps[y][x] = num
            num += 1
            
    for arr in maps:
        for num in arr:
            if num != 0:
                answer.append(num)
    
    
    return answer

 

 

 

 

 

 

 

 

[참고]

https://developnote.tistory.com/26