알고리즘/백준(BAEKJOON)

[자바]1181 단어 정렬[백준]

jojelly 2022. 1. 6. 04:51
반응형

초점

-단어의 길이가 짧은 순서대로

-길이가 같을 경우 사전 순으로

-같은 단어가 중복되어있을경우 한번만 출력하기


이번 문제로 배운게 있다면 배열에 특정 규칙을 정해 정렬을 하고 싶다면 Arrays.sort메소드에 Comparator을 구현해주면 된다.

[Arrays.sort() 는 단순 배열을 오름차순으로 정렬해주는 것 뿐만 아니라 사용자에 의해 구현할 수 있다. ]

Arrays.sort() 메소드 안에는 두 객체(원소)를 비교하여 순서를 바꿀지 판단하면서 정렬을 해준다.

Comparator는 객체를 비교할 수 있도록 해주는 인터페이스다. int, char, double 등의 자바에서 제공하는 자료형들은 비교가 가능하지만, 특정 규칙에 의해 비교를 하고 싶은 경우에는 Comparator를 구현해야 한다.

T = Type 을 의미하며 객체, 자료형 등의 다양한 타입 중 하나를 설정 할 수 있다. 문제에서는 String 타입의 단어가 들어오기 때문에 T 는 String이 된다. 이후 compare 메소드를 오버라이딩을 한다.

String\[\] arr = new String\[N\];

Arrays.sort(arr, new Comparator() {  
@Override  
public int compare(String s1, String s2) {

/\*  
정렬방법  
\*/

}

});

추가로 compare메소드 리턴 타입은 int형이다. compare메소드는 3가지 리턴값을 통해 위치를 바꿀지 결정된다.
1.양의정수
2.0
3.음의정수

양의 정수일 경우 위치가 교환 되고 0과 음의 정수일 경우 그대로 있는다.
compare 메소드는 3가지 반환값에 의해 두 객체(인자)의 우선순위를 판단하고, 이를 정렬알고리즘 안에서 위치를 바꾸거나 그대로 둔다.


1차 조건은 '단어 길이'. 2차 조건은 만약 단어 길이가 같을 경우 이 때 '사전순'으로 정렬한다.

  • compare 메소드에서 if 조건문을 통해 단어길이를 비교후 같을 경우 사전순으로 정렬하도록 하고, 그 외에는 단어 길이순으로 정렬
String\[\] arr = new String\[N\];

Arrays.sort(arr, new Comparator() {  
@Override  
public int compare(String s1, String s2) {  
// 단어 길이가 같을 경우  
if(s1.length() == s2.length()} {  
return s1.compareTo(s2); // 사전 순 정렬  
}  
// 그 외의 경우  
else {  
return s1.length() - s2.length();  
}  
}  
});

여기서 또 한번 배우게 된 부분!
Scanner를 사용시 서로 다른 자료형을 받고싶은 경우 어떤 형을 먼저 받냐에 따라 에러가 나타날 수 있다.
nextInt() 로 정수를 입력받은 뒤, nextLine() 을 쓰면 입력한 첫 번째 문자가 arr[0] 에 입력되는 것이 아니라 개행("\n")이 arr[0] 에 저장되기 때문에 유의하여 입력되는 개행을 한 번 버려야 정상적으로 입력한 문자열을 배열에 저장이 가능하다.

import java.util.Arrays;  
import java.util.Comparator;  
import java.util.Scanner;

public class Main {  
public static void main(String\[\] args) {  
Scanner sc = new Scanner(System.in);


    int N = sc.nextInt();
    String[] arr = new String[N];

    sc.nextLine(); //개행"\n" 버리는것
    //nextInt() 로 정수를 입력받은 뒤,
    // nextLine() 을 쓰면 입력한 첫 번째 문자가 arr[0] 에 입력되는 것이 아니라 개행("\n")이 arr[0] 에 저장된다.
    for (int i = 0; i < N; i++) {
        arr[i] = sc.nextLine();
    }

    Arrays.sort(arr, new Comparator<String>() {
        public int compare(String s1, String s2) {
            // 단어 길이가 같을 경우
            if (s1.length() == s2.length()) {
                return s1.compareTo(s2);    //단어 사전순 정렬은 compareTo() 메소드를 리턴(반환)값은 int 형으로 나온다.
            }
            // 그 외의 경우
            else {
                return s1.length() - s2.length(); //양수면 위치 교환 0이나 음수일 경우 그대로 둔다.
            }
        }
    });


    System.out.println(arr[0]); //첫문자 먼저 한번 입력후

    for (int i = 1; i < N; i++) {
        // 중복되지 않는 단어만 출력
        if (!arr[i].equals(arr[i - 1])) {//앞 문자와 비교
            System.out.println(arr[i]);
        }
    }
}


}
반응형