다음 입사 문제
- 1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수를 작성하시오.
- (단 점들의 배열은 모두 정렬되어있다고 가정한다.)
- 예를들어 S={1, 3, 4, 8, 13, 17, 20} 이 주어졌다면, 결과값은 (3, 4)가 되어야 한다.
-
- 거리가 짧은 것이 한쌍을 초과한다면 모든 쌍을 출력해야 한다.
문제 살짝 수정
- Math.abs() 메소드를 통해 배열이 오름차순으로 정렬되어 있지 않아도 점 사이의 최솟값을 구할 수 있게 하였다.
- 배열을 난수로 받아 만들 수도 있지만 Scanner를 통해 사용자에게 직접 배열을 입력받을 수 있게 구현하였다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 사용자로부터 배열 입력받기
System.out.print("배열의 요소를 몇개로 하시겠습니까? : ");
int arrNum = sc.nextInt();
int S[] = new int[arrNum];
for (int i = 0; i < S.length; i++) {
System.out.printf("%d번째 수를 입력하세요 : ", i+1);
S[i] = sc.nextInt();
}
// 배열의 요소 가운데 최소 거리를 구하기 위한 부분 -------------------------
int minDistance = 10000;
for (int i = 0; i < S.length - 1; i++) {
for (int j = i + 1; j < S.length; j++) {
if (minDistance > Math.abs(S[i] - S[j])) {
minDistance = Math.abs(S[i] - S[j]);
}
}
}
// ---------------------------------------------------------------
// 위에서 구한 최소 거리 minDistance을 통해 점 사이의 거리가 minDistance가 되는 쌍들을 골라 출력하기
while(true) {
for (int i = 0; i < S.length - 1; i++) {
for (int j = i + 1; j < S.length; j++) {
if (minDistance == Math.abs(S[i] - S[j])) {
System.out.printf("최소값 : %d (%d, %d)\n", minDistance, S[i], S[j]);
}
}
}
break;
}
}
}
고쳐야할 점
- 사용자가 배열을 입력했을 때 중복이 되는 경우는 거르지 않았다. 이는 for문과 if문을 통해 걸러낼 수 있으니... 이 글을 보는 분들은 한번 시도해보시길
- 글을 쓰면서 실행화면을 띄우고 보니 입력한 배열을 마지막에 한번 보여주는 것도 나쁘지 않았겠다.
반응형