본문 바로가기
자격증·공부 아카이브/Java 기초

Java 배열 문제 풀이: 조건 필터링·배수·정렬·가장 가까운 두 수

by 쑥쑥자라나라 2026. 7. 30.
728x90

Java 배열 문제는 대부분 세 단계로 풀린다. 배열을 한 번 순회하며 조건에 맞는 값을 고르거나, 정렬해서 순서를 바꾸거나, 두 원소를 비교해 최솟값을 갱신한다. 이 글에서는 X보다 작은 수 찾기, 오름차순 정렬, 차이가 가장 작은 두 수 찾기를 하나의 흐름으로 연결한다.

배열 선언과 반복문이 아직 낯설다면 Java 조건문·반복문·배열 코딩테스트 입문을 먼저 읽고 실전 문제로 넘어오면 된다.

풀이 선택: 조건 검색은 한 번 순회, 전체 순서 변경은 정렬, 모든 두 값의 비교는 이중 반복문을 사용한다.

같은 배열도 문제의 목표에 따라 필터링·정렬·두 값 비교로 처리 방식이 달라진다

1. 배열 입력과 순회는 length를 기준으로 한다

배열 크기 N을 입력받았다면 new int[N]으로 공간을 만든다. 입력과 탐색의 반복 조건은 숫자 5나 7을 직접 쓰지 않고 numbers.length를 사용해야 배열 크기가 바뀌어도 코드가 그대로 동작한다.

Scanner sc = new Scanner(System.in);

System.out.print("배열 크기 N: ");
int n = sc.nextInt();

if (n <= 0) {
    throw new IllegalArgumentException("배열 크기는 1 이상이어야 합니다.");
}

int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++) {
    numbers[i] = sc.nextInt();
}
문제 목표핵심 도구시간 복잡도원본 배열
조건에 맞는 값 찾기한 번 순회 + ifO(N)유지
오름차순 정렬Arrays.sort()일반적으로 O(N log N)변경
가장 가까운 두 값 찾기이중 반복문O(N²)유지

2. X보다 작은 수만 출력하기

배열을 처음부터 끝까지 확인하면서 현재 값이 x보다 작은 경우에만 출력한다. 조건을 x > numbers[i]로 써도 같지만, 문제 문장과 같은 순서인 numbers[i] < x가 더 빠르게 읽힌다.

static void printLessThan(int[] numbers, int x) {
    for (int number : numbers) {
        if (number < x) {
            System.out.print(number + " ");
        }
    }
    System.out.println();
}
numbers = [12, 3, 8, 1, 9], x = 8
결과: 3 1

number == x인 값은 포함하지 않는다. 조건이 “X 이하”라면 그때는 <=를 사용해야 한다. 검색 문제에서는 이 한 글자 차이가 오답을 만든다.

3. 3의 배수만 골라 출력하기

원문 17의 문제도 같은 필터링 구조다. 기준값과 비교하는 대신 number % 3 == 0으로 나머지를 검사한다. 0도 3으로 나누어떨어지므로 문제에서 양수만 요구한다면 number > 0 조건을 함께 둔다.

static void printMultiplesOfThree(int[] numbers) {
    for (int number : numbers) {
        if (number % 3 == 0) {
            System.out.print(number + " ");
        }
    }
    System.out.println();
}
numbers = [2, 3, 6, 7, 9]
결과: 3 6 9

4. Arrays.sort()로 오름차순 정렬하기

Arrays.sort(numbers)는 전달한 배열 자체의 순서를 바꾼다. 정렬 전 배열도 이후에 사용해야 한다면 Arrays.copyOf()로 복사본을 만든 뒤 정렬한다.

static int[] sortedCopy(int[] numbers) {
    int[] copy = Arrays.copyOf(numbers, numbers.length);
    Arrays.sort(copy);
    return copy;
}
원본: [5, 2, 4, 1, 3]
정렬: [1, 2, 3, 4, 5]

주의: int[] copy = numbers;는 복사가 아니다. 두 변수가 같은 배열을 가리키므로 copy를 정렬하면 numbers도 함께 바뀐다.

728x90

5. 차이가 가장 작은 두 수의 인덱스 찾기

모든 두 원소 조합을 비교하되 같은 원소를 자기 자신과 비교하면 안 된다. 바깥 인덱스를 i, 안쪽 인덱스를 j = i + 1에서 시작하면 자기 비교와 순서만 바뀐 중복 비교를 동시에 없앨 수 있다.

static int[] findClosestPair(int[] numbers) {
    if (numbers.length < 2) {
        throw new IllegalArgumentException("원소가 2개 이상 필요합니다.");
    }

    long minDifference = Long.MAX_VALUE;
    int leftIndex = -1;
    int rightIndex = -1;

    for (int i = 0; i < numbers.length - 1; i++) {
        for (int j = i + 1; j < numbers.length; j++) {
            long difference = Math.abs((long) numbers[i] - numbers[j]);

            if (difference < minDifference) {
                minDifference = difference;
                leftIndex = i;
                rightIndex = j;
            }
        }
    }

    return new int[] {leftIndex, rightIndex};
}
numbers = [92, 32, 52, 9, 81, 2, 68]
가장 가까운 인덱스: [3, 5]
값: 9, 2
차이: 7

