해시맵 클래스가 제공하는 함수를 적절히 사용해야 해시를 활용하여 풀 수 있었던 문제였다
정렬을 활용하여 검색
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Arrays.sort(participant);
Arrays.sort(completion);
for(int i=0; i<completion.length; i++){
if(!participant[i].equals(completion[i])){
return participant[i];
}
}
return participant[participant.length-1];
}
}
- participant 배열과 completion 배열에 있는 이름을 오름 차순으로 정렬한다.
- 두 배열을 순회 하면서 participant의 똑같은 위치에 있는 completion배열의 이름과 같지 않으면 그때의 participant의 참가자는 완주를 하지 못한 것 이므로 참가자 이름 반환
- 순회를 했는데 완주를 하지 못한 경우에는 완주를 하지 못한 참가자가 participant함수의 가장 끝 부분에 있는 경우 이므로 participant[participant.length-1] 반환
해시를 이용한 풀이
풀기 전 알아야 하는 함수
V getOrDefault(Object key, V defaultValue) : key와 맵핑된 value값을 반환하고 없으면 defaultValue값을 반환합니다.
Key=이름, Value=참가자 명단에서의 이름이 나타나는 횟수( 동명 이인을 카운트 하기 위한 전략)
HashMap<String, Integer> hm = new HashMap<>();
참가자 이름을 키로 하고 participant배열을 순회 하면서 해시맵에 삽입해준다.
for (String player : participant) {
hm.put(player, hm.getOrDefault(player, 0) + 1);
}
completion 배열을 순회 하면서 이름이 나올때 마다 1씩 빼준다.
for (String player : completion){
hm.put(player, hm.get(player) - 1);
}
이러한 과정을 거치면 완주한 사용자의 이름을 키로 하는 Value는 0이 되어 있을 것이고 완주를 못했다면 0이 아닌 값을 가질 것이다.
for (String key : hm.keySet()) {
if (hm.get(key) != 0){
answer = key;
}
}
<전체 코드>
import java.util.HashMap;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> hm = new HashMap<>();
for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
for (String player : completion) hm.put(player, hm.get(player) - 1);
for (String key : hm.keySet()) {
if (hm.get(key) != 0){
answer = key;
}
}
return answer;
}
}
새로운 풀이 (2025 - 02 - 23)
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> map = new HashMap<>();
for(String s : participant){
if(map.containsKey(s)==false){
map.put(s,1);
}
else {
int a = map.get(s);
map.replace(s,a+1);
}
}
for(String s : completion){
if(map.get(s)==1){
map.remove(s);
}
else{
int a = map.get(s);
map.replace(s,a-1);
}
}
for(String s : participant){
if(map.containsKey(s)){
return s;
}
}
return answer;
}
}
'알고리즘 > 해시' 카테고리의 다른 글
프로그래머스 - 의상(Java) (0) | 2025.01.08 |
---|---|
프로그래머스 - 전화번호 목록(Java) (0) | 2025.01.06 |
프로그래머스 - 포켓몬(Java) (1) | 2025.01.04 |