세 가지 방향으로 전진하는 달팽이의 경로를 확인하는 문제. 진행 방향에 따른 규칙을 찾아보자.
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문에서 갈 수 있는지 없는지를 확인하기 때문이다.
잘 도착했다면 값과 현재위치를 기록한다.
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와 대동소이함.