300x250
반응형
문제
아이디어
이번 문제의 아이디어는 달팽이 모양으로 회전을 하는 방법이라고 생각합니다.
제가 생각한 방법은 다음과 같습니다.
- 아래 방향으로 이동하며 정수 값을 집어넣기
- 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 우측 방향으로 방향 전환
- 우측 방향으로 이동하며 정수 값을 집어넣기
- 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 좌상단 방향으로 방향 전환
- 좌상단 방향으로 이동하며 정수 값을 집어넣기
- 배열을 벗어나거나 값이 존재하는 인덱스를 마주할 경우 아래 방향으로 방향 전환
해당 방법을 이용하여 더 이상 앞으로 나아갈 수 없을 때까지 반복해주면 자연스럽게 정답을 구할 수 있었습니다.
구현 코드 (JavaScript)
const getI = (i, dir) => {
switch(dir) {
case 0: // 아래로 이동
return i+1;
case 1: // 오른쪽으로 이동
return i;
case 2: // 왼쪽위로 이동
return i-1;
}
}
const getJ = (j, dir) => {
switch(dir) {
case 0: // 아래로 이동
return j;
case 1: // 오른쪽으로 이동
return j+1;
case 2: // 왼쪽위로 이동
return j-1;
}
}
function solution(n) {
const array = Array.from(Array(n), () => Array(n).fill(0));
let dir = 0;
let i = 0;
let j = 0;
let index = 1;
while(true) {
array[i][j] = index++; // 현재 i, j값에 index값 집어넣기
let nextI = getI(i, dir); // 다음 i구하기
let nextJ = getJ(j, dir); // 다음 j구하기
if(nextI >= n || nextI < 0 || nextJ >= n || nextJ < 0 || array[nextI][nextJ] !== 0) { // 배열의 범위를 벗어나거나 값이 있을 경우 방향 전환
dir = (dir+1)%3; // 방향 전환
nextI = getI(i, dir); // 현재 위치에서 방향전환했을 때 다음 i구하기
nextJ = getJ(j, dir); // 현재 위치에서 방향전환했을 때 다음 j구하기
}
if(array[nextI][nextJ] !== 0) { // 방향전환을 했는데도 값이 있다면 종료
break;
}
i = nextI;
j = nextJ;
}
const res = [];
for(let i=0; i<n; i++) {
for(j=0; j<=i; j++) {
res.push(array[i][j]);
}
}
return res;
}
읽어주셔서 감사합니다.
728x90
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] 쿼드압축 후 개수 세기 (0) | 2021.04.15 |
---|---|
[Programmers] 풍선 터트리기 (0) | 2021.04.14 |
[Programmers] 뉴스 클러스터링 (0) | 2021.04.12 |
[Programmers] 추석 트래픽 (0) | 2021.04.11 |
[Programmers] 길 찾기 게임 (0) | 2021.04.02 |
댓글