반갑습니다!

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

알고리즘 문제 풀이

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

김덜덜이 2020. 9. 6. 15:18
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

풀이

참여 선수 배열의 크기가 완주 선수 배열의 크기보다 항상 1만큼 크다. 따라서 이를 이용해서 해결하면 된다. 아래의 코드는 참여 선수의 이름을 Key로, 참여 선수 이름의 갯수를 Value로 하는 맵을 통해 해결했다. 참여 선수 배열을 순회하며 맵에 저장하고, 완주 선수 배열을 순회하며 맵의 Value를 1씩 감소시킨다. 이 때 Value가 0이 되는 경우 맵에서 삭제시킨다. 이렇게하면 모든 배열을 순회했을 때 맵에 남아있는 Key 값이 완주하지 못한 선수가 된다.

코드

C++

#include <string>
#include <vector>
#include <map>
using namespace std;

string solution(vector<string> participant, vector<string> completion) {
    string answer = "";
    map<string, int> m;
    for (string name : participant) m[name]++;
    for (string name : completion)
        if (m[name] > 1) m[name]--;
        else m.erase(name);
    for (auto it : m) {
        answer = it.first;
        break;
    }
    return answer;
}

Java

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> map = new HashMap<>();
        for (String name : participant)
            map.put(name, map.getOrDefault(name, 0) + 1);

        for (String name : completion) {
            if (map.get(name) > 1) map.put(name, map.get(name) - 1);
            else map.remove(name);
        }
        answer = map.keySet().iterator().next();
        return answer;
    }
}