<프로그래머스> 완주하지 못한 선수
문제 링크
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;
}
}