정수 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 함수를 완성해주세요.
n
≤ left
≤ right
< right
- left
< 단순 구현 문제로 보이지만 규칙을 찾아서 최적화된 알고리즘을 찾는 문제였어요. n
의 개수가 최대 인데 2차원 배열을 구성하는 것부터 O()이기 때문에 시간초과가 발생하기 때문이에요.
처음에 각 배열의 위치가 row * n + col
이라는 사실에 주목을 했어요. 그리고 이를 나열하면서 각 row와 col 중 가장 큰 수 + 1이 적절한 값이라는 규칙을 찾아냈어요!
이번 문제를 풀면서 운이 좋았다는 것도 있었지만, brute-force
방식보단 문제의 의도를 파악해서 단순화하면 생각보다 간단하게 문제를 풀 수 있겠다는 점을 느꼈어요. 시험칠 때 좀 이랬으면 좋겠어요 ㅎㅎ
class Solution {
public int[] solution(int n, long left, long right) {
int[] answer = new int[(int)(right - left) + 1];
int end = (int)(right - left);
for(int i = 0; i <= end; ++i){
long div = (left + i) / n;
long mod = (left + i) % n;
answer[i] = (int)Math.max(div + 1, mod + 1);
}
return answer;
}
}