문제
풀이 방법 & 생각 과정
- 일반적인 백준 난이도 실버 5 문제와 다르게 생각할 거리가 많은 문제였다.
- 문제를 보고 가장 먼저 중복을 우선적으로 제거해야겠다 라는 생각이 들었다. 이전에 프로그래머스에서 중복 제거를 위해 HashMap을 사용한적이 있어서, 해당 방법으로 중복을 제거했다. (다른 풀이 방법을 보니 조건 1,2를 먼저 처리한 후에 중복을 처리한 경우가 많았다.)
- 조건1인 길이가 짧은 순 정렬은 객체 정렬할 때 쓰이는 Comparator의 메서드를 재정의하여 사용하였다.이 지점에서 문제가 발생했는데, 길이 순으로 정렬한 상태에서 Collection.sort를 사용하니 사전 순으로 정렬은 되었지만 길이 순 정렬이 깨져버렸다. (기존에 Comparator 메서드 재정의 한 것을 조건을 추가하여 변경해야 되나 생각이 들었다.)
- 곰곰히 생각해보니, 사전 순 sort를 먼저 진행하고 길이 순 sort를 하면 해결 될 문제여서 다음과 같이 코드를 작성하였다.
작성 코드
package _1181;
// 백준 난이도 : 실버5
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
ArrayList<String> arr = new ArrayList<>();
// 입력 수 최대 2000 -> Buffered 이용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 중복 방지 Hashmap 생성
HashMap<String, Integer> map = new HashMap<>();
int n = Integer.parseInt(br.readLine());
for(int i=0; i<n; i++){
String temp = br.readLine();
map.put(temp,1);
}
for(String a: map.keySet()){
arr.add(a);
}
Collections.sort(arr); // 사전 순으로 먼저 sort 작업 수행
Comparator<String> comparator1 = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
Collections.sort(arr, comparator1); // Comparator를 활용하여 길이 순으로 sort 작업 수행
for(int i=0; i<arr.size(); i++){
System.out.println(arr.get(i));
}
}
}
풀이 후기
- 다른 풀이방법들을 보니, 전반적으로 중복 처리를 for문 안에 if문을 사용하여 해결하는 경우가 많았다.
for (int i = 1; i < N; i++) {
// 중복되지 않는 단어만 출력
if (!arr[i].equals(arr[i - 1])) {
sb.append(arr[i]).append('\n');
}
}
i 인덱스와 i-1 인덱스가 같지 않을 경우에만 StringBuilder sb에 i인덱스에 해당하는 배열값을 개행문자와 함께 삽입하는 코드. 같을 경우, sb에 i번째 배열 값이 반영되지 않으므로 중복을 효율적으로 처리할 수 있다.
출처 : https://st-lab.tistory.com/112
- HashMap을 사용하면, 아무래도 메모리 문제도 발생할 것이고, Map에 넣었다가 다시 배열로 꺼내야 하는 과정이 복잡하므로, 다음에 중복 처리 문제가 나오면 다른 풀이 방법도 고려해봐야겠다고 생각이 들었다.
'Algorithm' 카테고리의 다른 글
DFS (0) | 2022.02.12 |
---|---|
다이나믹 프로그래밍 (0) | 2022.01.27 |
알고리즘 기초 - 수학1 (0) | 2022.01.24 |
Baekjoon - 10866번 (0) | 2022.01.19 |
Deque(덱) (0) | 2022.01.19 |