1 이상 8,000,000,000 이하인 자연수(정수)를 매개변수로 받고 내림차순으로 출력하는 문제이다.
ex ) 118372 ➡️ 873211
한 번에 정수로 받기 때문에 문자열 배열로 바꾸어 sort()
를 하였다.
String[] splitNum = (n + "").split("");
Arrays.sort(splitNum);
이렇게 할 경우 default
로 오름차순으로 정렬이된다.
하지만 내림차순을 해야한다.
내림차순을 하기 위해선
Arrays.sort(splitNum, Collections.reverseOrder());
Collections.reverseOrder())
을 추가해주어야 했다.
별 거 아니지만 📌 제일 작은 수 제거하기 문제와 비교하기 위해 작성을 해보았다.
전에 비슷한 문제를 해결한 적이 있다.
내가 처음에 제곱수를 판별하기 위해서
if(n == Math.sqrt(n) * Math.sqrt(n)) ....
이렇게 작성을 하였다.
하지만 계속 오류가 났다.
잘 생각해보니 이렇게 할 경우 정수가 아닌 실수도 나올 수 있다는 것이다.
이 문제에선 양의 정수(자연수) 가 나와야 한다.
반대로
if(n % Math.sqrt(n) == 0) ....
이렇게 한다면 정수만 나올 것이라고 생각했다.
조건을 바꾸었지만 채점 시에 틀리는 테스트가 많아서 Math.sqrt()
를 보니
하지만
Math.sqrt(n)
을 하게 될 경우 타입이 double
로 나오게 된다.
long
타입으로 나와야 하기 때문에 형변환을 시켜주었다.
answer = (long)((Math.sqrt(n) + 1) * (Math.sqrt(n) + 1));
정수 배열에서 가장 작은 수를 제거한 후 나머지 정수를 배열로 출력하는 것이다.
ex ) [3, 7, 2, 10, 18] ➡️ [3, 7, 10, 18]
정렬이 되어있지 않고 최소값만 제거한 후 입력 그대로 출력이 되어야한다.
ArrayList
로 만들어 remove()
를 사용하면 쉽게 풀 수 있는 문제이다.
하지만 ArrayList
를 사용하지 않고 문제를 해결하고 싶었다.
1. 먼저 내림차순으로 정렬을 한다.
2. 정렬된 배열에서 맨 뒤 정수만 빼고 배열을 만든다.
3. 처음 입력값의 순서로 돌리기 위해 다시 섞어준다.
📌 정수 내림차순으로 배치하기에서 사용했던 Collections.reverseOrder()
를 사용했다.
int[] answer = new int[arr.length - 1];
Arrays.sort(answer, Collections.reverseOrder());
이렇게 쓴 결과 계속 빨간줄이 그어졌다.
지금 내림차순으로 정렬을 하는 배열은 int
타입의 배열이다.
Collections.reverseOrder()
를 사용하기 위해선 참조형 변수 (String, Wrapper Class...) 여야했다.
그것을 모르고 그냥 int[]
을 정렬하려하니 계속 오류가 났던 것이다.
int[]
을 Integer[]
로 변환해주었다.
Integer[] integerArray = Arrays.stream(arr).boxed().toArray(Integer[]::new);
Arrays.stream
을 사용하여야했다.
stream
을 잘 모르지만
보이는 코드만 해석하기 위해 조금 알아보았다.
Integer[] integerArray = Arrays.stream(arr) // arr 을 stream 으로 원소 하나하나 돌기
.boxed() // 원시타입을 감싸 래퍼클래스로 구성된 stream 으로 만들기
.toArray(Integer[]::new); // Integer Array 로 만들기
Wrapper Class (Integer)
로 만들어준 뒤, Collections.reverseOrder()
를 사용할 수 있었다.
맨 뒤에 있는 값은 출력하지 않도록 for
가 그 앞까지만 돌게 하였다.
입력으로 받은 arr
와 비교하여 원래 순서대로 배치될 수 있도록 코드를 작성하였다.
int k = 0;
for (int i = 0; i < arr.length; i++) {
int arrayNumber = arr[i];
for (int j = 0; j < tempArray.length; j++) {
if (arrayNumber == tempArray[j]) {
answer[k] = tempArray[j];
k++;
}
}
}
이렇게 했을 때, 만약 arr
의 길이가 1이라면 answer
는 []
빈 배열로 출력이 되었다.
길이가 1이라면 answer
는 arr
이 그대로 출력이 되어야 하기 때문에
조건문을 걸어 해결할 수 있었다.
if (arr.length == 1) {
int[] length1 = {-1};
answer = length1;
}
String[] splitNum = (n + "").split("");
: 정수에 ""
빈 문자열을 더해 문자열로 바꾸어줄 수 있다.Math.sqrt(N)
: double
타입이 리턴된다.Arrays.sort()
를 내림차순으로 하고 싶으면 Collections.reverseOrder()
를 사용한다.Collections.reverseOrder()
는 참조형 타입(Wrapper Class, String..) 을 넣어주어야한다.int[]
를 Integer[]
로 바꾸기 위해선 stream
을 사용할 수 있다.Integer[] integerArray = Arrays.stream(arr).boxed().toArray(Integer[]::new);
매번 문제를 그냥 풀기만 하면 되지라는 생각에 쉽게 풀었던 것다.
배열의 크기를 모르거나 계속 변할 땐 무조건 ArrayList를 사용했었다.
이번에 풀 때는 ArrayList 를 사용하지 않고 풀어보았다.
이번 문제들은 풀면서 다 재미있었다.