[프로그래머스] N^2 배열 자르기

재오·2023년 6월 17일
1

코딩테스트

목록 보기
42/46
post-thumbnail

🗒️ 문제

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

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
    • 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 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


📝 문제 해설

난이도는 그렇게 높지 않은 것 같지만 꽤 고려해야 할 사항이 많은 문제이다. 우선 처음 문제를 풀 때에는 N x N 배열을 모두 만들어서 left와 right를 잘라서 반환하였다. 하지만 프로그래머스 문제를 풀면서 생판 처음보는 에러가 나왔다. 뭔가 수가 10^7까지 N의 값이 될 수 있음을 보고 이건 무조건 배열을 다 제작하라는 것이 아님을 깨달았다.

따라서 우리가 구하고자 하는 것은 left부터 right까지이기 때문에 left가 포함된 행과 right가 포함된 행까지만 반복문을 돌리면 된다.

💡 필요 문법

splice(S,C)

splice 메서드를 사용하면 배열의 S번째 index부터 C개를 잘라서 반환한다. splice 메서드는 기존 배열에 영향을 준다.

💻 코드

function solution(n, left, right) {
    let arr = [];
  	// N x N 배열 전체말고 구하고자 하는 부분만 체크한다
    for(let i=Math.floor(left/n); i<=Math.floor(right/n); i++){
        for(let j=0; j<n; j++){
            if(i === j) arr.push(i+1); // 배열의 대각선 부분이다
            else if(i > j) arr.push(i+1); // 대각선을 기준으로 왼쪽이다
            else if(i < j) arr.push(j+1); // 대각선을 기준으로 오른쪽이다
        }
    }
    return arr.splice(left%n, right-left+1);
}
profile
블로그 이전했습니다

0개의 댓글