https://programmers.co.kr/learn/courses/30/lessons/87390
문제 설명
정수 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
입출력 예
n | left | right | result |
---|---|---|---|
3 | 2 | 5 | [3,2,2,3] |
4 | 7 | 14 | [4,3,3,3,4,4,4,4] |
문제 풀이
function solution(n, left, right) {
var answer = [];
for (let i = left; i<=right; i++) {
let a = parseInt(i/n);
let b = i%n
if(a<=b) answer.push(b+1)
else {
answer.push(a+1)
}
}
return answer;
}
처음엔 제한사항을 유념히 보지 못해 이중 반복문을 돌렸지만 테스트에서 문제가 생긴것을 확인하고
더 효율적으로 코드를 짜기위한 방법을 구현하고자 했다.
먼저 1차원배열로 만들어진 것을 구현하기 위해 규칙을 찾아봤다. 규칙은
n이 4 일때
1,2,3,4
2,2,3,4
3,3,3,4
4,4,4,4
이렇게 늘어가기 때문에 n씩 끊어지는 규칙을 찾았고
0번째 인덱스 일 때(2차원 배열의)는 1,2,3,4 1번째 인덱스는 2,2,3,4 x번째 인덱스 전까지의 숫자는 x번째 인덱스의 숫자와 같다는 것을 파악했다.
let a = parseInt(i/n)
변수 a가 2차원 배열의 인덱스이고 b는 2차원 배열 안의 인덱스이다. 그래서 b번째 인덱스까지는 a+1 를 넣어주고 그 외의 숫자는 b+1을 해서 답을 냈다.