정수 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
< n2right
-left
< 105
n left right result 3 2 5 [3,2,2,3] 4 7 14 [4,3,3,3,4,4,4,4]
처음엔 for문으로 반복하면서 left
~ right
까지 범위에 들어왔을때
answer
에 넣도록 풀이했었다.
function solution(n, left, right) {
var answer = [];
let cnt = 0;
for(let i=1; i<=n; i++){
for(let j=1; j<=i; j++){
if(cnt >= left && cnt <= right) answer.push(i)
cnt++;
}
for(let j=i+1; j<=n; j++){
if(cnt >= left && cnt <= right) answer.push(j)
cnt++;
}
}
return answer;
}
TC는 잘 통과했는데 채점에서 시간초과가 나버렸고
다른 방법이 뭐있지 하고 고민하면서 gif를 보면서 공책에 그림 그리다가
[0][0] 일 때, 1
[0][1] 일 때, 2
[0][2] 일 때, 3
[1][0] 일 때, 2
[1][1] 일 때, 2
[1][2] 일 때, 3
..
즉 해당 행렬 중 큰 숫자 보다 +1 큰 값인걸 알게되었다.
근데 또 인덱스는 별개더라..
인덱스는 x*n+y
라는걸 알아냈다.
즉, [1][2] 일때는 1*3+2 = 5
번째 숫자
바꿔 말하면 i
번째 숫자는 i/n
와 i%n
중 큰 숫자 보다 +1인 값
function solution(n, left, right) {
var answer = [];
for(let i=left; i<=right; i++){
answer.push(Math.max(parseInt(i/n), i%n)+1)
}
return answer;
}
i
번째 숫자가 뭔지 바로 알수 있느니 for문도 1부터 할 필요가 없어졌다.
풀고나서 정답을 보니 다른 분과 완전히 똑같더라.
오우..