❒ Description
제목 | 완주하지 못한 선수 |
링크 | https://school.programmers.co.kr/learn/courses/30/lessons/42576 |
자료구조 | 선형 (해시) |
시간복잡도 | O(n + k) |
이번 문제는 해시맵을 사용하여 간단하게 해결 할 수 있는 문제인데 다른 풀이에서
HashMap을 생성할 때 Stream을 이용한 풀이가 있어서 메모.
❒ Map 생성
Code 1
다음과 같은 배열 `"A", "B", "C", "A", "C", "A"`에서 각 요소가 몇 번 나왔는지를 Map 자료구조로 표현할 때
나는 주로 아래와 같이 코드를 작성했다.
Map<String, Integer> counter = new HashMap<>();
for (String name : students) {
counter.put(name, counter.getOrDefault(name, 0) + 1);
}
Code 2
근데 이번 문제를 풀면서 다른 풀이에서 Stream API를 사용해서 코드를 작성한 사람을 봤다.
Map<String, Long> players = Arrays.stream(participant)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Code1과 2는 성능적으로 큰 차이는 없다. 하지만 가독성 면에서는 2가 더 좋은거 같다.
하지만 호환성면에서 본다면 Code2는 Java 8 미만에서 사용할 수 없다.
상황에 맞게 잘 선택해서 쓰면될 듯 싶다.
❒ Iterator 사용
for (String c : completions) {
int left = players.get(c);
if (left == 1) {
players.remove(c);
} else {
players.put(c, players.get(c) - 1);
}
}
return players.entrySet().iterator().next().getKey();
동명이인이 없는 경우는 아예 map에서 키를 삭제해버리는 방식이다.
이렇게 되면 결국 map에는 하나의 key만 남기때문에 Iterator를 사용해서 key를 리턴하면 된다.
❒ Solution
Code 1
class Solution {
public String solution(String[] participant, String[] completion) {
// 1. create counter Map
Map<String, Integer> players = new HashMap<>();
for (String player : participant) {
players.put(player, players.getOrDefault(player, 0) + 1);
}
// 2. for loop completion
for (String completer : completion) {
if (players.containsKey(completer)) {
players.put(completer, players.get(completer) - 1);
}
}
// 3. for loop map.keyset
String answer = "";
for (String player : players.keySet()) {
if (players.get(player) > 0) {
answer = player;
}
}
return answer;
}
}
Code2
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String, Long> players = Array.stream(participant)
.collect(Collectors.groupingBy(Fuction.identity(), Collectors.counting()));
for (String c : completion) {
if (players.get(c) == 1) {
players.remove(c);
} else {
players.put(c, players.get(c) - 1);
}
}
return players.entrySet().iterator().next().getKey();
}
}
'Algorithm > 문제풀이' 카테고리의 다른 글
[LeetCode#207] Course Schedule (0) | 2024.08.30 |
---|---|
[LeetCode#46] Permutation (0) | 2024.08.21 |
[LeetCode#973] K Closest Points to Origin (0) | 2024.08.08 |
[LeetCode#23] Merge K sorted Lists (0) | 2024.08.06 |
[LeetCode#641] Design Circular Deque (0) | 2024.08.05 |