본문 바로가기

백준

[백준] 1181 단어 정렬_ JAVA

● 문제


● 풀이

먼저, 문자를 입력받아, 배열에 넣은 후 길이순으로 정렬을 한 다음, 길이가 같다면 사전순으로 정렬한다.

 

길이순으로 정렬하는 방식은 아래와 같다.

String[] arr = new String[N];
        for(int i =0; i<N; i++){
            arr[i] = in.nextLine();
       }
Arrays.sort(arr, Comparator.comparing(String::length));

길이가 같다면 사전순으로 정렬할 때, 같은 각 단어의 0번 인덱스끼리 비교, 1번 인덱스끼리 비교해가는 순으로 해야한다.

아니다, 문자열 배열에서 Arrays.sort()를 통해 사전순으로 정렬할 수 있다.

 

하나 더, 중복된 단어는 하나만 남기고 제거해야한다. 이는 길이가 같다면, 끝까지 비교해서 문자열이 같으면 하나는 없애걸로 하면 될라나 ? 아니다! 출력할때 앞뒤비교만 하면 되는거시다.

 

 


중간 코드

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

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

        int N = in.nextInt();
        in.nextLine();

        String[] arr = new String[N];
        for(int i =0; i<N; i++){
            arr[i] = in.nextLine();
        }
        Arrays.sort(arr);
        Arrays.sort(arr, Comparator.comparing(String::length));


        for(int i =0; i<N; i++){
            System.out.println(arr[i]);
        }


    }
}

길이, 사전순대로 정렬하였고, 이제 중복되면 삭제하는 코드를 추가해야된다.

길이가 같으면 하나씩 비교해가며 같으면 삭제하는 알고리즘은 너무 코드가 복잡할듯하여

지피티에게 물어보았다.

 

 


● 최종 코드 !!

 

중복인지 체크하는 코드는 마지막에 출력할 때,

arr[0]를 일단 출력 후, arr[1]부터 arr[i]와 arr[i-1]를 비교하면 된다.

arr[0]를 먼저 출력하는 이유는, arr[0]과 arr[0-1]를 비교해야하는데, 그럼 인덱스범위오류가 나기 때문.

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

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

        int N = in.nextInt();

        String[] arr = new String[N];

        for(int i =0; i<N; i++){
            arr[i] = in.next();
        }
        Arrays.sort(arr);
        Arrays.sort(arr, Comparator.comparing(String :: length));

        System.out.println(arr[0]);
        for(int i =1; i<N; i++){
            if(!arr[i].equals(arr[i - 1])){
                System.out.println(arr[i]);
            }
        }
    }
}

 


Arrays.sort(arr, Comparator.comparing(String::length))는 배열 arr을 문자열의 길이를 기준으로 정렬하는 코드입니다.

Comparator.comparing() 메서드는 주어진 키 추출 함수를 기반으로 Comparator를 생성하는 정적 메서드입니다. 여기서는 String::length를 키 추출 함수로 사용하였습니다. String::length는 String 객체의 길이를 반환하는 메서드 참조입니다.

Comparator.comparing(String::length)는 문자열의 길이를 기준으로 비교하는 Comparator를 생성합니다. 이 Comparator는 문자열의 길이를 비교하여 정렬하는 역할을 합니다.

Arrays.sort() 메서드는 배열을 정렬하는 메서드로, 첫 번째 인자로 정렬할 배열을 받고, 두 번째 인자로 정렬에 사용할 Comparator를 받습니다. 이 코드에서는 Comparator.comparing(String::length)를 두 번째 인자로 전달하여 배열 arr을 문자열의 길이를 기준으로 정렬합니다.

결과적으로, arr 배열은 문자열의 길이가 짧은 순서대로 정렬됩니다.

 

 

 

 


10814 나이순 정렬을 풀며 제대로 Comparator에 대해 개념공부를 하여 단어 정렬또한 내가 더 이해하기 쉬운 코드로 다시 풀어보았음.

 

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

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

        int N = in.nextInt();

        String[] arr = new String[N];

        for(int i =0; i<N; i++){
            arr[i] = in.next();
        }

        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.length() == o2.length()){
                    return o1.compareTo(o2);
                }
                return o1.length() - o2.length();
            }
        });

        System.out.println(arr[0]);
            for(int i =1; i< N; i++){
                if(!arr[i].equals(arr[i - 1])){
                    System.out.println(arr[i]);
                }
            }
    }
}