< 문제 >
- 개요
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;
}
}