문제 해결
참가자 목록과 완주자 목록을 HashMap을 활용하여 비교하는 방식입니다. 구체적으로, 참가자 목록에 등장하는 각 선수의 이름과 등장 횟수를 카운팅하고, 완주자 목록을 이용해 그 수를 하나씩 차감해 나가는 방식입니다. 결국, 남은 수가 1인 선수는 완주하지 못한 선수입니다.
- HashMap 초기화
먼저, 참가자 목록에 등장하는 각 선수의 이름과 등장 횟수를 카운팅합니다. HashMap을 사용하여 선수의 이름을 키로, 등장 횟수를 값으로 저장합니다. - 완주자 목록 처리
완주자 목록을 하나씩 순회하면서, 완주한 선수의 이름을 HashMap에서 찾아 그 값(등장 횟수)을 하나씩 감소시킵니다. - 결과 추출
HashMap에서 값이 1인 선수는 완주하지 못한 선수이므로, 해당 선수를 결과로 반환합니다.
코드
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String result = "";
// HashMap을 사용하여 참가자 목록의 각 선수 이름과 등장 횟수를 카운팅
Map<String, Integer> map = new HashMap<>();
for (String s : participant) {
map.put(s, map.getOrDefault(s, 0) + 1);
}
// 완주자 목록에서 등장하는 선수의 등장 횟수를 차감
for (String s : completion) {
map.put(s, map.get(s) - 1);
}
// 값이 1인 선수 찾기
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() > 0) result = entry.getKey(); // 남은 값이 1인 선수
}
return result;
}
}
- map.put(s, map.getOrDefault(s, 0) + 1)
이 코드는 participant 배열의 각 선수 이름을 HashMap에 추가하는 부분입니다. getOrDefault(s, 0)는 해당 선수가 이미 등장했는지 확인하고, 등장하지 않았다면 0을 반환하여 선수의 등장 횟수를 1씩 증가시킵니다. - map.put(s, map.get(s) - 1)
완주자 목록에서 각 선수의 이름을 찾아 HashMap에 저장된 등장 횟수를 1 감소시킵니다. 이 작업을 통해 완주한 선수의 이름은 등장 횟수가 0이 됩니다. - for (Map.Entry<String, Integer> entry : map.entrySet())
최종적으로 map을 순회하면서 값이 1인 선수를 찾습니다. 값이 1인 선수는 완주하지 못한 선수입니다.
시간 복잡도
- 참가자 목록과 완주자 목록을 순회하면서 HashMap에 값을 추가하고 조회하는 작업은 각각 O(n)과 O(m) 시간이 걸립니다. 여기서 n은 참가자 수, m은 완주자 수입니다.
- 최종적으로 map.entrySet()을 순회하는 작업은 O(n)입니다. 따라서 전체 시간 복잡도는 O(n)입니다.
'Algorithm' 카테고리의 다른 글
백준 1149번: RGB거리 (0) | 2025.03.31 |
---|---|
프로그래머스: 가장 큰 수 만들기 (1) | 2025.03.27 |
백준 11724번: 연결 요소의 개수 (1) | 2025.03.24 |
백준 1697번: 숨바꼭질 (0) | 2025.03.20 |
백준 7576: 토마토 (1) | 2025.03.20 |