Coding test

[프로그래머스] n^2 배열 자르기 (Lv 2) - javascript

Jiwoo 2022. 6. 17. 16:41

📝 문제

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
 

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
  3. 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  4. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  5. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
     

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
 

제한사항

  • 1 ≤ n ≤ 107
  • 0 ≤ left ≤ right < n2
  • right - left < 105
     

🤔 나의 풀이

function solution(n, left, right) {

    let twoDarr = Array.from({length: n}, () => []);

    for(let i = 0; i < n; i++) {

        let count = i+1
        let temp = i+1;

        while(twoDarr[i].length !== n) {
            if(count) {
                twoDarr[i].unshift(i+1);
                count --;
            }
            else {
                twoDarr[i].push(temp+1);
                temp++;
            }
        }
    }

    let arr = []
    twoDarr.forEach(v => arr.push(...v));

    return arr.slice(left,right+1);

}

 
하나하나 구현했으나 역시 실패
n의 값이 10^7까지 가능하니 구현은 애초에 불가능했다
이런 경우 규칙을 찾는 것에 집중할 것
 

🔑 모범 풀이

function solution(n, left, right) {

    let answer = [];

    while(left <= right) {
        answer.push(Math.max(Math.floor(left/n), left%n) + 1);
        left ++;
    }

    return answer;
}

 

  • 좌표의 규칙: Math.max(Math.floor(x/n), y%n) + 1
     

2차원 배열을 만들고, 1차원으로 붙이고 할 필요 없이
left부터 1씩 높여가며 right까지 넣어주면 된다.
 

  • 정확도 테스트 결과


     


참고

velog.io/@front