2 min read

<프로그래머스> 완주하지 못한 선수

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42576

문제 분석

  • 참가자 배열(participant)과 완주자 배열(completion)이 주어진다.
  • 참가자 배열의 인원 중 완주자 배열에 없는 주자를 return하는것이 목표.
  • 보자마자 자바 Set을 사용해서 차집합 연산을 할까 했는데, 동명이인이 존재하는 조건이 있어서 Map쪽으로 생각을 돌렸다.
  • (Key,Value)에서 Key는 참가자의 이름(String), Value는 Integer로 참가하면 1으로 put하는 동시에 동명이인의 경우 해당 중복 횟수만큼 할당하기로 구현함
  • 만약 Completion의 원소가 해쉬맵에 있을 경우, 해당 key의 value를 -1한다.
  • 즉, 일반적인 경우 완주하면 Value는 0이 된다.
  • 동명이인의 경우도, 예를 들어 2명이 존재하는데 Completion 배열에 해당이름이 두번 나오면 Value를 -2 해서 0으로 만들기 때문에 처리가능하다.
  • 완주하지 못한 선수는 무조건 한명이다.

문제 예시

  • (“브리도”,”대박이”,”홍대박”,”브리도”) 가 참가자 배열이고 (“브리도”,”대박이”,”홍대박”) 가 완주자 배열이다.
  • 완주하지 못한 선수의 경우 동명이인인 “브리도”가 되며 해당 값이 리턴되어야 한다.
  • 위의 값은 (Key=“브리도”, Value=“1”) 쌍으로 HashMap에 할당 되어 있다.

구현 코드

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String,Integer> hash_map = new HashMap<String,Integer>();
        //참가자 해쉬맵 초기화
        for(int i = 0; i < participant.length; i ++){
            if(hash_map.containsKey(participant[i])){
                int cnt = hash_map.get(participant[i]);
                cnt++;
                hash_map.put(participant[i],cnt);
            }
            else{
                hash_map.put(participant[i],1);
            }
        }
		/*
		Completion 배열에 존재하는 키값들이 해쉬맵에 존재하면
		해당 키값의 밸류값들을 -1 하면서 완주 여부를 체크한다.
		*/
        for(int i = 0 ; i < completion.length ; i++){
            if(hash_map.containsKey(completion[i])){
                int value = hash_map.get(completion[i]);
                value -= 1;
                hash_map.put(completion[i],value);
            }
        }
        for(Map.Entry<String,Integer> entry : hash_map.entrySet()){
            if(entry.getValue() != 0){
                answer = entry.getKey();
            }
        }
        return answer;
    }
}