👊 첫 번째 도전
1. 설계
- 전체 마라톤 선수 participant를 링크드리스트에 저장한다.
- 완주한 선수들의 배열 completion을 처음부터 순회하며 링크드리스트에 동일한 값을 삭제한다.
- 마지막 남은 하나를 answer로 리턴한다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.LinkedList;
/**
*
* @author HEESOO
*
*/
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
LinkedList people=new LinkedList();
for(String s:participant){
people.add(s);
}
for(String s:completion){
people.remove(s);
}
if(!people.isEmpty()){
answer=(String)people.get(0);
return answer;
}
return answer;
}
}
3. 결과
효율성에서 모두 실패를 얻었다.
4. 문제점
링크드리스트보다 더 효율적인 자료구조를 적용해야한다.
(ʃƪ¬‿¬) 두 번째 도전
1. 설계
- 해시맵을 선언하여 key는 participant의 이름, value는 기본값이 1이고, 동명이인이 존재할 경우 +1한다.
- completion을 순회하며 해쉬맵에 존재할 경우 삭제한다. 이때 동명이인이 있다면 value를 -1하여 한 명만 지운다.
- 해쉬맵에 남은 단 한명을 리턴한다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.HashMap;
/**
*
* @author HEESOO
*
*/
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String,Integer> hash=new HashMap<String,Integer>();
for(String s:participant){
if(hash.get(s)==null){
hash.put(s,1);
}
else{
hash.replace(s,hash.get(s)+1);
}
}
for(String s:completion){
if(hash.get(s)==1){
hash.remove(s);
}
else{
hash.replace(s,hash.get(s)-1);
}
}
for(String s:hash.keySet()){
if(hash.get(s)==1){
answer=s;
}
}
return answer;
}
}
3. 결과
🤟 성공 🤟
👏 해결 완료!
문제를 보자마자 익숙한 링크드리스트가 먼저 떠올랐는데, 앞으로는 해쉬도 염두해두도록 하자.