반응형
1. 문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/42576
2. 설계
2중 for문 등으로 안풀려서 사람들 반응을 보았더니 효율성 따지기가 하늘의 별따기였던 문제이다.
나도 내 머리속으로 설계는 해시를 잘 몰라서 못했고, 사람들 의견을 보면서 진행해보았다.
1) 해시맵을 생성한다. <String, Integer>
2) 해시맵에 참여자를 넣어준다. 단, 동명이인이 있을 수 있으므로 Integer에는 사람의 수를 체크한다.
3) 해시맵에 완주자를 반영한다. 완주자 value 즉, Integer에 -1을 해준다.
4) 결과적으로 value가 1만 남은 참여자를 정답으로 리턴한다.
문제에서 미완주자는 무조건 1명이라 했기 때문에 가능한 설계이다.
3. 전체 코드
import java.util.HashMap;
import java.util.Map;
class Solution {
//미완주자 명단
//단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
//동명이인은 서로 다른 사람이다.
public String solution(String[] participant, String[] completion) {
String answer = "";
HashMap<String, Integer> status = new HashMap<>();
//참가자 상태 저장
//containsKey 사용도 가능
for(int i=0;i<participant.length;i++){
status.put(participant[i],status.getOrDefault(participant[i],0)+1);
}
//완주자 상태 저장
//replace도 사용가능
for(int i=0;i<completion.length;i++){
status.put(completion[i],status.get(completion[i])-1);
}
//1명이라도 남아있는 사람이 정답
for(Map.Entry<String, Integer> set : status.entrySet()){
if(set.getValue()==1){
answer = set.getKey();
break;
}
}
return answer;
}
}
배운점 : HashMap 순회 돌리기
import java.util.HashMap;
import java.util.Map;
HashMap<String, Integer> status = new HashMap<>();
for(Map.Entry<String, Integer> set : status.entrySet){
if(set.getValue()==1){
//someting
break;
}
}
그저 외울뿐 ㅠ
참고로 forEach를 쓸 수도 있는데 어째선지 break이나 return은 안먹어서 안쓰기로 결정했다. (출력용)
map.forEach((key, value) -> {
System.out.println(key + " : " + value);
});
value나 key만 돌리면 된다면 간단하게 아래처럼 할 수도 있다.
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + " : " + value);
}
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] lv3. 단어변환 [#BFS/DFS] (0) | 2023.10.23 |
---|---|
[프로그래머스] lv2. 전화번호 목록 [#해시] + startsWith vs substring (1) | 2023.10.18 |
[프로그래머스] lv1. 포켓몬 [#해시] (1) | 2023.10.18 |
[프로그래머스] lv3. 네트워크 [#Union-Find] (0) | 2023.10.12 |
[프로그래머스] lv2. 게임 맵 최단 거리 [#DFS #BFS] (0) | 2023.10.12 |