코딩테스트 고득점 Kit_해시
🔥 완주하지 못한 선수 🔥
수많은 마라톤 선수들이 마라톤에 참여했다. 단 한명의 선수를 제외하고는 모든 선수가 마라톤을 완주했다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return하는 solution을 완성해보자.
participant | completion | return |
---|---|---|
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
for(int i=0;i<participant.length;i++){
for(int j=0;j< completion.length;j++){
if(participant[i].equals(completion[j]) && completion[j] != "-1"){
participant[i] = "-1";
completion[j] = "-1";
}
}
if(participant[i]!="-1"){
answer = participant[i];
}
}
return answer;
}
}
즉 participant와 completion에 동시에 존재하는 선수들의 값을 -1로 변경해주는 것이다.
하지만 이런 풀이로 풀면 테스트는 통과하지만 효율성은 전부 실패이다...
예상하기로는 이 문제는 해시를 이용해서 푸는 문제이다.
물론 나는 그렇게 풀지 않았다. 그게 문제다 문제
import java.util.HashMap;
import java.util.Map.Entry;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
1️⃣
HashMap<String,Integer> player = new HashMap<>();
2️⃣
for(String p : participant) player.put(p, player.getOrDefault(p,0)+1);
3️⃣
for(String c : completion) player.put(c,player.get(c)-1);
4️⃣
for(String key : player.keySet()){
if(player.get(key) != 0){
answer = key;
}
}
return answer;
}
}
위의 코드를 통해서 Map을 사용하는 것에 익숙해져보자
1️⃣ player라는 이름의 HashMap을 선언
key : String
value : Integer
2️⃣ 반복문을 돌리는데 participant의 각 요소를 String p라고 하자
* put
- hashmap에 값을 업데이트하거나 삽입할때 사용
- replace와 큰 차이점은 키값이 없을때 put은 hashmap안에 삽입하지만 replace는 null을 반환
* getOrDefault(Object key, V Default Value)
- key : 값을 가져와야하는 요소의 키
- defaultValue : 지정된 키로 매핑된 값이 없는 경우 반환되어야하는 기본값
찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환됨
따라서 player에 p의 값이 있다면 p에 매핑되어있는 값에 +1 없다면 0+1의 값을 put 해준다.
해당위치에서 System.out.println(player);를 수행하면 아래와 같다
{leo=1, eden=1, kiki=1}
{marina=1, filipa=1, nikola=1, josipa=1, vinko=1}
{ana=1, mislav=2, stanko=1}
3️⃣ completion의 각 요소를 String c라고 하자
* get(key)
- map안의 값 가져오기
키값 c에 매핑되어있는 값을 가져와서 -1을 해주고 player에 다시 put해준다.
그렇다면 completion에 이름이 있는 사람들의 값은 0이 될 것이다.
4️⃣ 반복문을 돌려서 key의 값이 0이 아닌 선수를 데려오자
* keySet
- key의 값만 출력해줌
keySet메소드를 이용해서 player의 key의 값을 반복문을 돌려서 해당하는 곳의 key의 값이 0이 아닌 선수를 answer에 대입
📑 References