문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
제한사항
마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant completion return
["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
입출력 예 설명
예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
이 문제는 중복값을 허용하기 때문에 HashSet 이 아닌 HashMap을 활용해야 한다고 생각했다.
어떻게 활용할 것인가?
HashMap의 키 값은 중복이 불가하기 때문에 value값에 넣어야 하나 생각했다.
근데 이름을 key값에 넣고, value 값을 조절하는 방법이 있었다.
이 풀이를 위해서 중요하게 사용되는 메서드가 있는데 숙지하지 못했기 때문에 푸는데 실패했다.
getOrDefault
- Java Map 인터페이스에서 제공하는 메서드로, 지정된 키에 매핑된 값이 존재하면 그 값을 반환하고, 값이 없으면 기본값(default)을 반환하는 메서드이다.
- 이 메서드는 JAVA 8 부터 제공된다.
default V getOrDefault(Object key, V defaultValue)
- key : 찾고자 하는 key
- defaultValue : 키가 없을 때 반환할 기본값
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
//Map 생성
HashMap<String, Integer> map = new HashMap<>();
map.put("apple",3);
map.put("banana",5);
//getOrDefault 사용
System.out.println(map.getOrDefault("apple", 0)); //출력 : 3
System.out.println(map.getOrDefault("orange",0)); //출력 : 0 - orange가 없으므로
getOrDefault 는 주로 빈도를 계산하거나, 초기 값이 필요한 경우에 유용하다.
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
String[] words = {"apple", "banana", "apple", "orange", "banana", "apple"};
HashMap<String, Integer> wordCount = new HashMap<>();
for(String word : words) {
wordCount.put(word, wordCount.getOrDefault(word,0)+1);
}
System.out.println(wordCount);
}
}
getOrDefault 를 사용하여 참가자 명단을 put 한다.
- 사람 a 넣기 -> 사람 a가 아직 없음 -> 기본값 0 -> 한 명 체크 +1
- a와 이름이 같은 b 넣기 -> map에 이름 존재 -> 1값 가져옴 -> 한 명 추가 +1
HashMap<String, Integer> map = new HashMap<>();
for(String player : participant) {
map.put(player, map.getOrDefault(player,0) +1);
}
이제 완주자 명단에서 완주한 사람의 value 값을 1씩 뺀다.
for(String player2 : completion) {
map.put(player2 , map.get(player2) -1);
}
이렇게 하면 완주한 사람의 value 값은 0이 될 것이다.
최종 코드
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> map = new HashMap<>();
//참가자 명단 해시맵 추가
for(String player : participant){
map.put(player, map.getOrDefault(player,0) +1);
}
//완주자 명단에 있는 이름을 해시맵에서 차감
for(String player2 : completion){
map.put(player2, map.get(player2) -1);
}
for(String key : map.keySet()){
if(map.get(key) != 0){
answer = key;
}
}
return answer;
}
}
'CodingTest' 카테고리의 다른 글
[코딩테스트] 의상 JAVA HashMap (0) | 2024.11.22 |
---|---|
[코딩테스트] 전화번호 목록 JAVA HashSet (0) | 2024.11.22 |
[코딩테스트] 폰켓몬 JAVA HashSet (0) | 2024.11.19 |
[코딩테스트] 땅따먹기 JAVA DP (1) | 2024.11.14 |
[코딩테스트] 가장 큰 정사각형 찾기 JAVA (동적 계획법 DP) (0) | 2024.11.13 |
댓글