알고리즘/해시

프로그래머스 - 완주하지 못한 선수(Java)

연향동큰손 2025. 1. 5. 15:30

 

해시맵 클래스가 제공하는 함수를 적절히 사용해야 해시를 활용하여 풀 수 있었던 문제였다

 

정렬을 활용하여 검색
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];
    }
}
  1. participant 배열과 completion 배열에 있는 이름을 오름 차순으로 정렬한다.
  2. 두 배열을 순회 하면서 participant의 똑같은 위치에 있는 completion배열의 이름과 같지 않으면 그때의 participant의 참가자는 완주를 하지 못한 것 이므로 참가자 이름 반환
  3. 순회를 했는데 완주를 하지 못한 경우에는 완주를 하지 못한 참가자가 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