[배열 정렬 - Easy]

< 문제 >

  • 개요

n개의 정수를 가진 배열이 있다. 이 배열은 양의정수와 음의 정수를 모두 가지고 있다. 이제 당신은 이 배열을 좀 특별한 방법으로 정렬해야 한다. 정렬이 되고 난 후, 음의 정수는 앞쪽에 양의정수는 뒷쪽에 있어야 한다. 또한 양의정수와 음의정수의 순서에는 변함이 없어야 한다. (20분)

  • 예상 결과

예상 결과는 하기 코드 실행시 예상되는 결과 값이다.

 결과 1 : [-1, 1, 3, -2, 2 ]  >> [-1, -2, 1, 3, 2]
 결과 2 : [-5, 10, 15, -15, 4, -70]  >> [-5, -15, -70, 10, 15, 4] 

< 정답풀이 >

 public class test01 {

	private static final String result = "결과 : S=%s의 거리가 짧은 쌍 >> %d,  %d";

	public static void main( String[] args ) {
		// 시작시간 기록
		long startTime = System.currentTimeMillis();

		// STEP 1. TEST 데이터 준비
		int[] testArr = { 1, 3, 4, 8, 13, 17, 20 };

		// STEP 2. 최소 거리
		int[] resultArr = getMinDistance( testArr );
		System.out.println( String.format( result, Arrays.toString( testArr ), resultArr[0], resultArr[1] ) );

		// 종료시간 기록
		long endTime = System.currentTimeMillis() - startTime;
		System.out.println( "소요시간 : " + endTime + "ms." );
	}

	/**
	 * <PRE>
	 * 거리가 짧은 쌍을 리턴한다.
	 * </PRE>
	 * 
	 * @param testArr : 숫자 배열
	 * @return int [] : 거리가 짧은 쌍의 배열
	 */
	public static int[] getMinDistance( int[] testArr ) {
		int[] resultArr = new int[2]; // 결과 값 저장을 위한 배열
		int minDist = -1;             // 최소거리(초기값 -1)

		/*
		 * 입력받은 배열의 값을 2개씩 꺼내서 두 값 사이의 절대값을 구함. 
		 * 절대값이 작은 두 값이 결과값이 된다.
		 */
		for ( int inx = 1 ; inx < testArr.length ; inx++ ) {
			int firstNum = testArr[inx - 1];
			int secondNum = testArr[inx];

			// 최소거리를 구한다.(절대값)
			int dist = Math.abs( secondNum - firstNum );

			// 최소거리가 더 적은 경우 갱신한다.
			if ( minDist == -1 || minDist > dist ) {
				minDist = dist;
				resultArr[0] = firstNum;
				resultArr[1] = secondNum;
			}
		}
		return resultArr;
	}
}