코딩테스트

[JS] 삼각 달팽이

미안하다 강림이 좀 늦었다 2024. 3. 21. 16:50

 

 

난이도: Lv. 2

정답률: 52%

문제: https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

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

programmers.co.kr

 

 

알고리즘

  1. 첫 행부터 마지막 행까지의 원소를 담을 2차원 배열을 생성한다.
  2. 최대 반복(라운드) 횟수를 정의한다. 
    • 삼각형 위쪽 레벨은 다음 라운드로 갈 때마다 2씩 증가한다.
    • 삼각형 아래쪽 레벨은 다음 라운드로 갈 때마다 1씩 감소한다. 
  3. 하나의 라운드마다 가장 바깥쪽에 있는 삼각형 한 바퀴를 채운다.
    1. 삼각형 위에서 왼쪽 아래로 내려가며 채운다. 이때 마지막 블럭도 채운다.
    2. 삼각형 왼쪽 밑에서 오른쪽 밑으로 가며 채운다. 마지막 블럭은 채우지 않는다.
    3. 삼각형의 오른쪽 밑에서 위로 가며 채운다. 마지막 블럭은 처음 3-1에서 채웠던 블록이므로 채우지 않는다.
  4. 라운드를 증가시키고, 최대 라운드에 도달할 때까지 2의 과정을 반복한다.

 

 

코드

function solution(n) {
    const answer = [];
    const floorArr = Array.from({ length: n }, (_, idx) => Array.from({ length: idx + 1 }, () => 0));
    const maxRound = Math.ceil(n / 3);
    let round = 1;
    let currNum = 1;

    while (round <= maxRound) {
        const startLevel = 1 + 2 * (round - 1);
        const endLevel = n - (round - 1);

        // top to bottom
        for (let i = startLevel - 1; i < endLevel; i++) {
            floorArr[i][round - 1] = currNum++;
        }

        // left to right
        for (let i = round; i < endLevel - round; i++) {
            floorArr[endLevel - 1][i] = currNum++;
        }

        // bottom to top
        for (let i = endLevel - 1; i > startLevel - 1; i--) {
            floorArr[i][i - round + 1] = currNum++;
        }

        round++;
    }

    for (let i = 0; i < n; i++) {
        for (let j = 0; j <= i; j++) {
            answer.push(floorArr[i][j]);
        }
    }

    return answer;
}

 

 

주저리

구라안치고 어떻게 풀지 고민하는데만 한 시간 넘게 걸렸다. 한 번 순회할 때 바로 정답 배열에 안 집어넣으면 시간초과 날까 봐 한 시간 동안 머리 싸맸는데 이렇게 해서는 답이 없다 싶어서 두 번 순회하는 걸로 푸니까 잘 풀렸다. 인덱스랑 값 사이에 규칙 없나 한참 고민하고 배열을 어떤 방향으로 채워갈지 한참 고민하고 그냥 한참 고민만 했다....

코드 짜다가 결과가 한 번 이상했긴 했는데 

이렇게 풀어서 그런거였다. 마지막 라운드에 빈칸이 딱 하나만 있으면 for문 3개 중에 돌아가는 게 단 하나도 없는 상황이 발생해 버린다. 인덱스 값 일반화한다고 고생을..... 아주.... 많이.... 했다....  풀고 나니까 이걸 왜 그렇게 오래 붙잡고 있었는가 싶다......