📝 문제
정수 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 ≤ 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까지 넣어주면 된다.
정확도 테스트 결과
참고
'Coding test' 카테고리의 다른 글
[프로그래머스] 예상 대진표 (Lv 2) - javascript (0) | 2022.06.18 |
---|---|
[프로그래머스] 게임 맵 최단거리 (Lv 2) - javascript / BFS (0) | 2022.06.18 |
[프로그래머스] 2개 이하로 다른 비트 (Lv 2) - javascript (0) | 2022.06.17 |
[프로그래머스] 점프와 순간이동 (Lv 2) - javascript (0) | 2022.06.16 |
[프로그래머스] 쿼드압축 후 개수세기 (Lv 2) - javascript (0) | 2022.06.16 |