백준 1181 단어 정렬 [JAVA]

Ga0·2023년 4월 28일
0

baekjoon

목록 보기
40/125

문제 해석

  • 이번 문제는 문자열을 정렬하는 문제이다.
  • 첫번째 줄에 입력받을 단어의 개수(N)을 입력받고, 두번째 줄 부터는 소문자로 이루어진 단어를 한줄에 하나씩 입력받는다.
  • 입력받은 단어들을 첫번째로는 길이가 짧은 것부터 정렬하고, 만약 길이가 같다면 사전(알파벳)순으로 정렬한다.
  • 또한 중복된 단어는 하나만 남기고 제거해야한다.

코드


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();
    }
}
  • 문자열의 길이가 같은 경우와 다른 경우로 비교를 했는데, 만약 문자열의 길이 다르다면 전 POST에서도 썼던 방식처럼 매개변수로 받은 첫번째 String의 길이와 두번째 String의 길이를 빼서 양수가 나온다면 배열의 정렬/배치를 바꾼다.
  • 만약, 문자열 길이가 같다면, 해당 문자열을 사전 순으로 매겨 정렬을 해야하는 데 String클래스에서 이에 대한 메소드(CompareTo())를 제공해준다.
	//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()메소드는 종료된다.

결과

느낀점

  • 해당 코드를 작성했을 때 for문을 돌려서 하나하나 직접 정렬해야하나 했는데, 다행히 Compareactor가 String 정렬도 해줘서 편하게 풀었던 것 같다.

0개의 댓글