문제 url:
음계
문제 :
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Integer[] arr = new Integer[8];
for (int i = 0; i < 8; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Integer[] asc_arr = arr.clone();
Integer[] desc_arr = arr.clone();
Arrays.sort(asc_arr);
Arrays.sort(desc_arr,Collections.reverseOrder());
if(Arrays.toString(arr).equals(Arrays.toString(asc_arr))) {
System.out.println("ascending");
} else if(Arrays.toString(arr).equals(Arrays.toString(desc_arr))) {
System.out.println("descending");
} else {
System.out.println("mixed");
}
}
}
문제 자체는 간단하다. 하지만 어쩌다 보니 조금 어렵게 풀게 되었다.
간략히 해석하자면,
이전에, ArrayList에 대해서 공부를 하면서
Collections.sort와 ArrayList.sort()에 대해서 사용하면서
오름차순과 내림차순에 대해 공부를 해볼 수 있었는데,
이번에는 배열에 대한 오름차순과 내림차순을 사용하게 되었다.
이를 잠시 짚고 가자면,
java.util.Arrays
클래스에서 배열이나 리스트를 정렬할 때 import
해서 사용할 수 있다.
배열의 오름차순은 Arrays.sort()를 이용해서 할 수 있다.
Arrays.sort는 보다시피 Object 타입을 받는다. 그래서 int나 String과 같이 형변환이 된 상태에서 오름차순을 할 수 있다.
배열의 내림차순 역시 Arrays.sort()를 이용하는데,
위의 코드를 봤을때 처럼 뒤에 Collections.reverseOrder()를 내림차순이 가능하다.
여기서 끝내면 재미없다.
배열의 내림차순을 할 때, String은 되는데 int형이 안된다.
필자도 여기서 문제가 발생해 이를 공부하고 기록하고자 한 것이다.
int형과 같이 primitive(원시) 타입으로 하면 안되고 Wrapper 타입 즉, Reference(참조) Type 타입으로 변경한 후에 가능하다.
그래서 배열의 타입들이 전부 Integer(참조타입)으로 되어 있는 것이다.
아니 그러면 왜 Collections.reverseOrder()는 참조타입만 되는건가???
그 이유는 Collections.reverseOrder()는 제너릭을 타입으로 받기 때문에 참조타입만 가능한 것이다.
정말.. IT는 공부를 하면 할 수록 공부해야 할게 너무 많다.
개발자끼리는 싸우지 말고 으쌰으쌰 좋은말만 해야겠다.
위에서 까먹고 안해서 아래에서 진행한다.
clone은 말그대로 배열을 복사한다고 생각하면 된다.
그러나 여기서 중요한 점이 있다.
필자는 기존 배열은 놔두고(즉, 영향을 받지 않는) 기존 배열과 똑같은 값을 가진 배열이 필요로 했다.
그래서 깊은 복사를 하여 배열을 복사해야 하는데, 이때 사용하는 메서드가 clone()이다.
여기서 간략하게 깊은 복사와 얕은 복사에 대해서 알려주고 다음 시간에 깊은 복사와 얕은 복사에 대해 알아보겠다.
깊은 복사를 먼저 설명하면
이렇다고 볼 수 있다.
즉, B가 A와 같은 값을 가지게 복사를 하였지만! B가 변경되어도 A는 영향을 받지 않는다.
이 말이 깊은 복사의 핵심이다. (영향을 받지 않는다.)
그렇다면 얕은 복사를 설명하면
A와 B가 하나의 값을 같이 참조하고 있다고 생각하면 된다. 즉, A 혹은 B가 값을 변경시키면 그 값을 참조하는 모든 변수에 영향을 미친다고 생각하면 된다.
int[] a = {1,2,3,4}
int[] b = a;
이런식으로 변수 자체로 초기화를 시키게 되면 얕은복사가 이루어지는데,
여기서 b는 a의 값이 들어가 있지만! 실제로는 a의 주솟값이 저장되어 있다.
그래서 값이 변경되면 이를 참조하는 변수에 영향을 미칠 수 있는 것이다.
저의 블로그의 자랑거리라면, 하나의 코드에 안주하지 않는다는 것!, 물론 조건적이긴 하다만
어쨋거나 이것을 풀 때 너무 힘들게 풀었다.. 그래서 더 쉽게 풀 수 있는 방법을 찾아보니
Integer[] asc_arr = arr.clone();
Integer[] desc_arr = arr.clone();
↓
int[] asc_arr = {1, 2, 3, 4, 5, 6, 7, 8};
int[] desc_arr = {8, 7, 6, 5, 4, 3, 2, 1};
그냥 이렇게 바꿔주고 비교하면 끝이다...