개발언어/Java

[Java] Java 백준 1181번 단어정렬

뜽배 2024. 8. 9. 22:08
728x90
반응형

 

1. 문제

문제는 문자열을 정렬할 것인데 조건이 있다는 것이다. 일반적으로 사전 순이 아니므로 비교하여 정렬하는 것을 내가 작성해야한다.

 

정렬 조건은

1) 길이가 짧은 것 부터

2) 길이가 같으면 사전 순으로

※ 단 중복된 단어는 하나만 남기고 제거해야 한다.

 

여기서 중복된 단어를 제거하기 위해서 TreeSet을 사용 했다.

 


TreeSet이란?

 

TreeSet은 java의 Set인터페이스를 구현한 클래스 중 하나로 이진 트리 구조인 'TreeMap'을 기반으로 하여 요소들을 자동을 정렬하고, 중복을 허용하지 않는 자료구조이다.

 

기본적으로 오름차순으로 정렬한다. 이 정렬은 요소가 'Comparable'인터페이스를 구현했거나 TreeSet생성 시 Comparator를 제공했을 때 가능하다.


2. 코드

 

우선 Word class를 생성한다.

class Word implements Comparable<Word> 
{
    private String s;

    public Word(String s) 
    {
        this.s = s;
    }

    @Override
    public int compareTo(Word w) 
    {
        if (this.s.length() != w.s.length())
            {
                return Integer.compare(this.s.length() , w.s.length()); //길이가 다르면 길이가 짧은거 -> 긴순으로 정렬
            }
            else    
            {
                return this.s.compareTo(w.s);   // 길이가 같으면 
            }
    }

    @Override
    public String toString() 
    {
        return s;
    }
}

 

 

이 후 Word클래스를 TreeSet에 add할 때 자동으로 compareTo를 통해 정렬되서 insert되며, Set이기 때문에 중복제거를 해준다.

 

private void start() throws IOException
    {
        br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        sb = new StringBuilder();
        
        wordHashSet = new TreeSet<>();
        
        for(int i=0; i<n; i++)
        {
            String s = br.readLine();
            wordHashSet.add(new Word(s));
        }
        
               
        for(Word word : wordHashSet)
        {
            sb.append(word.toString()+"\n");
        }
        System.out.print(sb);
    }


    public static void main(String[] args) throws IOException
    {
        new Main().start();
    }

 

이렇게 문제를 풀 수 있다.

728x90
반응형

'개발언어 > Java' 카테고리의 다른 글

[Java] Java 백준 2566 최댓값  (0) 2024.08.27
[Java] java EOF처리 방법  (0) 2024.07.12
[Java] Scanner vs BufferedReader  (0) 2024.07.05