프로그래머스 Lv.2 삼각 달팽이 (Java / Python)

eora21·2022년 9월 25일
0

프로그래머스

목록 보기
36/38

문제 링크

문제 간단 해석

세 가지 방향으로 전진하는 달팽이의 경로를 확인하는 문제. 진행 방향에 따른 규칙을 찾아보자.

Java

풀이 코드

class Solution {
    public int[] solution(int n) {
        int num = 1;

        for (int i = 2; i <= n; i++)
            num += i;

        int w = 0, mode = 0, now = 0, to = 0, val = 1;
        int[] answer = new int[num];

        while (val < num + 1) {
            if (mode == 0) {
                to = now + w++;
            } else if (mode == 1)
                to = now + 1;
            else
                to = now - --w;

            if (to < 0 || to >= num || answer[to] != 0) {
                mode++;
                mode %= 3;
                continue;
            }

            answer[to] = val++;
            now = to;

        }

        return answer;
    }
}

해석

for (int i = 2; i <= n; i++)
    num += i;

n까지의 시그마를 구한다.

while (val < num + 1) {
    if (mode == 0) {
        to = now + w++;
    } else if (mode == 1)
        to = now + 1;
    else
        to = now - --w;

    if (to < 0 || to >= num || answer[to] != 0) {
        mode++;
        mode %= 3;
        continue;
    }

    answer[to] = val++;
    now = to;

}

mode로 방향을 지정한다.
방향에 따라, 다음 갈 곳을 잡는다.
만약 다음 갈 곳이 배열을 벗어나거나 이미 수가 있다면, 방향을 전환한다.

좌측 하단으로 전진할 때는 현재 위치에서 + 1, + 2, + 3, + 4, ... 순으로 간다.
우측으로 전진할 때는 + 1씩 간다.
좌측 상단으로 갈 때는 좌측 하단으로 갈 때 증가했던 값 + 1만큼 감소하나, w++을 사용했기에 --w로 균형을 맞춰준다. 이는 mode에 맞춰 먼저 w의 증감을 수행하고, 밑 if문에서 갈 수 있는지 없는지를 확인하기 때문이다.

잘 도착했다면 값과 현재위치를 기록한다.

Python

풀이 코드

def solution(n):
    l = sum(range(1, n + 1))
    answer = [0] * l
    val = 1
    now = 0
    row = 0
    mode = 0

    while val <= l:
        if mode == 0:
            while 0 <= now + row < l and answer[now + row] == 0:
                now += row
                answer[now] = val
                val += 1
                row += 1

            mode = 1

        elif mode == 1:
            while 0 <= now + 1 < l and answer[now + 1] == 0:
                now += 1
                answer[now] = val
                val += 1

            mode = 2

        elif mode == 2:
            while 0 <= now - row < l and answer[now - row] == 0:
                now -= row
                answer[now] = val
                val += 1
                row -= 1

            mode = 0

    return answer

해석

Java와 대동소이함.

profile
나누며 타오르는 프로그래머, 타프입니다.

0개의 댓글