매일 조금씩

[C++] 프로그래머스 : 완주하지 못한 선수 본문

알고리즘/해시

[C++] 프로그래머스 : 완주하지 못한 선수

mezo 2021. 2. 4. 23:29
728x90
반응형

 

 

 

1) C++

참여 명단에 있으면 +1, 완주 명단에 있으면 -1을해서 0이 아닌 이름을 출력

#include <string>
#include <vector>
#include <map>

using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    
    map<string, int> m;
    
    for(auto c: completion){
        m[c] += 1;
    }
    
    for(auto p: participant){
        m[p] -= 1;
        if(m[p] < 0){
            answer = p;
            break;
        }
    }
    
    return answer;
}

 

2) java 첫번째 방법 - 오름차순 정렬

오름차순으로 두 명단을 정렬하고 하나씩 비교해서 일치하지 않으면 참여 명단의 이름을 출력

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        
        Arrays.sort(participant);
        Arrays.sort(completion);
        
        int i = 0;
        for(i=0; i<completion.length; i++){
            if(!participant[i].equals(completion[i])){
                return participant[i];
            }
        }
        

        return participant[i];
    }
}

 

3) java 두번째 방법 - HashMap

1번과 동일한 방법이지만 java로 HashMap을 사용하였다.

  • getOrDefault : 찾는 key가 있으면 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;
    }
}

getOrDefault를 써야하는 이유는?

동명이인이 있을 경우 먼저 HashMap에 들어가 있는 key를 찾아서 값을 +1 시켜줘야하기 때문이다.

만약 sam 이라는 사람이 2명이면

HashMap에서 "sam"이라는 key의 value는 2가 된다.

 

728x90
반응형