[Java] 프로그래머스 완주하지 못한 선수
1. 문제분석
문제가 너무 쉽다. 단순히 두 배열을 비교해서 완주하지 못한 선수를 return해주면 된다.
participant와 completion을 정렬하고 다른 데이터 한개만 쏙 빼면 되겠지만 이 문제의 카테고리가 "해시"이기 때문에 해시로 풀어보자.
HashMap은 Key와 Value로 이루어진 자료구조이다.
Key는 중복될 수 없고 한가지만 가질 수 있다. 만약 중복된 값이 들어온다면 새로 들어온 순으로 업데이트 된다.
Value는 중복이 가능하다. HashMap은 Key - Value 쌍으로 데이터를 쉽게 찾기 위해 사용된다.
먼저 HashMap을 어떻게 선언해야할지 보자. 우리가 독립적으로 한가지만 가지는 것은 배열 속 데이터다.
그렇다면 중복이 안되는 Key를 participant의 데이터인 String, Value는 중복감지를 위한 Integer를 선언해주면 된다.
만약 중복된 데이터가 들어온다면 Value값을 변경해주면 되고 우리는 변하지 않는 값을 찾아주면 된다.
2. 구현
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer>map = new HashMap<>();
for(String name : participant){
//만약 name이 없으면 0을, 있다면 기존 value값에서 1을 더함.
map.put(name, map.getOrDefault(name, 0) + 1);
}
for(String name : completion){
//name으로 했을 때 값이 존재하면 value값이 감소함
//없다면 0이 아님
map.put(name, map.get(name) - 1);
}
for(String key : map.keySet()){
//0이 아니면 완주를 못한 사람
if(map.get(key) != 0){
return key;
}
}
return answer;
}
}
위에서 말한대로 구현했다.
데이터를 넣어주고 만약 곂치는 데이터가 있다면 Value는 업데이트가 될 것이다.
getOrDefault는 만약 Key가 존재하지 않는다면 0을, 있다면 +1을 해준다.
2번째 for문에서 name으로 완주한 사람을 가져오고 Key에 대한 Value를 하나씩 빼준다면 중복데이터를 다룰 수 있다.
추가적으로 동명이인이 있는데 만약 한 사람만 들어온다면 Key = "mislav", Value = 1인 상태니 하나를 빼면 0이 된다.
이렇게 되면 1명만 완주한 상태가 된다.
3. 마무리
HashMap은 잘 사용하지 않았는데 아직 사용법이 미숙한 것 같다.
대학교 2학년 때 자료구조좀 잘 들을걸 ㅠㅠㅠㅠㅠ