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 |