문제
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 인덱스는 배열의 마지막 요소로 순환됨
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers] Lv.0 | 공 던지기 | Java (0) | 2025.10.17 |
---|---|
[Programmers] Lv.0 | 주사위의 개수 | Java (0) | 2025.10.15 |
[Programmers] Lv.0 | 합성수 찾기 | Java (0) | 2025.10.14 |
[Programmers] Lv.0 | 최댓값 만들기(1) | Java (0) | 2025.10.13 |
[Programmers] Lv.0 | 팩토리얼 | Java (0) | 2025.10.12 |
댓글