본문 바로가기
Algorithm/Programmers

[Programmers] Lv.0 | 배열 회전시키기 | Java

by unknownomad 2025. 10. 16.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/120844

 

풀이

가독성 측면

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int length  = numbers.length;
        int[] answer = new int[length];
        
        if (direction.equals("right")) {
            answer[0] = numbers[length - 1];
            for (int i = 0; i < length - 1; i++) {
                answer[i + 1] = numbers[i];
            }
        } else if (direction.equals("left")) {
            for (int i = 0; i < length - 1; i ++) {
                answer[i] = numbers[i + 1];
            }
            answer[length - 1] = numbers[0];
        }
        
        return answer;
    }
}

짧은 코드 측면

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int length  = numbers.length;
        int[] answer = new int[length];
        
        for (int i = 0; i < length; i++) {
            if (direction.equals("right")) {
                answer[(i + 1) % length] = numbers[i];
            } else if (direction.equals("left")) {
                answer[i] = numbers[(i + 1) % length];
            }
        }
        
        return answer;
    }
}

 


모듈로(modulo) 연산이란?

두 수를 나눈 후 나머지를 구하는 연산

5 % 3 → 2   // 5 나누기 3의 나머지
10 % 4 → 2
7 % 7 → 0

 

% len의 역할

배열의 인덱스를 회전하거나 순환시킬 때 배열 길이(len)로 나눈 나머지를 이용하면

  • 범위를 자동으로 0~len-1 사이로 제한할 수 있음
  • 배열의 끝에 도달해도 다시 처음으로 돌아가게 만들 수 있음

예시: 회전 인덱스

  • 배열: [a, b, c]
  • 길이: 3
(i + 1) % 3
i (i + 1) % 3 인덱스 의미
0 1 b로 이동
1 2 c로 이동
2 0 다시 a로 회전

Java에서 %는 기본 연산자

  • Java에서 %는 산술 연산자 중 하나
int a = 10 % 3; // a = 1
  • int끼리 쓰면 int 결과
  • double에도 사용 가능하지만, 주로 정수에서 순환 로직에 많이 사용됨

정리

항목 내용
% 모듈로 연산자 (나머지 계산)
% len 배열 인덱스를 순환시키기 위해 사용
자주 쓰이는 곳 원형 큐, 회전 로직, 순환 인덱스 처리 등

 


Java의 % 연산: 나머지 연산 (modulo ≠ remainder)

  • Java에서 %는 수학적 모듈로(modulo) 연산이 아니라, 나머지(remainder) 연산
  • 그래서 음수를 다룰 때 수학적 기대와 다르게 작동할 수 있음

예제: Java에서 % 결과

 5 % 3 = 2    // 정상
-5 % 3 = -2   // ❗️음수 결과
 5 % -3 = 2
-5 % -3 = -2
피연산자  나머지  결과 설명
-5 % 3 -2 Java는 왼쪽 피연산자의 부호를 따름

수학적인 모듈로(modulo) 기대 결과

항상 0 이상의 값이 나오는 걸 기대 (0 ≤ 결과 < 나누는 수)

-5 mod 3 = 1   // 왜냐면: (-5 ≡ 1 mod 3)

 

안전한 음수 모듈로 처리 방법 (Java에서 양수로 만들기)

Java에서 수학적 모듈로처럼 동작하게 만들고 싶으면, 아래처럼 처리

int result = ((a % n) + n) % n;

예시

int a = -5;
int n = 3;
int result = ((a % n) + n) % n;  // ((-5 % 3) + 3) % 3 → (−2 + 3) % 3 = 1
  • 이제 결과는 항상 0 이상 n 미만의 값이 보장됨

정리

항목 설명
%는 Java에서 나머지 연산자 (modulo 아님)
음수에서의 % 결과 왼쪽 피연산자의 부호를 따라감 (-5 % 3 = -2)
수학적 modulo처럼 쓰기 ((a % n) + n) % n
언제 쓰는지 - 회전 인덱스나 순환 연산 시 - 항상 0~(n-1) 범위가 필요할 때

예제: 회전 배열에서 음수 인덱스 처리

int[] arr = {1, 2, 3};
int len = arr.length;
int i = -1;

int rotatedIndex = ((i % len) + len) % len;  // 안전한 인덱스: 2
  • ➡ -1 인덱스는 배열의 마지막 요소로 순환됨

댓글