처음에 작성한 코드는 다음과 같다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
String[][] coordinateArray= new String[N][2];
int x, y;
for (int n = 0; n < N; n++){
String word = br.readLine();
coordinateArray[n][0] = word;
coordinateArray[n][1] = String.valueOf(word.length());
}
Arrays.sort(coordinateArray, (eX1, eX2) -> {
if(Integer.parseInt(eX1[1])==Integer.parseInt(eX2[1]))
return dictionaryAlignment(eX1[0], eX2[0]);
else
return Integer.parseInt(eX1[1]) - Integer.parseInt(eX2[1]);
});
for (int n = 0; n < N; n++)
if(n > 0 && !coordinateArray[n][0].equals(coordinateArray[n-1][0]))
sb.append(coordinateArray[n][0]).append('\n');
else if(n==0)
sb.append(coordinateArray[n][0]).append('\n');
System.out.print(sb);
br.close();
}
static int dictionaryAlignment(String s1, String s2){
char[] string1ToCharArr = s1.toCharArray();
char[] string2ToCharArr = s2.toCharArray();
for (int c = 0; c < string2ToCharArr.length; c++){
if((int)string1ToCharArr[c] > (int)string2ToCharArr[c])
return 1;
else if((int)string1ToCharArr[c] < (int)string2ToCharArr[c])
return -1;
}
return 0;
}
}
위 코드를 사용 시 작동은 잘 되지만.. RuntimeError에 걸릴 것이다. 그럼 어떻게 할 것인가? 답은 str.compareTo() 이다.
str.compareTo()를 사용하면 같은 크기의 소문자만 비교를 하기에 별다른 처리필요없이 사용하면 된다. return값은 같은 문자일 때 0을 주지만 우리는 같은 문자일 때만 비교를 할 것이기 때문에 이부분 또한 무시해도 된다. (int)a-(int)b 같은 수식으로 진행되다가 다른 문자이 나타나면 그 문자들의 아스키값을 return해준다. 고로 만약 a가 b보다 아스키값이 높다면 정렬을 유지를 할 것이고 아니면 재정렬을 하게 될 것이다. 이부분을 이용해서 다음과 같은 코드를 작성했다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
String[][] coordinateArray= new String[N][2];
int x, y;
for (int n = 0; n < N; n++){
String word = br.readLine();
coordinateArray[n][0] = word;
coordinateArray[n][1] = String.valueOf(word.length());
}
Arrays.sort(coordinateArray, (eX1, eX2) -> {
if(Integer.parseInt(eX1[1])==Integer.parseInt(eX2[1]))
return eX1[0].compareTo(eX2[0]);
else
return Integer.parseInt(eX1[1]) - Integer.parseInt(eX2[1]);
});
for (int n = 0; n < N; n++)
if(n > 0 && !coordinateArray[n][0].equals(coordinateArray[n-1][0]))
sb.append(coordinateArray[n][0]).append('\n');
else if(n==0)
sb.append(coordinateArray[n][0]).append('\n');
System.out.print(sb);
br.close();
}
}