알고리즘 문제풀이/백준

[백준 1187] 단어 정렬

선서니 2023. 1. 30. 21:01

[문제 바로가기] 

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

💡풀이💡

단어들을 1) 길이가 짧은 순서대로 2) 길이가 같다면 사전 순서대로 정렬하는 것이 문제이다.

하지만 이러한 정렬은 메서드로 정의되어 있지 않기 때문에 기존에 있는 Arrays.sort()를 재정의해서 위와 같이 정렬이 될 수 있도록 했다.

 

1.  입력 값 받기 

N개 단어를 입력 받은 String 타입의 배열을 생성하고 단어들을 배열에 저장했다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 StringBuffer sb = new StringBuffer();
int N = Integer.parseInt(br.readLine());
String[] arr = new String[N]; 
        
for(int i=0; i<N; i++) {
    arr[i] = br.readLine();
}

 

2. Arrays.sort()를 재정의

  Arrays.sort(arr, new Comparator<String>() {
    @Override
 	public int compare(String o1, String o2) {
       int r = o1.length() - o2.length(); // 1. 길이 비교 - 같으면 0을 리턴
       if(r == 0) r =  o1.compareTo(o2); // 같을 때 사전순 정렬
       return r;
	}
});

 

 

3. 중복되는 단어 거르기

sb.append(arr[0]).append("\n"); // 아래 for문에서는 0번째 요소가 포함되지 않기 때문에먼저 추가
for(int i=1; i<N; i++) {
   if(!arr[i].equals(arr[i-1])) { // arr[i] 와 arr[i-1]이 같을 때
      sb.append(arr[i]).append("\n");
   }
}
System.out.println(sb.toString());

 

 

4. 전체 코드

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer sb = new StringBuffer();
        int N = Integer.parseInt(br.readLine());
        String[] arr = new String[N];
        
        for(int i=0; i<N; i++) {
            arr[i] = br.readLine();
        }
        
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int r = o1.length() - o2.length();
                if(r == 0) r =  o1.compareTo(o2);
                return r;
            }
        });
        
        sb.append(arr[0]).append("\n");
        for(int i=1; i<N; i++) {
        	if(!arr[i].equals(arr[i-1])) {
        		sb.append(arr[i]).append("\n");
        	}
        }
        System.out.println(sb.toString());
    }
}