알고리즘
[Javascript] 프로그래머스 - n^2 배열 자르기
J3SUNG
2025. 1. 11. 21:44
728x90
문제 설명
정수 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 함수를 완성해주세요.
제한사항
- 1 ≤ n ≤ 10^7
- 0 ≤ left ≤ right < n^2
- right − left < 10^5
해결 방법
알고리즘: 구현
- 주어진 조건에서 배열 전체를 생성하면 메모리 부족 문제가 발생할 수 있으므로, 배열 생성 과정을 최소화합니다.
- 1차원 인덱스를 2차원 좌표로 변환하여 값을 직접 계산합니다.
- 행 (yy)은 Math.floor(i / n)으로, 열 (xx)은 i % n으로 계산할 수 있습니다.
- 해당 좌표의 값은 Math.max(x, y) + 1로 결정됩니다.
- left부터 right까지 필요한 부분만 계산하여 배열을 반환합니다.
시간 복잡도
- 필요한 구간만 계산하므로 시간 복잡도는 O(right−left)입니다.
구현 코드
function solution(n, left, right) {
let answer = [];
for (let i = left; i <= right; ++i) {
const y = Math.floor(i / n);
const x = i % n;
answer.push(Math.max(x, y) + 1);
}
return answer;
}