Codility - CyclicRotation(Lesson2)

Lee·2023년 5월 17일
0

알고리즘

목록 보기
26/34
post-thumbnail

문제 출처

문제 출처 : CyclicRotation

문제 이해하기 (번역)

N개의 정수로 구성된 배열 A가 주어집니다. 배열 회전은 각 요소가 하나의 인덱스에 의해 오른쪽으로 이동되고 배열의 마지막 요소가 첫 번째 위치로 이동됨을 의미합니다. 예를 들어, 배열 A = [3, 8, 9, 7, 6]의 회전은 [6, 3, 8, 9, 7]입니다(숫자는 한 인덱스만큼 오른쪽으로 이동하고 6은 첫 번째 위치로 이동됨).

이때, 배열 A의 각 원소들을 K번 이동했을 때의 결과값을 배열로 반환하는 문제이다.

주요 조건 이해하기 ⭐️

단순하게 배열의 원소들을 K번 이동하면 되는 문제이다.
주의할 점은 마지막 요소가 도달했을 때, 다시 첫 번째 위치로 돌아가야 한다는 점이다.

마지막 요소에 도달했을 때, 남은 K번째의 위치를 구하는 방법은 간단하다.
우선 현재 인덱스에서 K를 더한다.

예를 들어 N = 3 이고, A = {1, 2, 3}, K = 5 일 때

마지막 원소인 3의 인덱스는 2이고, 5를 더하면 7이 된다.
하지만 7은 인덱스 범위를 초과한다. 이 때 배열의 길이만큼 나눈 후 나머지 값을 배열의 인덱스로 활용하면
맞아 떨어진다.

풀이를 나열해보면

  1. 결과를 저장할 배열을 선언
  2. 만약 A의 길이가 1이면 K만큼 돌려도 답은 동일하기 때문에 A의 첫번째 원소를 반환
  3. A 배열을 탐색
  4. 새로운 인덱스 값을 구한다.
  5. 만약 새로운 인덱스의 값이 배열 A의 길이를 넘지 않으면 새로운 인덱스 위치에 값을 넣어준다.
  6. 새로운 인덱스 값이 배열 A의 길이를 초과한다면 새로운 인덱스와 배열 A의 길이를 나누고 나머지 값을 인덱스로 계산하여 대입한다.

제출 코드

// you can also use imports, for example:
// import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int[] solution(int[] A, int K) {
        // Implement your solution here

        // 1. 결과를 저장할 배열 선언
        int[] answer = new int[A.length];

        // 1-1. 만약 A의 길이가 1이면 K만큼 아무리 돌려도 답은 동일
        if (A.length == 1) {
            return new int[]{A[0]};
        }

        // 2. A 배열을 탐색
        for(int i = 0;  i < A.length; i++) {
            int newIdx = i + K;

            if (newIdx < A.length) {
                answer[newIdx] = A[i];
            } else {
                answer[newIdx % A.length] = A[i];
            }
        }

        return answer;
    }
}

0개의 댓글