[HackerRank] Circular Array Rotation

아르당·2023년 11월 11일

HackerRank

목록 보기
16/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

존 왓슨은 정수 배열이 오른쪽 원형 회전이라 불리는 작업을 알고 있다. 한 번의 회전 작업은 마지막 배열 요소가 첫 번째 위치로 이동하고 나머지 요소들은 오른쪽으로 한번씩 이동한다. 셜록의 능력 테스트를 위해 왓슨은 셜록에게 정수형 배열을 제공한다. 셜록은 여러 번 위치를 변경하고 주어진 위치의 값을 결정한다.
각 배열은 오른쪽 원형 회전을 여러 번 실행하고 주어진 위치의 값을 반환해라.

Example

a = [3, 4, 5]
k = 2
queries = [1, 2]

k는 a를 움직일 횟수이고, queries는 반환해야 할 값들의 위치이다. 처음 위치를 두 번 움직인다. [3, 4, 5] -> [5, 3, 4] -> [4, 5, 3]
queries에 있는 요소는 0부터 시작하고, 1번 위치와 2번 위치의 값을 반환한다.

a[1] = 5
a[2] = 3

Function Description

circularArrayRotation 함수를 완성해라.
circularArrayRotation 함수는 아래와 같은 매개변수를 가지고 있다.

  • int a[n]: 움직여야할 배열
  • int k: 움직일 횟수
  • int queries[1]: 반환할 값의 위치

Returns

  • int[q]: a 배열에 요청한 위치

Constraints

  • 1 <= n <= 10^5
  • 1 <= a[i] <= 10^5
  • 1 <= k <= 10^5
  • 1 <= q <= 500
  • 0 <= queries[i] < n

풀이

반복문을 통해 주어진 배열의 값을 k번동안 위치를 옮긴다. Javascript는 pop이 있어서 바로 마지막 요소의 값을 가져오는 것과 삭제하는 것을 동시에 할 수 있지만 Java는 분리해서 수행해야한다.

for(int i = 0; i < k; i++){
	int unshift = a.get(a.size() - 1);
	a.remove(a.size() - 1);
	a.add(0, unshift);
}

반환할 List를 생성하고, 다시 반복문을 사용해 주어진 위치의 값을 반환할 List에 넣어준다. 마지막으로 List를 반환한다.

List<Integer> result = new ArrayList<>();

for(int i = 0; i < queries.size(); i++){
	result.add(a.get(queries.get(i)));
}

return result;

전체 코드

public static List<Integer> circularArrayRotation(
	List<Integer> a,
	int k,
	List<Integer> queries
) {
	for(int i = 0; i < k; i++){
		int unshift = a.get(a.size() - 1);
		a.remove(a.size() - 1);
		a.add(0, unshift);
	}

	List<Integer> result = new ArrayList<>();

	for(int i = 0; i < queries.size(); i++){
		result.add(a.get(queries.get(i)));
	}

	return result;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글