문제 해석
코드
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String[] array = new String[N]; //문자열을 저장할 배열
for(int i = 0; i < N; i++) {
array[i] =br.readLine();
}
br.close();
Arrays.sort(array, new Comparator<String>() {
@Override
public int compare(String str1, String str2) { //문자열 두개를 비교
if(str1.length() == str2.length()){ //문자열 길이가 같다면
return str1.compareTo(str2); //문자를 하나씩 뜯어서 사전순으로 정렬해야함
}else{ //길이가 다르면
return str1.length() - str2.length(); //길이를 그냥 바로 빼주면 됨(양수가 나오면 정렬이 바뀜)
}
}
});
bw.write(array[0] + "\n"); //첫번째 요소는 중복되는 건 없기때문에 buffer에 담고
for(int i = 1; i < N; i++){
if(!array[i].equals(array[i-1])){ //해당 문자열이 전 문자열과 같지 않을 때만(차피 정렬을 했기 때문에, 같은 값은 모여있음!)
bw.write(array[i] + "\n"); //buffer에 해당 문자열을 담는다.
}
}
bw.flush();
bw.close();
}
}
//Main 클래스
str1.compareTo(str2);
// String 클래스
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) { //해당 문자값이 다를 경우
return c1 - c2;
}
k++;
}
return len1 - len2;
}
-compareTo() 메소드는 같은 위치의 문자만 비교하는데, 즉 첫번째 문자부터 순서대로 비교하여 다를 경우 아스키값을 기준으로 비교처리를 한다.
//예시) 첫번째 문자열 abc, 두번째 문자열 acc 라고 가정하면
abc.compareTo("acc")
//1. a == a해서 넘어간다.
//2-1. b랑 c를 비교하게 되는데 b != c 이기 때문에 if문에 걸린다.
//2-2. if문 안에 들어와서 b(98)- c(99) 값인 -1을 반환하고 compareTo()메소드는 종료된다.
결과
느낀점