난이도: Lv. 2
정답률: 52%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/68645
알고리즘
- 첫 행부터 마지막 행까지의 원소를 담을 2차원 배열을 생성한다.
- 최대 반복(라운드) 횟수를 정의한다.
- 삼각형 위쪽 레벨은 다음 라운드로 갈 때마다 2씩 증가한다.
- 삼각형 아래쪽 레벨은 다음 라운드로 갈 때마다 1씩 감소한다.
- 하나의 라운드마다 가장 바깥쪽에 있는 삼각형 한 바퀴를 채운다.
- 삼각형 위에서 왼쪽 아래로 내려가며 채운다. 이때 마지막 블럭도 채운다.
- 삼각형 왼쪽 밑에서 오른쪽 밑으로 가며 채운다. 마지막 블럭은 채우지 않는다.
- 삼각형의 오른쪽 밑에서 위로 가며 채운다. 마지막 블럭은 처음 3-1에서 채웠던 블록이므로 채우지 않는다.
- 라운드를 증가시키고, 최대 라운드에 도달할 때까지 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개 중에 돌아가는 게 단 하나도 없는 상황이 발생해 버린다. 인덱스 값 일반화한다고 고생을..... 아주.... 많이.... 했다.... 풀고 나니까 이걸 왜 그렇게 오래 붙잡고 있었는가 싶다......
'코딩테스트' 카테고리의 다른 글
[JS] 연속된 부분 수열의 합 (0) | 2024.04.02 |
---|---|
[JS] 큰 수 만들기 (0) | 2024.03.27 |
[JS] 두 큐 합 같게 만들기 (0) | 2024.03.19 |
[JS] 소수 찾기 (0) | 2024.03.13 |
[JS] 다리를 지나는 트럭 (0) | 2024.02.29 |