Skip to main content

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
  • 그렇지 않을 때는 → 그대로 배열에 담는다.

오답

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();
    }
}
image.png

중복된 조건문 한 번만 쓰기

현재는 홀수/짝수 조건을 분기해서 for문을 두 번 쓰고 있는데, 인덱스 시작점을 start 변수로 바꿔서 중복을 줄일 수 있다. 그리고 분기점을 start 변수값을 기준으로 다시 잡아서 해결했다.

불필요한 else if 제거하기

첫 번째 조건이 아니라면 자동으로 두 번째 조건이니까 else if 쓰지 않고 그냥 else로 처리해도 된다.