
이 문제는 값을 받을 때마다 뒤집은 다음 해당 원소들을 오름차순으로 정렬하는 문제이다. 이번 문제도 이전 문제처럼 우선순위 큐를 이용하면 쉽게 정렬되겠다! 라고 생각했었다.
여기서 왜 sort를 사용하지 않았냐고 생각할 수도 있겠지만..
실은 나도 잘 모르겠다 ㅋㅎ 그냥... 문뜩 우선 순위큐가 쉽게 정렬되는 것 같아서 공부할 겸 써봐야지! 했는데 딸깍 되는건 아니였다..
뭐 이참에 공부하고 좋은 것 같아서 계속 이걸 활용해서 해결해봤다.
package test12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Ox12_Q2_2 {
static String [] strArr;
// 백준 5648 S5 역원소 정렬
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 첫 줄 먼저 체크
strArr = br.readLine().split(" ");
int n = Integer.parseInt(strArr[0]);
PriorityQueue<Long> priQue = new PriorityQueue<Long>();
int start ; // 반복문 시작할 인덱스 번호
int linecnt = 0;
while(priQue.size()<n) {
// 첫 줄인 경우
if(priQue.isEmpty()&& linecnt == 0) {
start = 1;
}
// 값이 있다는 것은 무조건 첫 줄이 아니므로, 반복문 시작 인덱스 0으로 지정
else {
start = 0;
strArr = br.readLine().split(" ");
}
for(int i = start; i<strArr.length; i++) {
if(strArr[i].equals("")) {
continue;
}
// 우선순위que에 reverse된 숫자 추가
String temp = strArr[i];
priQue.add(returnLong(temp));
}// for fin
linecnt++;
} // while fin
// priQue 안의 값들 sb에 추가
while(!priQue.isEmpty()) {
sb.append(priQue.poll()).append("\n");
}
// 이렇게 poll 안하고 그냥 추가할 때는 똑바로 정렬되지 않음
// for (int i : priQue) {
// sb.append(i).append("\n");
// }
br.close();
System.out.println(sb.toString().trim());
}
// String으로 된 숫자인자 받아서, 역순으로 변경
public static long returnLong(String strInt) {
// string은 reverse()가 없기에, StringBuilder를 활용함
StringBuilder tempSb = new StringBuilder();
String reverseStr = tempSb.append(strInt).reverse().toString();
long reverseInt = Long.parseLong(reverseStr);
return reverseInt;
}
}
문제 풀이 과정은 다음과 같다.
이 문제 풀이에 대해 처음 고민했던 부분은 예제 1에서 첫 문장
10 5 2233 이부분이다.
기존 문제들은 한 문장에 n과 이후 값들이 주어지면 매너있게..
10
5 3 6 ...
이런느낌으로 구분지어줬는데 이 문제는 한 문장에 개판으로 값을
주는 걸 보고 굉장히 싸가지없다고 생각했다.
암튼 그래서 첫 문장을 배열화 해서 n을 구분 짓고, 이후의 값들을 반복문을 통해 받는 느낌으로 구현했다. strArr를 static으로 선언하였기에,
계속 반복해서 체크하기 쉽고 문장마다 br.readLine().split(" ") 통해 오류 없이 구분되므로 값을 오류 없이 입력받을 수 있었다.
다음으로 숫자지만 현재는 문자열로 값을 받고 있고, 그러면 바로 reverse를 활용하면 역정렬이 될 것이라고 생각했다.
하지만, String에는 reverse()가 없고, StringBuilder에만 존재하기에
이를 활용하기 위해 returnLong 메소드를 만들어서 코드를 깔끔하게 만들어주었다.
문자를 받으면, 이를 StringBuilder에 추가하고, revese해준다음 Long타입으로 변경해주는 구문이다. ( 입력 받는 값의 최대가 10^12 이므로 Long 타입이다.)
마지막으로 반복하여 reverse 된 숫자 값들을 priQue (우선순위 큐)에 저장해주고, 이 문제에선 인자를 하나만 받으므로 값을 내보낼 때 자동으로 오름차순 정렬을 해준다. 따라서, 반복해서 poll 함과 동시에 sb에 저장해서 한 번에 출력하여 해결하였다.

? 하지만 에러가 발생했다. 심지어 바로 오류난 것이 아니라
진행 되다가 오류난 것을 보고 뭔가 놓친게 있다고 생각했다.
그 결과

이런식으로 넣을 땐 정상적으로 잘 들어가지만, 공백을 입력받을 때


NullException 이 발생되는 것을 확인할 수 있다.
이에 따라서 null 값을 받은 경우에 따른 예외처리를 해주어야한다.
for(int i = start; i<strArr.length; i++) {
if(strArr[i].equals("")) {
continue;
}
// 우선순위que에 reverse된 숫자 추가
String temp = strArr[i];
priQue.add(returnLong(temp));
}// for fin
값을 반복해서 받는 부분에 만약 공백이면, continue 해주는 구문을 추가하여 해당 오류를 해결하였다. 그리고, 첫 문장인지 아닌지도 체크해줘야 반복해서 값을 입력받을 때 1번인덱스부터 시작할지, 0번 인덱스 부터 시작할지를 확실하게 구분지으므로, 해당 변수도 추가해주었다.
package test12;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class Ox12_Q2_2 {
static String [] strArr;
// 백준 5648 S5 역원소 정렬
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 첫 줄 먼저 체크
strArr = br.readLine().split(" ");
int n = Integer.parseInt(strArr[0]);
PriorityQueue<Long> priQue = new PriorityQueue<Long>();
int start ; // 반복문 시작할 인덱스 번호
int linecnt = 0;
while(priQue.size()<n) {
// 첫 줄인 경우
if(priQue.isEmpty()&& linecnt == 0) {
start = 1;
}
// 값이 있다는 것은 무조건 첫 줄이 아니므로, 반복문 시작 인덱스 0으로 지정
else {
start = 0;
strArr = br.readLine().split(" ");
}
for(int i = start; i<strArr.length; i++) {
if(strArr[i].equals("")) {
continue;
}
// 우선순위que에 reverse된 숫자 추가
String temp = strArr[i];
priQue.add(returnLong(temp));
}// for fin
linecnt++;
} // while fin
// priQue 안의 값들 sb에 추가
while(!priQue.isEmpty()) {
sb.append(priQue.poll()).append("\n");
}
// 이렇게 poll 안하고 그냥 추가할 때는 똑바로 정렬되지 않음
// for (int i : priQue) {
// sb.append(i).append("\n");
// }
br.close();
System.out.println(sb.toString().trim());
}
// String으로 된 숫자인자 받아서, 역순으로 변경
public static long returnLong(String strInt) {
// string은 reverse()가 없기에, StringBuilder를 활용함
StringBuilder tempSb = new StringBuilder();
String reverseStr = tempSb.append(strInt).reverse().toString();
long reverseInt = Long.parseLong(reverseStr);
return reverseInt;
}
}

굿