Study/Baekjoon

Baekjoon1181: 단어 정렬

devyoseph 2021. 11. 8. 19:30

단어 정렬

시간 제한메모리 제한제출정답맞힌 사람정답 비율

2 초 256 MB 69787 28697 21343 40.318%

문제

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

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

입력

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

출력

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

 

풀이

두 방법을 생각해보았다.

1) 문자열을 기록하는 배열과 글자수를 저장하는 배열을 만든 후 글자수에 따라 먼저 배치한 뒤 사전순으로 배열한다

2) 문자열을 기록한 뒤 사전 순으로 배치하고 글자수를 센다.

두번째 방법이 조금 더 효율적인 것 같았다. Arrays.sort로 적용한 뒤 글자 길이에 대해서만 나열하면 되기 때문이다

import java.io.*;
import java.util.*;
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[] words = new String[N]; //글자를 저장하는 배열
	   for(int i=0;i<N;i++) {
		  words[i] = br.readLine(); //글자를 넣어준 뒤
		  }
          
	   Arrays.sort(words);    //Arrays.sort를 이용해 사전순 배치를 한다
       
	   for(int i=1;i<51;i++) {
		   String save = ""; //중복되는 글자를 쓰지 않기 위해 저장 변수 설정
		   for(int j=0;j<N;j++) {
           
			   if(words[j].length()==i && !words[j].equals(save)) {
               //문자열의 비교는 equals를 쓴다
               
				   save=words[j]; //사용했던 글자를 save에 저장
                   
				   bw.write(words[j]+"\n");
                   
			   }
		   }
	   }
	   bw.flush();
	   bw.close();
}
}