문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/87390
처음 접근 방법
n*n 이차원 배열을 만들어서 0으로 초기화하고,
for문을 돌면서 이차원 배열 값을 채운 다음에 left, right 크기만큼 자르자!
function solution(n, left, right) {
var answer = [];
let arr2 = Array.from(new Array(n),
(_)=>new Array(n).fill(0));
for(let i=0;i<n;i++){
for(let j=0;j<=i;j++){
arr2[i][j]=i+1;
arr2[j][i]=i+1;
}
}
let arr1 = [].concat(...arr2);
answer=arr1.slice(left,right+1);
return answer;
}
처참히 실패ㅎ..
처음 보는 오류가 떴다
signal: aborted (core dumped) 오류란
프로그램이 예외 상황에 직면해 종료되었거나, 시스템 리소스 부족, 잘못된 메모리 액세스, 스택 오버플로우 등의 이유로 발생한다.
n의 범위가 1~10^7 인데, 이차원 배열을 만들기엔 너무 큰 범위여서 나는 오류인가 보다...
두번째 접근 방법
이차원 배열을 만들지 않고 구현해야된다!
function solution(n, left, right) {
var answer = [];
//left로부터 시작하는 행과 열을 구해줌
let s_row = Math.floor(left / n + 1);
let s_col = (left % n) + 1;
for (let i = 0; i < right - left + 1; i++) { //right-left+1 만큼 반복해야 함
if (s_row >= s_col) { //행과 열의 값을 비교해서 행의 값이 크거나 같으면
answer.push(s_row); //answer에 행의 값을 넣어줌
} else { //행의 값이 열의 값보다 작으면
answer.push(s_col); //answer에 열의 값을 넣어줌
}
if (s_col == n) { //다음 행으로 넘어가는 경우
s_col = 1; //열을 1열로 초기화
s_row++; //행의 값에 +1
} else {
s_col++; //열만 옮겨주면 됨
}
}
return answer;
}
행과 열을 비교해서 행의 값이 크거나 같으면 (ex 2행 1열) 행의 값을 넣어주고,
열의 값이 크다면 (ex 2행 3열) 열의 값을 넣어주는 식으로 풀었다.
넣어준 후에는 행과 열을 옮겨주는 작업을 수행해주었다.
통과는 했지만 다른 사람 코드보니까 한두줄에 풀었던데 ..ㅎ
스스로 구현한거에 의미를 둬보자:)
'Algorithm' 카테고리의 다른 글
[Programmers]게임 맵 최단거리/JS (1) | 2024.01.23 |
---|---|
[Programmers]구명보트/JS (2) | 2024.01.22 |
[Programmers]하노이의 탑(12946번)/JS (1) | 2024.01.21 |
[Programmers]기능개발(42586번)/JS (1) | 2024.01.15 |
[Programmers]할인 행사(131127번)/JS (2) | 2024.01.14 |