안녕하세요 코북입니다. 학원 다닐 때 풀었을 때 꽤나 어렵다고 생각했던 문제였는데, 다시 풀어보니 역시나 헷갈렸습니다. 예전만큼 헤매지는 않았지만 부족한 점이 많다고 생각돼 기록하러 왔습니다. 다음은 첫 번째 풀이입니다.
public class Java16 {
public static void main(String[] args) {
int[] point = {92, 32, 52, 9, 81, 2, 68};
// 거리 값을 저장할 배열
int size = 0; // 배열 크기
for(int i=1; i<point.length; i++)
{
size += i;
}
// System.out.println(size);
int[] dis = new int[size];
int min = 0; // dis 인덱스 번호
int a = 0; // point 인덱스 번호1
int b = 0; // point 인덱스 번호2
for(int i = 0, k = 0; i<point.length; i++)
{
for(int j = i+1; j<point.length; j++, k++)
{
dis[k] = Math.abs(point[i]-point[j]); // 거리의 절대값
if(dis[min]>dis[k]) // 최솟값 구하기
{
min = k; //** 작을 때 값을 바꿔줘야함
a = i;
b = j;
}
}
}
System.out.println(min); // 최솟값인 경우 dis의 인덱스 번호
System.out.println(dis[min]); // 거리 최솟값
System.out.println("result = [" + a +", "+ b + "]"); // 최솟값인 두 점
}
}
처음 풀었을 때는 위와 같이 거리 값을 저장할 배열은 만든 후에 배열에 값을 집어넣으면서 최솟값을 찾으려 하였습니다. 또한 최솟값을 찾을 때 비교 값을 변경해주지 않아 최솟값 또한 찾지 못하는 오류가 있었습니다. 이 부분들을 놓친 이유는 최솟값을 구하는 방법에 대한 개념이 정확하게 정리되지 않았기 때문인 것 같습니다. 그렇기 때문에 불필요한 배열을 만들었고 최솟값을 제대로 찾는 것도 실패했습니다. 다음은 두 번째 풀이입니다.
public class Java16_2 {
public static void main(String[] agrs) {
int[] point = {92, 32, 52, 9, 81, 2, 68};
int a = 0;
int b = 0;
int dis = Math.abs(point[0]-point[1]);
for(int i=0; i<point.length; i++)
{
for(int j=i+1; j<point.length; j++)
{
int min = Math.abs(point[i]-point[j]);
if(dis>min)
{
dis = min;
a=i;
b=j;
}
}
}
System.out.println("result = [" + a +", "+ b + "]");
}
}
불필요한 과정을 제거하여 훨씬 코드가 간결해졌습니다. + Math.abs()는 절대값을 구하는 메소드입니다.
'알고리즘' 카테고리의 다른 글
[Java] 버블정렬(Bubble sort) (0) | 2022.02.10 |
---|---|
[Java] 10진수 2진수로 변환 (0) | 2022.02.08 |
[Java]수열 n번째 항까지 출력 (0) | 2022.02.01 |
[Java]소인수분해 (0) | 2022.01.25 |
[Java]팩토리얼 - 재귀 함수 (0) | 2022.01.24 |