안녕하세요, 작가 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차원 배열에서 두 숫자 사이의 최소 거리를 찾는 두 가지 방법을 다뤄보았습니다. 첫 번째 방법은 모든 쌍을 비교하여 최소 거리를 찾는 방식이며, 두 번째 방법은 배열을 정렬한 후 인접한 숫자 쌍을 비교하여 최소 거리를 찾는 방식입니다. 두 가지 방법 모두 이해하시는데 도움이 되길 바랍니다.
프로그래밍을 시작하는 모든 분께 이 예제가 도움이 되길 바랍니다. 앞으로도 다양한 유형의 문제를 통해 여러분의 학습을 도울 수 있도록 노력하겠습니다. 저장소를 활용하는 것은 좋은 프로그래밍 방법입니다. 감사합니다!
'프로그래밍 기초 > Java Festival' 카테고리의 다른 글
[Java Festival] Bonus05. 정수 오름차순 정렬하기 (0) | 2024.07.04 |
---|---|
[Java Festival] 22. 계단식 별 출력하기 (0) | 2024.07.04 |
[Java Festival] 20. 10진수 정수를 2진수로 변환하기 (0) | 2024.06.30 |
[Java Festival] 19. 단 수와 곱해질 수를 입력받아 구구단 출력하기 (0) | 2024.06.30 |
[Java Festival] Bonus 04. 배열의 인덱스 수만큼 별 출력하기 (0) | 2024.06.30 |