본문 바로가기

Algorithm

[BaekJoon] 1181 단어 정렬 JAVA

🔗 백준 1181 문제 https://www.acmicpc.net/problem/1181

문제

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

 

  • 길이가 짧은 것부터
  • 길이가 같으면 사전순으로

입력

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


출력

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


풀이

정렬 조건이 두가지가 존재한다.

1. 길이가 짧은 것부터

2. 길이가 같으면 사전 순으로

그렇기에 나는 입력 들어온 단어들을 변수에 할당할 때, 단어와 단어의 길이가 함께 할당하면 좋겠다는 생각이 들어 Hashmap을 활용하였다.

 

for문을 돌리며 Hashmap에 단어(key)와 단어의 길이(value)를 저장할 때, 중복되는 단어(key)가 있는 경우를 생각하여 두가지 해결책을 사용하였다.

1. if문을 사용하여 중복 키가 존재한다면 다음 반복문으로 넘겨주어 시간을 단축시켜주었다.

2. getOrDefault 메서드를 사용하였다.

getOrDefault : 찾는 키가 존재한다면 해당 키의 값을 반환, 없다면 지정해준 default값을 반환시킨다.

 

그 후 hashmap에 저장된 키와 값을 entry로 가져와 리스트형태로 저장하였다.

Entry 메서드인 comparingByKey/comparingByValue를 사용하여 각 사전순 정렬과 길이순 정렬을 해주었다.

 

내가 푼 코드

더보기
import java.io.*;
import java.util.*;
import java.util.Map.Entry;

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 word = br.readLine();

        Map<String, Integer> words = new HashMap<>();
        words.put(word, word.length());

        for (int i = 0; i < n-1; i++) {
            word = br.readLine();
            if (words.containsKey(word)) continue;
            words.put(word, words.getOrDefault(word, word.length()));
        }

        List<Entry<String, Integer>> entryList = new ArrayList<>(words.entrySet());
        entryList.sort(Entry.comparingByKey()); // 사전 순 정렬
        entryList.sort(Entry.comparingByValue()); // 길이 순 정렬

        for (Entry<String, Integer> entry : entryList) bw.write(entry.getKey() + "\n");

        bw.close();
    }
}

 

'Algorithm' 카테고리의 다른 글

[BaekJoon] 1654 랜선 자르기 JAVA  (0) 2022.12.31
[BaekJoon] 1018 체스판 다시 칠하기 JAVA  (2) 2022.12.28
[BaekJoon] 1064 평행사변형 JAVA  (1) 2022.12.21
[BaekJoon] 2034 반음 JAVA  (0) 2022.12.21
[BaekJoon] 1542 세준세비 JAVA  (0) 2022.12.20
Recent Posts
Popular Posts
Recent Comments