[프로그래머스 | Javascript] - n^2 배열 자르기

임홍원·2023년 10월 30일
1
post-thumbnail

프로그래머스 | n^2 배열 자르기

📍문제 설명📍
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.


❗실패한 풀이❗

function solution(n, left, right) {
    var answer = new Array(n);
    
    for(let i = 0; i < answer.length; i++) {
        answer[i] = new Array(n);
    }
    
    // 1 2 3
    // 2 2 3
    // 3 3 3
    for(let i = 0; i < answer.length; i++) {
        for(let j = 0; j < answer[i].length; j++) {
            if(i === j) answer[i][j] = j + 1;
            if(i > j) answer[i][j] = i + 1;
            if(i < j) answer[i][j] = j + 1;
        }
    }
    
    let newArr = String(answer).split(',').map(x => parseInt(x)).slice(left, right + 1);
    
    return newArr;
}

💯성공한 풀이💯

function solution(n, left, right) {
    var answer = [];
    
    for(let i = left; i <= right; i++) {
        const s = parseInt(i / n);
        const r = i % n;
        answer.push(Math.max(s, r) + 1);
    }
    
    return answer;
}

처음 발견한 규칙으로는 i === j, i > j, i < j 일때 값을 나눠서 넣어주었다. 하지만 input을 보니 10^7이라 당연히 시간초과 나겠구나 생각했다.

다시한번 규칙을 파악하고 보니, 좌표값을 이용하면 되겠다 생각하였다.
행렬 좌표의 x와y 좌표 중 큰 값 + 1을 하면 되었다.

i / n 을 하면 행 값이 나오고, i % n 을 하면 열 값이 나온다.
예를들어 n = 4, left = 7, right = 14 일때 s = 1 2 2 2 2 3 3 3 가 나오고 r = 3 0 1 2 3 0 1 2

위 의 경우 처음 행렬을 생각해보자

1 2 3 4
2 2 3 4
3 3 3 4
4 4 4 4
=> 1 2 3 4 2 2 3 4 3 3 3 4 4 4 4 (행렬을 이어 붙였을 때)
=> 4(1,3) 3(2,0) 3(2, 0) ...

처음부터 2차원 행렬을 만들 생각을 말고 1차원 행렬을 만들어 return 하는 것 이므로 1차원 행렬로 생각했어야 됐다는것을 깨달았다.

profile
Frontend Developer

0개의 댓글