1181문제 단어정렬(정렬) Java

2021. 9. 17. 15:48알고리즘/백준

반응형

문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

입력

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

출력

조건에 따라 정렬하여 단어들을 출력한다. , 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

 

출처: <https://www.acmicpc.net/problem/1181>

 

 

##문제이해##

정렬을 원하는 방식으로 할수있는지 테스트하는 문제(여기서는 length 기준으로.. 중복도 제거해라!)

 

여기 주소에서 정렬관련한 정보를 얻을 있었다.

https://velog.io/@p4stel-dev/Comparator%EB%A1%9C-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AC%B8%EC%9E%90%EC%97%B4%EB%82%B4%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0

 

Comparator

Comparator 클래스를 사용하면 위의 문제를 간단하게 풀 수 있다.

위의 문제는 두개의 조건이있는데 문자열의 n번째 인덱스의 기준으로 1번째로 정렬을 하고 만약 n번째 인덱스의 문자가 같으면 문자열 순대로 정렬을 하면 된다.

compareTo()의 함수에서

앞에 값(o1)과 뒤의 값(o2)을 비교해서 리턴값을 양수로 주면 값을 바꿈 -> 오름차순

앞에 값(o1)과 뒤의 값(o2)을 비교해서 리턴값을 음수로 주면 값을 바꾸지 않음 -> 내림차순

 

 

##풀이코드##

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashSet;

import java.util.List;

import java.util.Scanner;

import java.util.Set;



public class boj_1181 {

public static void main(String[] args) {



Scanner sc = new Scanner(System.in);

int N = sc.nextInt();

List<String> list = new ArrayList<>();



for(int i=0; i<N; i++) {

list.add(sc.next());

}

//비교수행

/*compareTo()의 함수에서

앞에 값(o1)과 뒤의 값(o2)을 비교해서 리턴값을 양수로 주면 값을 바꿈 -> 오름차순

앞에 값(o1)과 뒤의 값(o2)을 비교해서 리턴값을 음수로 주면 값을 바꾸지 않음 -> 내림차순

*/



//정렬시키기 전에 ist를 HashSet으로 변환시켜서 중복제거(정렬시켜도  Set의경우 순서가 없음 정렬한것이 무의미해짐)

Set<String> set = new HashSet<>(list);

//다시 list로 변경해서 중복제거된 부분을 가져간다.

List<String> result = new ArrayList<>(set);



Collections.sort(result, new Comparator<String>() {

@Override

public int compare(String o1, String o2) {

//길이가 같을경우 사전순서로 정렬(기본정렬)

if(o1.length()==o2.length()) {

return o1.compareTo(o2);

}else if(o1.length()>o2.length()){

return 1;

}else {

return -1;

}

}



});

StringBuffer sb = new StringBuffer();

for(String str : result) {

sb.append(str+"\n");

}

System.out.println(sb);



}



}
반응형