
난이도: ★☆☆☆☆ • solved on: 2025-11-17


자료구조
알고리즘/기법
핵심 키워드
- 문제 분해
- 배열의 모든 값을 Queue에 담는다.
- k % n 만큼만 회전하면 충분하므로 이를 이용한다.
- 오른쪽 회전을 queue 방식(pop→push)과 반대 방향으로 구현하기 위해 (n - shift)번 pop→push한다.
- Queue를 배열로 변환한 뒤, query 인덱스의 값을 반환 리스트에 담는다.
핵심 로직 흐름
queue ← a 저장 shift = k % n queue를 (n - shift)번 pop→push queue 값을 arr 배열에 저장 각 query 인덱스의 arr 값을 result에 추가예외 처리
- shift = k % n 처리로 불필요한 회전을 방지한다.
public static List<Integer> circularArrayRotation(List<Integer> a, int k, List<Integer> queries) {
// Write your code here
Queue<Integer> queue = new ArrayDeque<>();
Integer[] arr = new Integer[a.size()];
List<Integer> result = new ArrayList<>();
for(int i = 0; i<a.size(); i++){
queue.add(a.get(i));
}
for(int i = 0; i<a.size() - (k%a.size()); i++){
queue.add(queue.poll());
}
for(int i = 0; i<a.size(); i++){
arr[i] = queue.poll();
}
for(int item: queries){
result.add(arr[item]);
}
return result;
}
- 문제 분해
- 중요한건 인덱스의 변화이기 때문에 실제 배열을 물리적으로 회전할 필요가 없다.
- 오른쪽 회전된 배열에서 query 인덱스 j는 원본 배열의
(j - shift + n) % n위치와 동일하다.- 이 식을 통해 즉시 값을 꺼낼 수 있다.
핵심 로직 흐름
shift = k % n for each query j: index = (j - shift + n) % n result.add(a[index])예외 처리
- (j - shift)가 음수일 수 있으므로 +n 후 %n 처리한다.
public static List<Integer> circularArrayRotation(List<Integer> a, int k, List<Integer> queries) {
int n = a.size();
int shift = k % n;
List<Integer> result = new ArrayList<>();
for (int q : queries) {
int index = (q - shift + n) % n;
result.add(a.get(index));
}
return result;
}
방법 1
- 시간 복잡도: O(N + K)
- 공간 복잡도: O(N)
방법 2
- 시간 복잡도: O(Q)
- 공간 복잡도: O(1)
비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)