몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 삼각 달팽이 {언어 : JavaScript} 본문

알고리즘

프로그래머스 [Lv. 2] 삼각 달팽이 {언어 : JavaScript}

스위태니 2024. 5. 15. 01:57

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/68645?language=javascript

 

프로그래머스

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

programmers.co.kr

정답 코드

function solution(n) {
    const answer = [];
    
    let arr = Array(n).fill().map(() => Array(n).fill().map(() => 0));
    
    let [sr, sc] = [-1, 0];
    let freqs = Array(n).fill(n).map((e, i) => e - i);
    
    let cnt = 1;
    let left = 0;
    
    for (let i = 0; i < n; i++) {
        const freq = freqs[i];
        // 아래, 옆 위 아래이면서 맨 왼쪽
        const tmp = i % 3;
        if (tmp == 0) {
            sc = left;
            for (let j = 0; j < freq; j++) {
                sr += 1;
                arr[sr][sc] = cnt;
                cnt += 1;
            };
            left += 1;
        } else if (tmp == 1) {
            for (let k = 0; k < freq; k++) {
                sc += 1;
                arr[sr][sc] = cnt;
                cnt += 1;
            };
        } else {
            for (let l = 0; l < freq; l++) {
                sr -= 1;
                arr[sr][sc] = cnt;
                cnt += 1;
            };
        };
    };
    
    for (let m = 0; m < n; m++) {
        for (let o = 0; o < n; o++) {
            const value = arr[m][o];
            if (value) {
                answer.push(value);
            };
        };
    };
    
    return answer;
}

풀이 방법

  1. n * n 배열을 만든다.
  2. 미리 freq라는 배열을 만들어서 반복 횟수를 정해준다.
  3. cnt를 1씩 더해가면서 저장한다.
    1. 3가지 경우로 나누는데
      1. 아래로 내려가는 경우 sr을 1씩 더해준다.
      2. 옆으로 가는 경우 sc를 1씩 더해준다.
      3. 위로 가는 경우 sr을 1씩 빼준다.
    2. left를 만들어서 위에서 다시 밑으로 내려올 때 맨 왼쪽 부터 저장할 수 있도록 한다.
  4. arr의 0번째 행부터 탐색하면서 0이 아닌 값을 answer에 넣는다.
  5. answer를 반환하면 끝!

느낀점

  • 더 간결하게 푸는 방법도 있지만 바로 떠오를 수 있고 바로 풀 수 있는 방법이 좋은 것 같다.