백준

[백준_1181번] 단어 정렬

빙수빈수 2021. 6. 20. 15:38

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

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

www.acmicpc.net

[문제]

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

 

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

 

[입력 조건]

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

 

[코드]

import java.util.*;

public class BaekJoon_1181 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		String[] arr=new String[n];
		/* nextInt() 로 정수를 입력받은 뒤, nextLine() 을 쓰면 입력한 첫 번째 문자가 
		 * arr[0] 에 입력되는 것이 아니라 개행("\n")이 arr[0] 에 저장된다.
		 * 따라서 개행을 버리는 과정을 거쳐야 한다. 
		 */
		sc.nextLine();
		for(int i=0;i<n;i++) arr[i]=sc.nextLine();
		
		Arrays.sort(arr, new Comparator<String>() {
			@Override
			/* 기본적으로 compare 메소드는 3가지 리턴 값(양의 정수, 0, 음의정수)에 의해 위치를 바꿀지 결정하게 된다
			 * 양의 정수일 경우에만 위치를 바꾸고 0이나 음수 정수인 경우에는 바꾸지 않는다
			 * 따라서 compare 메소드 리턴 타입은 int 형이 된다. 
			 */
			public int compare(String s1, String s2) {
				if(s1.length()>s2.length()) return 1;
				else if(s1.length()<s2.length()) return -1;
				else return s1.compareTo(s2);
			}
		});
		System.out.println(arr[0]);
		/*
		 * 아래 if문에서 arr[i]와 arr[i-1]을 비교하기 위해서는 i가 0부터 시작하면
		 * 배열 범위가 벗어나는 오류가 발생하기 때문에 사전에 arr[0]은 출력하고
		 * i를 1부터 해서 바교하여 출력한다.
		 * */
		for(int i=1;i<n;i++) { 
			if(!arr[i].equals(arr[i-1])) System.out.println(arr[i]);
		}
	}
}

 

[고찰]

 이번 문제 또한 앞선 문제와 같이 Comparator 인터페이스를 사용하면 쉽게 해결되는 문제였다. 다만 중복되는 값은 하나만 출력하는 조건 때문에 for문의 반복 조건을 설정하는데 시행착오가 있었다. 

'백준' 카테고리의 다른 글

[백준_18870번] 좌표 압축하기  (0) 2021.06.20
[백준_10814번] 나이순 정렬  (0) 2021.06.20
[백준_11650번] 좌표 정렬하기  (0) 2021.06.20
[백준_1427번] 소트인사이드  (0) 2021.06.20
[백준_2108번] 통계학  (0) 2021.06.20