[백준] 1181 : 단어 정렬

ByWindow·2021년 4월 29일
0

Algorithm

목록 보기
24/104
post-thumbnail

📝 문제

N개의 String을 입력 받은 후,
1. 길이가 짧은 순
2. 길이가 같다면 사전순
으로 출력하는 프로그램을 구현한다


제한시간이 2초였는데 2404ms로 간신히 통과했다😭
comparator의 사용법이 생각이 안나서 Arrays.sort() 메서드만 사용해서 어찌저찌 풀려고 하다보니 이렇게 되어버렸다.
그래서 일단 나의 코드를 첨부한 후, comparator와 comparable의 사용법을 복습해보았다.

📌 코드

package Baekjoon;

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

public class BOJ1181 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        String[] input = new String[n];
        /**
         * 사전순 배열 -> for문을 50번 반복해서 해당 글자 길이의 문자열을 순서대로 출력
         */
        st = new StringTokenizer(br.readLine());
        input[0] = st.nextToken();
        for(int i = 1; i < n; i++){
            boolean same = false;
            st = new StringTokenizer(br.readLine());
            String str = st.nextToken();
            //같은 단어가 있는지 찾는다
            for(int j = 0; j < i; j++){
                if(str.equals(input[j])) same = true;
            }
            //같은 단어가 있다면 문자열 대신 1을 넣음
            if(same) input[i] = "1";
            else input[i] = str;
        }
        Arrays.sort(input);
        for(int i = 1; i <= 50; i++){
            for(int j = 0; j < n; j++){
                if(input[j].length() == i && !input[j].equals("1")) System.out.println(input[j]);
            }
        }
    }
}

🤦‍♂️

배열을 정렬할 때 Arrays.sort()를 많이 호출하는데, 이것은 Character클래스의 Comparable의 구현에 의해 정렬되는 것이다.
Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다.
이 밖에도 Comparable의 특징으로는

  • 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들로 구현된다
  • 기본적으로 오름차순으로 정렬된다

두 가지를 활용 시기로 분류를 하자면,

  • Comparable : 기본 정렬기준을 구현하는데 사용
  • Comparator : 기본 정렬기준 외에 다른 정렬 기준을 구현하고 할 때 사용

즉, String[]을 정렬하고자 할 때 Arrays.sort()를 사용함에 있어서

Arrays.sort(arr, Comparator c)

이렇게 Comparator를 지정해주지 않으면 기본적으로 Comparable에 의해 정렬이 되는 것이다.

따라서, 이런 Comparator를 사용해서 위 코드의 Array.sort() 부분을 수정해보면 다음과 같다

Arrays.sort(input, Comparator<String>(){
	public int compare(String s1, String s2){
    		//1. 길이가 같다면 사전순
    		if(s1.length() == s2.length()){
        		return s1.compareTo(s2);
                }
                //2. 길이를 기준으로 오름차순
                else{
                	return s1.length() - s2.length();
                }
        }
}
profile
step by step...my devlog

0개의 댓글