알고리즘 문제풀이/프로그래머스 문제풀이

프로그래머스 문제 풀이 - 완주하지 못한 선수 (해시 맵)

줄라이퍼스트 2025. 8. 5. 15:28

 

마라톤에 참가한 사람들과 완주한 사람들의 목록이 있음

단 한 명만 완주하지 못했고, 그 이름을 찾아내는 문제

포인트는 동명이인이 존재할 수 있다는 점!
그래서 단순 포함 여부만 비교하면 안됨

 

  • HashMap을 이용해 이름과 등장 횟수를 기록
  • completion 배열을 먼저 처리해 이름별 완주 횟수를 기록
  • 이후 participant를 순회하면서
    • 해시맵에 존재하지 않거나 값이 0이면, 그사람은 완주하지 못함
    • 값을 주여가며 체크

 

class Solution {
    public String solution(String[] participant, String[] completion) {
        // 이름과 참가 횟수를 저장할 해시맵 생성
        HashMap<String, Integer> map = new HashMap<>();

        // 완주한 선수의 이름을 해시맵에 저장 (이름이 중복될 수 있으므로 횟수를 누적)
        for (String s : completion) {
            map.put(s, map.getOrDefault(s, 0) + 1);
        }

        // 참가자 배열을 순회하며 완주 여부 확인
        for (String s : participant) {
            // 완주하지 않은 선수는 해시맵에 없거나 개수가 0인 경우
            if (map.getOrDefault(s, 0) == 0) {
                return s;  // 완주하지 못한 선수 반환
            }
            // 완주한 경우, 해시맵에서 해당 이름의 개수를 1 감소
            map.put(s, map.get(s) - 1);
        }

        // 모든 참가자가 완주했다면 null 반환 (이 문제에서는 절대 null이 반환되지 않음)
        return null;
    }
}