코딩 테스트/프로그래머스 level2
n^2 배열 자르기
fullfish
2022. 9. 11. 20:19
처음 코드
function solution(n, left, right) {
let matrix = new Array(n).fill(0).map(() => new Array(n).fill(0));
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix.length; j++) {
if (i >= j) matrix[i][j] = i + 1;
else matrix[i][j] = j + 1;
}
}
matrix = matrix.flat().slice(left, right + 1);
return matrix;
}
문제에서 요구한대로 배열을 만들고 자르고 했는데
이러면 배열의 크기가 너무 커서 오류가 난다
조금 더 빠르게
function solution(n, left, right) {
let arr = [];
for (let i = 0; i < n ** n; i++) {
let count = 1;
for (let j = i + 1; j <= n; count > j ? j++ : (j = j)) {
arr.push(j);
count++;
if (arr.length === right + 1) return arr.slice(left, right + 1);
}
}
}
2차원 배열을 애초에 안만들고
1차원 배열을 쭉 만들면서 right까지 갔을때 더 이상의 배열을 만들지 않고 리턴하게 했지만
이래도 아직 더 빠르게 해야했다
통과 코드
function solution(n, left, right) {
let arr = [];
let remainder = left % n;
for (let i = parseInt(left / n); i < n ** n; i++) {
let count = 1;
for (let j = i + 1; j <= n; count > j ? j++ : (j = j)) {
arr.push(j);
count++;
if (arr.length > right - left + remainder)
return arr.slice(
left - parseInt(left / n) * n,
left - parseInt(left / n) * n + right - left + 1
);
}
}
console.log(arr);
}
배열의 시작점을 left가 속한 행의 처음으로 잡아서 했다
심지어 if (arr.length > right - left + remainder)를 처음에 remainder 대신 n을 더했는데
n이 얼마나 큰지 시간초과가나서 나머지를 더했다
다른 사람 코드
function solution(n, left, right) {
var answer = [];
for (let i = left; i <= right; i++) {
answer.push(Math.max(i % n, parseInt(i / n)) + 1)
}
return answer;
}