■ 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42576
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
■ 소스코드
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
Map<String, Integer> pMap = new HashMap<>();
for(int i=0;i<participant.length;i++) {
pMap.put(participant[i], pMap.getOrDefault(participant[i], 0)+1);
}
for(int i=0;i<completion.length;i++) {
String name = completion[i];
if(pMap.containsKey(name)) {
pMap.put(name, pMap.get(name)-1);
}
}
Iterator<String> iter = pMap.keySet().iterator();
while(iter.hasNext()) {
String key = iter.next();
if(pMap.get(key)>0) {
answer=key;
break;
}
}
return answer;
}
}
■ 풀이
먼저 participant배열에 저장된 선수 이름과 getOrDefault메서드를 활용해서 해당 선수 이름을 가진 참여자(key)와 선수 수를 카운팅(value)해서 pMap에 저장할 수 있도록 한다.
동명이인 선수의 경우 카운팅이 2 이상이 될 것이므로
completion배열의 요소를 가지고 pMap의 선수이름과 비교해서 존재하면 value를 1씩 감소시키도록 했다.
동명이인이 존재하지 않으면서 선수가 완주했다면 value는 0이 되었어야 한다.
0이 아닌 value와 key를 찾아내서 answer에 선수 이름(key)을 저장하고 리턴하면 끝!
■ 후기
다른 코드 참고하다 보니 completion과 비교해서 value를 감소한 후에 Iterator를 사용하지 않는 방법이 있었고,
forEach로 keySet을 모두 돌면서 value를 확인하는 방법을 사용해서 코드 수를 줄일 수 있겠다 싶었다. 그런데 효율성 측면에서 keySet 그리고 map.get(key)하는 것이 매번 맵을 서치 해야 해서 entrySet이 key, value가 같이 필요할 때는 entrySet을 사용해야 한다는 코멘트가 있었다.
(이 부분은 공부가 더 필요할 것 같다... 포스팅할 목록에 추가 완료!)
잘못된 점이나 보충할 부분이 있으면 코멘트 남겨주세요
작은 조언이 저에겐 성장의 원동력이 됩니다 :-)
'알고리즘' 카테고리의 다른 글
[데알] 주어진 시각에서 특정 숫자 찾기(Python) (0) | 2021.08.16 |
---|---|
[데알] 프로그래머스 알고리즘 Lesson.68935 3진법 뒤집기 (Java) (0) | 2020.11.18 |
[데알] 프로그래머스 알고리즘 Lesson.68644 두 개 뽑아서 더하기 (Java) (0) | 2020.11.16 |
[데알] 백준 알고리즘 No. 2577 숫자의 개수 (Python) (0) | 2020.11.15 |
[데알] 백준 알고리즘 No. 11654 아스키코드(Python) (0) | 2020.11.14 |
댓글