문제
- 집에서 아침부터 저녁 시간 조금 지나서까지 화장실 공사를 진행하였기 때문에 인강을 듣지 못해서 알고리즘 문제라도 하나 풀어보고자 하였다.
- 처음에는 각각의 리스트를 따로 만들어서 빈도수, 길이, 알파벳의 리스트를 만들고 해당하는 길이 이상의 단어들끼리 비교를 해보려하였다.
시도
- 그렇게 시도를 하자, 마지막 출력하는 부분에서 조금 어려움이 느껴졌다.
- 리스트 별로 따로 조건을 저장하는 것은 괜찮으나, 쌍으로 이루어진 부분이 없어서 비교하여 출력하기가 애매했다.
- 또한 이렇게 문제를 해결한다면 배운 부분이 없이 그저 예전과 똑같은 방식으로 기계적으로 문제를 푼다는 느낌이 들어서, 여러가지 다른 시도를 해보기로 하였다.
해결
- 우선은 쌍으로 이루어진 부분을 얻기 위해서 Map을 사용하여서 단어와 빈도수를 저장하였다.
- 이 부분은 예전에 새로 Map을 배웠을 당시 사용해보았던 부분이다.
- 그리고 또 stream과 람다를 사용해보고자 생각하여서, 반복문으로 key에 해당하는 value를 리스트에 저장해도 좋지만, collect를 검색해서 사용해보았다.
- 또한 sort를 할 때에, 따로 함수를 만들어서 사용해도 좋지만 람다 부분을 잘 몰라서 한번 사용해보고자 검색해서 사용해보았다.
오늘 푼 문제
- 백준 20920 (영단어 암기는 괴로워) - Java
- 처음에는 각 케이스 별로 하나하나 나눠서 각각의 리스트를 만든 다음에 비교하는 방식을 사용하려고 하였으나, 그렇게 하면 출력을 할 때 복잡해진다는 것을 다 만들고 깨달았다.
- 아예 하나의 컬렉션만 사용하고, 그 안에서 순서까지 만들었으면 좋겠다라는 생각이 들어서 Map을 사용하게 되었다.
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int word = Integer.parseInt(st.nextToken());
int limitLength = Integer.parseInt(st.nextToken());
Map<String, Integer> wordMap = new HashMap<>();
for(int i = 0; i < word; i++){
String tmp = br.readLine();
// limitLength 이상의 길이를 가진 단어만 저장
if(tmp.length() >= limitLength) {
Integer count = wordMap.getOrDefault(tmp, 0);
wordMap.put(tmp, count + 1);
}
}
// 데이터를 List 형식으로 변환시키기 위해서 collect를 사용하였다.
// Map -> List (키 값만 각각 반복문으로 할당하는 것 보다 stream을 사용해보고자 하였음
List<String> saveWords = wordMap.keySet().stream().collect(Collectors.toList());
//
saveWords.sort((o1, o2) -> {
int c1 = wordMap.get(o1);
int c2 = wordMap.get(o2);
// 빈도수가 같다면
if (c1 == c2){
// 길이가 같다면
if (o1.length() == o2.length()) {
// 알파벳순으로 (앞에 있는 단어가 앞에)
return o1.compareTo(o2);
}
// 빈도수는 같지만 길이는 다름 (길이가 길수록 앞)
return o2.length() - o1.length();
}
// 빈도수가 다르면 높을 수록 앞
return c2 - c1;
});
for (int i = 0; i < saveWords.size(); i++) {
bw.write(saveWords.get(i) + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
- getOrDefault(Object key, V DefaultValue)
- 반환 값 : 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환