54. [Java] 배열의 길이에 따라 다른 연산하기
https://school.programmers.co.kr/learn/courses/30/lessons/181854
- 정수 배열 arr과 정수 n이 매개변수로 주어진다.
- arr의 길이가 홀수라면
→ arr의 모든 짝수 인덱스 위치에 n을 더한 배열을 - arr의 길이가 짝수라면
→ arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return
- 1 ≤ arr의 길이 ≤ 1,000
- 1 ≤ arr의 원소 ≤ 1,000
- 1 ≤ n ≤ 1,000
정답코드
import java.util.*;
class Solution {
public int[] solution(int[] arr, int n) {
List<Integer> list = new ArrayList<>();
int start = (arr.length % 2 == 1) ? 0 : 1;
for (int i = 0; i < arr.length; i++) {
if (i % 2 == start) {
list.add(arr[i] + n);
} else {
list.add(arr[i]);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
배열 arr
이 주어지고, 정수 n
이 있을 때
- 배열의 길이가 홀수면 → **짝수 인덱스 (0, 2, 4...)**에
n
을 더하기 - 배열의 길이가 짝수면 → **홀수 인덱스 (1, 3, 5...)**에
n
을 더하기
여기서 어차피 반환할 배열의 길이는 같다. 요소에 다만 n을 더하는 것과 안 더하는 것의 차이이다.
n을 더하고 안 더하고 구별하는 기준점을 짜기가 생각보다 어려운 문제이다.
int start = (arr.length % 2 == 1) ? 0 : 1;
배열의 길이가 홀수면 start = 0 → 짝수 인덱스일때만 더해라
배열의 길이가 짝수면 start = 1 → 홀수 인덱스일때만 더해라
for (int i = 0; i < arr.length; i++) {
if (i % 2 == start) {
list.add(arr[i] + n);
} else {
list.add(arr[i]);
}
}
i
는 항상0, 1, 2, 3, ...
순으로 1씩 증가하는데, 이 때start
는 "어떤 인덱스에n
을 더해야 하는지"를 결정하는 기준이다.i % 2 == start
일 때 →n
더하고, 아니면 그대로 넣기
왜 이 로직이 가능한가?
이게 가능한 이유는 start
는 항상 0
또는 1
중 하나이기 때문이다. 쉽게 말해 홀수 판별 로직이랑 같은건데, start
는 숫자를 2
로 나눈 나머지이기 때문에 2
로 나눴을때 0
이면 짝, 1
이면 홀이다. i % 2
로 현재 인덱스 i
가 짝수인지 홀수인지를 판별할 수 있고,
i % 2 == start
일 때 →+n
- start가 1이면 홀수 인덱스일때만
+n
- start가 0이면 짝수 인덱스일때만
+n
- start가 1이면 홀수 인덱스일때만
- 그렇지 않을 때는 → 그대로 배열에 담는다.
오답
import java.util.*;
class Solution {
public int[] solution(int[] arr, int n) {
List<Integer> list = new ArrayList<>();
int len = arr.length;
if (len % 2 == 1) {
for (int i = 0; i < arr.length; i += 2) {
list.add(arr[i] + n);
}
} else {
for (int i = 1; i < arr.length; i += 2) {
list.add(arr[i] + n);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}

중복된 조건문 한 번만 쓰기
현재는 홀수/짝수 조건을 분기해서 for문을 두 번 쓰고 있는데, 인덱스 시작점을 start
변수로 바꿔서 중복을 줄일 수 있다. 그리고 분기점을 start
변수값을 기준으로 다시 잡아서 해결했다.
불필요한 else if 제거하기
첫 번째 조건이 아니라면 자동으로 두 번째 조건이니까 else if
쓰지 않고 그냥 else
로 처리해도 된다.