Problem_Solving

백준(BOJ) 1181 : 단어 정렬 (자바, 파이썬)

CONCAT 2024. 1. 20. 22:33
728x90
 

1181번: 단어 정렬

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

www.acmicpc.net

설계
  • 주어진 단어들을 길이가 짧은 순으로, 길이가 같을 경우 사전 순으로 정렬
  • 주어진 단어들을 HashSet을 사용하여 중복을 제거한 뒤, 배열로 변환
  • 그 후, Arrays.sort 메소드와 람다식을 사용하여 단어들을 길이 순으로 정렬
  • 길이가 같은 경우에는 사전 순으로 정렬
  • 정렬된 단어들은 반복문을 통해 출력

구현

코드

자바(Java)

// package boj1181;

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 사용자로부터 단어의 개수 N을 입력받음
        int N = sc.nextInt();

        // 중복 단어 제거를 위한 HashSet 생성
        Set<String> set = new HashSet<>();
        for (int i = 0; i < N; i++) {
            // 단어를 하나씩 입력받아 Set에 추가
            set.add(sc.next());
        }
        sc.close(); // Scanner 종료
        // System.out.println(set);

        // Set을 배열로 변환
        String[] arr = new String[set.size()];
        set.toArray(arr);

        // 배열을 정렬
        Arrays.sort(arr, (a, b) -> {
            if (a.length() == b.length()) {
                // 길이가 같을 경우 사전 순으로 정렬
                return a.compareTo(b);
            } else {
                // 길이에 따라 정렬
                return a.length() - b.length();
            }
        });
        // 정렬된 단어 출력
        for (String s : arr) {
            System.out.println(s);
        }
    }
}

파이썬 (Python)

# 사용자로부터 단어의 개수 N을 입력받음
N = int(input())

# 중복을 제거하기 위해 Set 자료구조 사용
# N개의 단어를 입력받아 Set에 저장
_set = set([input() for _ in range(N)])
# print(_set)

# Set을 리스트로 변환하고 정렬
# 먼저 단어의 길이에 따라 정렬하고, 길이가 같으면 사전 순으로 정렬
_list = sorted(list(_set), key=lambda x: (len(x), x))
print(*_list, sep='\n') # 정렬된 리스트를 줄바꿈으로 구분하여 출력