알고리즘

[Java] 가까운 거리 찾기 (1차원)

코북 2022. 2. 8. 14:52

 

 안녕하세요 코북입니다. 학원 다닐 때 풀었을 때 꽤나 어렵다고 생각했던 문제였는데, 다시 풀어보니 역시나 헷갈렸습니다. 예전만큼 헤매지는 않았지만 부족한 점이 많다고 생각돼 기록하러 왔습니다. 다음은 첫 번째 풀이입니다.

 

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()는 절대값을 구하는 메소드입니다.