문제 설명
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ n ≤ 107
0 ≤ left ≤ right < n2
right - left < 105
입출력 예
n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
나의 풀이
function solution(n, left, right) {
let arr = Array(n).fill().map(() => [])
for(let i = 0; i < n; i ++){
for(let j = 0; j <= i; j ++){
for(let k = 0; k <= i; k ++){
if(!arr[j][k]){
arr[j][k] = i+1
}
}
}
}
return arr.reduce((acc, curr) => acc.concat(curr), []).slice(left, right + 1);
}
첫 풀이는 테스트시 너무 오랜 시간을 사용하기에 다른 방법을 검색해봤다.
function solution(n, left, right) {
// 결과 배열을 초기화한다.
const result = new Array(right - left + 1);
// left부터 right까지의 각 인덱스에 대해 반복한다.
for (let i = left; i <= right; i++) {
// 현재 인덱스 i를 이용하여 행(row)과 열(column)을 계산한다.
const row = Math.floor(i / n); // 행
const col = i % n; // 열
// 현재 인덱스 i에 대응하는 값은 max(row, col) + 1 이다.
result[i - left] = Math.max(row, col) + 1;
}
return result;
}
이 문제는 각각의 값이 원래 2차원 배열의 몇행몇열인지를 알 수 있다면 해결할 수 있다.