본문 바로가기
프로그래밍 기초/Java Festival

[Java Festival] 21. 두 숫자 사이의 최소 거리를 찾기

by 제이투더문 2024. 7. 4.

 

 안녕하세요, 작가 J입니다. 이번에는 1차원 배열에서 두 개의 숫자를 뽑아 서로의 거리를 비교한 후, 거리가 가장 작은 숫자의 위치(index)를 출력하는 프로그램을 작성해 보겠습니다. 이 예제는 배열의 기본적인 사용법과 중첩 반복문을 활용하는 방법을 익히는 데 도움이 될 것입니다.

 

[Java Festival 21] 두 숫자 사이의 최소 거리를 찾기

아래와 같이 숫자가 담긴 1차원 배열이 주어졌을 때,
두 개의 숫자를 뽑아 서로의 거리를 비교한 후

거리가 가장 작은 숫자의 위치(index)를 출력하시오.

 

 

 

코드 풀이

코드 풀이 1: 모든 쌍을 비교하는 방식

package Ex;

public class Ex21 {

    public static void main(String[] args) {
        int[] point = {92, 32, 52, 9, 81, 2, 68};
        
        // 초기값 설정
        int minDistance = Math.abs(point[1] - point[0]);
        int index1 = 0, index2 = 1;
        
        // 두 숫자 사이의 최소 거리를 찾기 위해 모든 쌍을 비교
        for (int i = 0; i < point.length; i++) {
            for (int j = i + 1; j < point.length; j++) {
                int distance = Math.abs(point[i] - point[j]);
                if (distance < minDistance) {
                    minDistance = distance;
                    index1 = i;
                    index2 = j;
                }
            }
        }
        
        // 결과 출력
        System.out.println("result = [" + index1 + ", " + index2 + "]");
    }
}

 

1. 초기값 설정

 

  • int minDistance = Math.abs(point[1] - point[0]);: 첫 번째 두 숫자의 거리를 초기 최소 거리로 설정합니다.
  • int index1 = 0, index2 = 1;: 초기 최소 거리의 두 숫자의 인덱스를 설정합니다.
  • Math.abs는 주어진 숫자의 절대값을 반환합니다. 즉, 두 숫자의 차이가 음수일 경우에도 양수로 변환하여 비교할 수 있습니다.

2. 모든 쌍을 비교하여 최소 거리 찾기

 

  • 두 개의 중첩된 for 문을 사용하여 배열의 모든 숫자 쌍을 비교합니다.
  • int distance = Math.abs(point[i] - point[j]);: 현재 두 숫자의 거리를 계산합니다.
  • if (distance < minDistance) { ... }: 현재 거리가 최소 거리보다 작으면 최소 거리를 업데이트하고, 인덱스를 갱신합니다.

 

코드 풀이 2: 간단한 방식으로 최소 거리 찾기

이번에는 배열을 정렬한 후, 인접한 숫자 쌍을 비교하여 최소 거리를 찾는 방식으로 문제를 해결해 보겠습니다. 이 방식은 정렬 후 인접한 숫자들만 비교하므로 조금 더 효율적일 수 있습니다.

 

package Ex;

import java.util.Arrays;

public class Ex21Alternate {

    public static void main(String[] args) {
        int[] point = {92, 32, 52, 9, 81, 2, 68};
        
        // 원본 배열 복사
        int[] sortedPoints = Arrays.copyOf(point, point.length);
        
        // 배열 정렬
        Arrays.sort(sortedPoints);
        
        // 초기값 설정
        int minDistance = Math.abs(sortedPoints[1] - sortedPoints[0]);
        int num1 = sortedPoints[0], num2 = sortedPoints[1];
        
        // 인접한 숫자 쌍을 비교하여 최소 거리 찾기
        for (int i = 1; i < sortedPoints.length - 1; i++) {
            int distance = Math.abs(sortedPoints[i + 1] - sortedPoints[i]);
            if (distance < minDistance) {
                minDistance = distance;
                num1 = sortedPoints[i];
                num2 = sortedPoints[i + 1];
            }
        }
        
        // 원본 배열에서 인덱스 찾기
        int index1 = -1, index2 = -1;
        for (int i = 0; i < point.length; i++) {
            if (point[i] == num1 && index1 == -1) {
                index1 = i;
            } else if (point[i] == num2 && index2 == -1) {
                index2 = i;
            }
        }
        
        // 결과 출력
        System.out.println("result = [" + index1 + ", " + index2 + "]");
    }
}

 

1. 배열 복사 및 정렬

 

  • int[] sortedPoints = Arrays.copyOf(point, point.length);: 원본 배열을 복사하여 새로운 배열을 만듭니다.
  • Arrays.sort(sortedPoints);: 배열을 오름차순으로 정렬합니다.
  • Arrays.sort는 배열의 요소를 오름차순으로 정렬하는 메서드입니다.

2. 초기값 설정

 

  • int minDistance = Math.abs(sortedPoints[1] - sortedPoints[0]);: 첫 번째 두 숫자의 거리를 초기 최소 거리로 설정합니다.
  • int num1 = sortedPoints[0], num2 = sortedPoints[1];: 초기 최소 거리의 두 숫자를 저장합니다.

3. 인접한 숫자 쌍을 비교하여 최소 거리 찾기

 

  • 정렬된 배열에서 인접한 숫자들만 비교하여 최소 거리를 찾습니다.
  • for (int i = 1; i < sortedPoints.length - 1; i++) { ... }: 인접한 숫자들을 비교합니다.
  • if (distance < minDistance) { ... }: 현재 거리가 최소 거리보다 작으면 최소 거리를 업데이트하고, 숫자를 갱신합니다.

4. 원본 배열에서 인덱스 찾기

 

  • 정렬된 배열에서 찾은 두 숫자의 원본 배열에서의 인덱스를 찾습니다.
  • for (int i = 0; i < point.length; i++) { ... }: 원본 배열에서 숫자의 인덱스를 찾습니다.

 

마무리

 

 이번 예제에서는 주어진 1차원 배열에서 두 숫자 사이의 최소 거리를 찾는 두 가지 방법을 다뤄보았습니다. 첫 번째 방법은 모든 쌍을 비교하여 최소 거리를 찾는 방식이며, 두 번째 방법은 배열을 정렬한 후 인접한 숫자 쌍을 비교하여 최소 거리를 찾는 방식입니다. 두 가지 방법 모두 이해하시는데 도움이 되길 바랍니다.

 

 프로그래밍을 시작하는 모든 분께 이 예제가 도움이 되길 바랍니다. 앞으로도 다양한 유형의 문제를 통해 여러분의 학습을 도울 수 있도록 노력하겠습니다. 저장소를 활용하는 것은 좋은 프로그래밍 방법입니다. 감사합니다!