[코테]코딜리티 - CycliRotation

Inung_92·2023년 8월 21일
1

Coding-Test

목록 보기
4/11
post-thumbnail

문제

문제 요약

  • int[] A와 int K가 매개변수로 주어진다.
  • A는 무작위 숫자를 가진 배열이고, K는 로테이션 횟수이다.
  • K만큼 우측으로 이동하며, A의 길이를 벗어난 요소들은 0번째부터 다시 위치한다.
  • 즉, 로테이션을 K만큼 돌면서 맨 마지막 위치의 요소가 맨 첫번째로 돌아오는 순환구조이다.
  • 이 때, K만큼 로테이션을 수행한 배열의 결과를 반환한다.
  • 0 <= A, K <= 100의 범위를 가진다.
  • -1,000 <= A의 요소 <= 1,000의 범위를 가진다.

문제 분석

나는 다음 단계에 따라 문제를 분석하였다.

  • A의 길이 만큼 빈 배열을 생성한다.
  • 로테이션 동안 이동범위를 계산하기 위해 (현재 인덱스 + K) % A의 길이를 통해 이동한 위치의 index에 대입한다.
  • 대입이 완료된 배열을 반환한다.

여기서 조금 헷갈렸던 부분은 (index + K) % A.length 부분이다. 예를 들어 index = 0이고, K = 3이다. 그리고 A.length = 5라고 가정했을 때, 3 % 5 = ? 와 같은 식이 성립된다. 여기서 잘못 이해하면 3 % 5는 소수점이 아닌가? 라고 생각 할 수도 있다.
하지만 프로그래밍 언어에서는 3을 5로 나눌 수 없다고 판단하여 몫을 0으로 유지하고 나머지로 왼쪽 값을 그대로 반환해준다. 즉 3 % 5 = 3이 되는 것이다. 이 부분을 확실히 하고 넘어가자.

쉽게 이야기하면 연산자를 기준으로 왼쪽 숫자가 오른쪽 숫자보다 작다면 나머지는 왼쪽 숫자가 된다.

슈도코드

A.length만큼의 int[] 생성

for(int[] 길이만큼){
	int[](i + K) % A.length = A[i]로 대입
}

결과 반환

구현코드

import java.util.Arrays;
import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[] A, int K) {
        int[] answer = new int[A.length];

        for(int i = 0; i < A.length; i++){
            answer[(i+K) % A.length] = A[i];
        }
         return answer;
    }
}
profile
서핑하는 개발자🏄🏽

0개의 댓글