문제 링크 - https://programmers.co.kr/learn/courses/30/lessons/42576
- 해결 방법
- 먼저, 문제의 조건에서 completion의 길이는 participant의 길이보다 1만큼 작다는 것에 주목했다.
딱 1만큼 작기 때문에 만약 completion에 participant의 이름 중 없는 것이 있다면 바로 반환하면 되고, 모두 있다면 participant에서 중복된 사람의 이름을 반환하면 된다고 생각했다.
이를 구현하기 위해 participant의 이름과 그 이름이 몇 번 나오는지를
2차원 배열로 저장하여 completion과 비교했지만 효율성이 통과되지 않았다.
-
이를 해결하기 위해 자료구조를 찾던 중, Hash함수를 이용하여 key-value의 쌍으로 자료를 빠르게 검색할 수 있는 hashMap을 발견하고 사용하게 되었다.
-
hashMap의 key에는 이름, value에는 동일한 이름이 몇 번 반복되는지를
넣어 중복된 이름이 존재한다면 2로 저장되게 하였다.
-
마지막으로 completion에 없는 사람을 가려내기 위하여 반복문을 이용해
completion에 존재하는 사람들은 participant에는 당연히 존재하므로
각 participant의 value값(몇 명 있는지)에 1을 빼주었다.
이 결과로, 0(completion에 1명, participant에 1명),
1(completion에 1명, participant에 2명 or completion에 0명,participant에 1명)을 이용하여 value가 1인 것을 찾아 key값을 반환하여 주었다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String,Integer> part = new HashMap<>();
for(String name: participant){ //저장
if(part.get(name)==null) part.put(name,1);
else part.put(name,part.get(name)+1);
//part.put(name,part.getOrDefault(name,0)+1); null처리를 쉽게
}
for(String name: completion){ //completion과 비교, -1
part.put(name,part.get(name)-1);
}
for(String key:part.keySet()){ // 0이 아닌 것(1)을 찾는다!
if(part.get(key)!=0) return key;
}
return "";
}
}