프로그래머스/코딩테스트 고득점 Kit
[해시] 완주하지 못한 선수 (JAVA)
댈팽이
2024. 1. 8. 23:47
728x90
# 문제 설명
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 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" |
# 정답 코드
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> complete = new HashMap<>(); //완주자 이름, 수
for (String name : completion) {
if (complete.containsKey(name)) {
complete.replace(name, complete.get(name) + 1);
}
else {
complete.put(name, 1);
}
}
for (String name : participant) {
if (complete.containsKey(name)) {
if (complete.get(name) != 0) {
complete.replace(name, complete.get(name) - 1);
}
else {
answer = name;
break;
}
}
else {
answer = name;
break;
}
}
return answer;
}
HashMap을 이용하여 key로 완주자 이름을, value로 수를 저장한다.
completion을 순회하면서 HashMap을 채운다.
- HashMap에 존재하는 이름이면, 수 + 1
- HashMap에 존재하지 않는 이름이면, 수 = 1
participant를 순회하면서 answer를 찾는다.
- HashMap에 존재하면서 수가 0이 아니면, 수 - 1
- HashMap에 존재하지만 수가 0이면, 해당 name을 리턴
- HashMap에 존재하지 않으면, 해당 name을 리턴
실패 코드 #1
completion을 List로 저장한다.
participant를 순회하며, List에 존재하면 remove한다.
위 코드로 작성했을 때, 답은 맞았지만 효율성 테스트에서 시간 초과로 실패하였다.
remove할 때 List를 순회하면서 삭제할 값을 찾기 때문에 시간이 많이 걸려 실패한 것 같다.
728x90