Level 2️⃣ - 삼각 달팽이
2024. 4. 10. 14:10ㆍ알고리즘/프로그래머스
https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🚀문제 접근
첫 행부터 마지막 행까지 모두 순서대로 합친 배열을 반환하기 위해서 이차원 배열로 표현했다.
값은 배열에 요소를 채워나갈때마다 1씩 더해지고, 값이 들어가야되는 위치는 처음에는 y축에서 양의 방향으로 n번 반복하면서 1씩 커지게 된다.
[0, 0] ➡ [1, 0] ➡ [2, 0] ➡ [3, 0], n이 4일때 총 4번 반복하게 된다.
그리고 x축에서 양의 방향으로 n-1번 반복하면서 1씩 커지게 된다.
[3, 1] ➡ [3, 2] ➡ [3, 3]
그리고 y축과 x축의 음의 방향으로 n-2번 반복하면서 1씩 작아지게 된다.
[2, 2] ➡ [1, 1]
그리고 다시 y축에서 양의 방향으로 n-3번 반복하게 된다.
[2, 1]
🛠코드
9번째 줄부터 반복문 안에서 반복해야되는 로직을 생각하는 것이 까다로웠다. 여러번 복습해서 익숙해지도록 연습하자.
function solution(n) {
const ret = [];
const arr = Array.from({length: n}, ()=>Array.from({length: n}).fill(0));
const dir = [[1,0], [0,1], [-1,-1]];
let y = -1;
let x = 0;
let nowValue = 1;
let dirIdx = 0;
for(let i = n; i>0; i--){
let [dy, dx] = dir[dirIdx];
for(let j = 0; j<i; j++){
y += dy;
x += dx;
arr[y][x] = nowValue++;
}
dirIdx = (dirIdx + 1) % 3;
}
for(let i = 0; i<n; i++){
for(let j = 0; j<n; j++){
if(arr[i][j]) ret.push(arr[i][j]);
}
}
return ret;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
Level 2️⃣ - 124나라의 숫자 (0) | 2024.04.11 |
---|---|
Level 2️⃣ - 연속된 부분수열의 합(Feat. 투포인터) (0) | 2024.04.10 |
Level 2️⃣ - 두 큐 합 같게 만들기 (0) | 2024.04.09 |
Level 2️⃣ - 프렌즈 4블록 (0) | 2024.04.08 |
Level 2️⃣ - 2개 이하로 다른 비트 (0) | 2024.04.08 |