point[j] != point[i]처럼 값이 다른지 검사하면 같은 값이 서로 다른 위치에 있을 때 정답인 차이 0을 놓친다. 비교해야 하는 것은 값의 동일 여부가 아니라 서로 다른 인덱스인지이며, j = i + 1이 이를 보장한다.

배열이 매우 크다면 정렬 후 이웃만 비교

정렬된 배열에서는 차이가 가장 작은 두 값이 반드시 서로 이웃한다. 따라서 값과 원래 인덱스를 함께 저장해 정렬한 뒤 인접 원소만 비교하면 O(N log N)으로 줄일 수 있다. 다만 초급 문제나 작은 배열에서는 원래 인덱스를 그대로 유지하는 이중 반복문 풀이가 더 단순하다.

6. 네 문제를 한 번에 실행하는 전체 코드

import java.util.Arrays;

public class ArrayPractice {
    public static void main(String[] args) {
        int[] numbers = {92, 32, 52, 9, 81, 2, 68};

        System.out.print("50보다 작은 수: ");
        printLessThan(numbers, 50);

        System.out.print("3의 배수: ");
        printMultiplesOfThree(numbers);

        int[] sorted = sortedCopy(numbers);
        System.out.println("원본: " + Arrays.toString(numbers));
        System.out.println("정렬: " + Arrays.toString(sorted));

        int[] pair = findClosestPair(numbers);
        long difference = Math.abs((long) numbers[pair[0]] - numbers[pair[1]]);

        System.out.println("가장 가까운 인덱스: " + Arrays.toString(pair));
        System.out.println("값: " + numbers[pair[0]] + ", " + numbers[pair[1]]);
        System.out.println("차이: " + difference);
    }

    static void printLessThan(int[] numbers, int x) {
        for (int number : numbers) {
            if (number < x) {
                System.out.print(number + " ");
            }
        }
        System.out.println();
    }

    static void printMultiplesOfThree(int[] numbers) {
        for (int number : numbers) {
            if (number % 3 == 0) {
                System.out.print(number + " ");
            }
        }
        System.out.println();
    }

    static int[] sortedCopy(int[] numbers) {
        int[] copy = Arrays.copyOf(numbers, numbers.length);
        Arrays.sort(copy);
        return copy;
    }

    static int[] findClosestPair(int[] numbers) {
        if (numbers.length < 2) {
            throw new IllegalArgumentException("원소가 2개 이상 필요합니다.");
        }

        long minDifference = Long.MAX_VALUE;
        int leftIndex = -1;
        int rightIndex = -1;

        for (int i = 0; i < numbers.length - 1; i++) {
            for (int j = i + 1; j < numbers.length; j++) {
                long difference = Math.abs((long) numbers[i] - numbers[j]);
                if (difference < minDifference) {
                    minDifference = difference;
                    leftIndex = i;
                    rightIndex = j;
                }
            }
        }
        return new int[] {leftIndex, rightIndex};
    }
}

7. 배열 문제에서 자주 틀리는 부분

반복 횟수를 숫자로 고정하는 경우

i < 7은 배열 길이가 바뀌면 일부를 확인하지 않거나 ArrayIndexOutOfBoundsException을 만든다. 항상 numbers.length를 기준으로 순회한다.

최소 차이 초기값을 100으로 두는 경우

실제 최소 차이가 100보다 크면 한 번도 갱신되지 않는다. 가능한 최댓값인 Long.MAX_VALUE로 시작하면 입력 범위에 덜 의존한다.

Math.min()이 인덱스를 찾아준다고 생각하는 경우

Math.min(a, b)는 두 값 중 작은 값만 반환한다. 가장 작은 차이와 그때의 인덱스를 함께 기억하려면 조건문 안에서 minDifference, leftIndex, rightIndex를 동시에 갱신해야 한다.

Arrays.sort() 이후 원본 순서를 기대하는 경우

Arrays.sort()는 원본을 직접 변경한다. 원래 인덱스가 필요한 문제라면 복사본을 정렬하거나 값과 인덱스를 한 쌍으로 묶어야 한다.

핵심 요약

  • 조건 필터링은 배열을 한 번 순회하며 if로 고른다.
  • 배수 판별은 나머지가 0인지 검사하며, 0 포함 여부는 문제 조건으로 결정한다.
  • Arrays.sort()는 원본을 바꾸므로 필요하면 먼저 복사한다.
  • 두 원소 조합은 j = i + 1로 시작해 자기 비교와 중복 비교를 막는다.
  • 차이는 Math.abs()로 계산하고 최솟값과 인덱스를 함께 갱신한다.
  • 배열 반복 조건은 하드코딩 대신 array.length를 사용한다.
728x90