📝 문제
https://programmers.co.kr/learn/courses/30/lessons/42576?language=java
🎯 풀이
❌ ArrayList를 이용한 풀이
- ArrayList에 참가자 명단을 삽입한다.
- ArrayList에서 완주자들을 제거한다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
List maratoner = new ArrayList();
for(String part : participant) maratoner.add(part);
for(String comp : completion) maratoner.remove(comp);
return (String)maratoner.get(0);
}
}
# 정확성 테스트
테스트 1 〉 통과 (0.04ms, 52.4MB)
테스트 2 〉 통과 (0.05ms, 52.8MB)
테스트 3 〉 통과 (3.22ms, 53.1MB)
테스트 4 〉 통과 (13.21ms, 53.9MB)
테스트 5 〉 통과 (13.39ms, 54MB)
# 효율성 테스트
테스트 1 〉 실패 (시간 초과)
테스트 2 〉 실패 (시간 초과)
테스트 3 〉 실패 (시간 초과)
테스트 4 〉 실패 (시간 초과)
테스트 5 〉 실패 (시간 초과)
정확성은 100%지만, 효율성이 꽝이다!
ArrayList.remove 메소드로 요소 삭제 후
남은 요소간 재정렬에서 생기는 오버헤드가 어마어마한걸로 보인다.
이번엔 해시를 이용해보자.
⭕ HashMap을 이용한 풀이
- HashMap에 참가자를 등록한다.
- 만일 동명이인이 있을 경우, Value를 더한다.
- HashMap에 완주자를 기록한다.
- Key로 이름을 찾아내서, Value를 뺀다.
- HashMap에서 Value가 1 이상인 Key를 찾아 반환한다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
HashMap<String, Integer> maratoner = new HashMap<>();
for(String person : participant) {
if(maratoner.containsKey(person)) // 동명이인이라면?
// value 증가
maratoner.replace(person, (int)maratoner.get(person)+1);
else // 처음 보는 이름이라면 등록
maratoner.put(person, 1);
}
for(String person : completion) // 완주자는 value 감소
maratoner.replace(person, (int)maratoner.get(person)-1);
String answer = "";
for(Map.Entry person : maratoner.entrySet()) {
if((int)person.getValue() > 0){ // value가 0보다 크면?
answer = (String) person.getKey(); // 미완주자다!
break;
}
}
return answer;
}
}
# 정확성 테스트
테스트 1 〉 통과 (0.07ms, 53.2MB)
테스트 2 〉 통과 (0.08ms, 51.9MB)
테스트 3 〉 통과 (0.63ms, 52.2MB)
테스트 4 〉 통과 (1.29ms, 54.2MB)
테스트 5 〉 통과 (1.09ms, 54.9MB)
# 효율성 테스트
테스트 1 〉 통과 (34.35ms, 81.6MB)
테스트 2 〉 통과 (88.20ms, 89MB)
테스트 3 〉 통과 (123.68ms, 98MB)
테스트 4 〉 통과 (83.60ms, 96.5MB)
테스트 5 〉 통과 (84.74ms, 95.1MB)
👏👏👏
댓글남기기