programmers 완주하지 못한 선수
문제 자체는 크게 어렵지 않았습니다. 하지만 효율성 테스트도 있기 때문에 출제자의 의도에 맞게 푸는게 관건일 것 같네요. 이를 고려하면 HashMap을 이용하여 풀 수 있는데요. 간략하게 정리해볼게요.
HashMap<String, Integer>
에 주어진 참가자를 차례대로 넣는다. 그리고 동명이인의 경우 value값을 증가한다.HashMap
에서 완주한 사람을 찾아 value값을 감소한다. 이 때 value값이 0이면remove()
하여 없앤다HashMap
에 마지막에 남은 1명을 출력한다.
이 방법대로 풀면 다음과 같이 구현할 수 있습니다.
class Solution {
public String solution(String[] participant, String[] completion) {
Map<String, Integer> hash = new HashMap<>();
for (String s : participant) {
if(hash.get(s) == null) {
hash.put(s, 1);
} else {
hash.put(s, hash.get(s) + 1);
}
}
for (String s : completion) {
hash.put(s, hash.get(s) - 1);
if(hash.get(s) == 0) {
hash.remove(s);
}
}
return hash.keySet().toArray()[0].toString();
}
}
다른 사람들도 이와 비슷하게 풀었는데요. 그런데 다른 풀이에서 HashMap
메서드 중 재미있는 기능을 가진 것을 발견하였습니다. 저의 코드의 경우 5~6줄에서 null값 일 경우를 구별하기 위해 if문을 하나 더 써줬는데요. getOrDefault()
메서드를 이용하여 5~9번째 줄을 1줄로 줄일 수 있습니다.
for (String s : participant) {
hash.put(s, hash.getOrDefault(s, 0) + 1);
}
getOrDefault()
메서드는 이름 그대로 HashMap
에 찾는 키 값이 없을 경우에 바로 Default값을 설정하고 그 값을 리턴하고, 있으면 그 키 값의 value를 리턴합니다. 유용하게 사용할 수 있을 것 같네요. 아 그리고 HashMap
에서 키 값을 얻을 때는 다음과 같이 사용될 수 있습니다.
Set<Integer> keys = points.keySet();
for (Integer key : keys) {
Point point = points.get(key)
}
위 경우 key값이 Integer
타입이었겟죠? 헷갈려서 전에 기록했던 부분을 살펴봤네요!
'Algorithm > problem solving' 카테고리의 다른 글
Today's Algorithm(2018-10-31) (0) | 2018.10.31 |
---|---|
Today's Algorithm(2018-10-30) (0) | 2018.10.30 |
Today's Algorithm(2018-10-26) (0) | 2018.10.26 |
Today's Algorithm(2018-10-25) (0) | 2018.10.25 |
Today's Algorithm(2018-10-22) (0) | 2018.10.22 |