아래 풀이는 signal: aborted (core dumped) 오류 발생
function solution(n, left, right) {
let od = Array.from({length:n}, () => Array.from({length:n}, () => 0));
let cnt=1;
for (let i=1; i<=n; i++) {
let tmp=cnt;
for (let j=tmp; j<=n; j++) {
od[i-1][j-1]=j;
}
for (let j=1; j<od.length; j++) {
if (od[i-1][j-1]==0) {
od[i-1][j-1]=tmp;
}
}
cnt++;
}
return od.flat().slice(left, right+1);
}
console.log(solution(3, 2, 5));
마찬가지로 signal: aborted (core dumped) 오류 발생...
function fl(array) {
return array.reduce((result, x) => result.concat(
Array.isArray(x) ? fl(x) : x), [])
}
function solution(n, left, right) {
let od = Array.from({length:n}, () => Array.from({length:n}, () => 0));
let cnt=1;
for (let i=1; i<=n; i++) {
let tmp=cnt;
for (let j=tmp; j<=n; j++) {
od[i-1][j-1]=j;
}
for (let k=1; k<od.length; k++) {
if (od[i-1][k-1]==0) {
od[i-1][k-1]=tmp;
}
}
cnt++;
}
return fl(od).slice(left, right+1);
}
애초에 중첩 배열을 만들지 않고 바로 answer에 넣고 count가 right보다 커지면 break 함으로써 좀 더 빠르게 해봤더니 tc11까지는 통과된다..! 이후는 런타임 에러 등장
function solution(n, left, right) {
let cnt=1;
let count=0;
let answer = [];
for (let i=1; i<=n; i++) {
if (count>right) break;
let tmp=cnt;
for (let j=1; j<=n; j++) {
if (j<tmp) {
answer.push(tmp);
count++;
}
else if (j>=tmp) {
answer.push(j);
count++;
}
}
cnt++;
}
return answer.slice(left, right+1);
}
left ~ right만 answer 배열엔 넣기. tc12까지 통과. 이제는 런타임이 아니라 시간 초과
function solution(n, left, right) {
let cnt=1;
let count=0;
let answer=[];
for (let i=1; i<=n; i++) {
if (count>right) break;
let tmp=cnt;
for (let j=1; j<=n; j++) {
if (j<tmp && count >= left && count <= right) {
answer.push(tmp);
}
else if (j>=tmp && count >= left && count <= right) {
answer.push(j);
}
count++;
}
cnt++;
}
return answer;
}
console.log(solution(4, 7, 14));
시간초과가 발생할 것 같을 때는 차근차근 규칙을 찾아봐야 한다.
각 행과 열에서 규칙을 찾기.
1행 1열 (1,1) = 1
1행 2열 (1,2) = 2
1행 3열 (1,3) = 3
2행 3열 (2,3) = 3
...
즉, (행,열)의 값은 Math.max(행,열) 혹은 idx 관점으로는 Math.max(행,열)+1
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;
}
function solution(n, left, right) {
const ans = [];
while (left <= right) {
ans.push(Math.max(Math.floor(left / n), left++ % n) + 1);
}
return ans;
}
[참고]
배열 평탄화 작업
function flat(arr) {
return arr.reduce((a, b) => a.concat(
Array.isArray(b) ? flat(b) : b), [])
}
혹은
const flat =arr =>
arr.reduce((a,b) =>
[...a, ...(Array.isArray(b) ? flat(b) : [b])]
, []);
중복 제거 후 배열 합치기
var a
var a1 = [1, 2, 3];
var a2 = [3, 4, 5, 6];
var merged = a1.concat(a2);
var unique = merged.filter((item, pos) => merged.indexOf(item) === pos);
console.log(unique);
// [1, 2, 3, 4, 5, 6]
https://velog.io/@front/프로그래머스-n2-배열-자르기
https://deeplify.dev/front-end/js/merge-array-without-duplicates
https://taehoung0102.tistory.com/entry/프로그래머스java-Levle2-n2배열-자르기