프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. SOLUTION
HashMap 사용하는 기본문제
참여자 명단에 있지만, 완주자 명단에 없는 사람의 이름을 return하면 되기 때문에
참여자 이름을 key값으로, 해당하는 인원수를 value로 갖는 HashMap을 사용해주면 쉽게 풀 수 있다.
동명이인이 여러 명 있는 경우더라도 해당 참여자 이름의 value에 +1 해주는 식으로 HashMap을 완성 한 후
완주자 명단을 돌면서 해당 참여자의 value에 -1을 해 주면 완주하지 못 한 한 사람만 구별해 낼 수 있다.
HashMap<Integer,String> map = new HashMap<>();
map.put(key,value);
* HashMap 선언과 값 추가는 위와 같이 할 수 있다.
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
// HashMap 선언
HashMap<String, Integer> dict = new HashMap<>();
// participant 돌면서 인원수 + 1
for (String player : participant) {
dict.put(player, dict.getOrDefault(player, 0) + 1);
}
String을 key값으로, Integer를 value값으로 갖는 HashMap을 정의해 주고,
participant를 for문으로 돌아보면서 참여자 이름을 HashMap에 추가 해 준다.
이 때 value값으로 인원수 + 1을 할당해 주어야 하는데, 아직 Map에 추가 되지 않은 참여자라면 0 + 1,
이미 Map에 존재하는 참여자라면 value + 1을 해 주어야 하므로 getOrDefault 메서드를 사용해주었다.
// completion 돌면서 인원수 - 1
for (String player : completion) {
dict.put(player, dict.get(player) - 1);
}
그리고 completion을 돌면서 완주자 명단에 있는 참여자의 value값에서 -1을 해 준다.
여기까지 처리되면 완주하지 못한 선수의 value만 0이 아니게 된다.
// 인원수가 0이 아닌 사람이 정답
for (String key : dict.keySet()) {
if (dict.get(key) != 0) {
answer = key;
}
}
HashMap의 키값을 돌면서, key에 해당하는 value값이 0이 아닌 경우가 정답이 된다.
나는 KeySet() 메소드를 사용했는데, 이렇게 key, value 값을 모두 사용해야 하는 경우에는
entrySet() 메소드를 사용하는 게 조금 더 효율적이라고 한다.
* entrySet()의 getKey()와 getValue()는 현재 차례의 entry 속성 값을 바로 가져오는 반면, keySet()의 get()은 HashMap을 search 해야하므로 내부에서 hashcode(), equals()등을 실행하기 때문에 효율성이 떨어진다.
// entrySet() 사용하는 경우의 코드
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if(entry.getValue() !=0){
answer = entry.getKey();
break;
}
}
자바로 알고리즘 풀이하기.. 쉽지않다
파이썬이였으면 그냥 냅다 딕셔너리로 구현하면 되는데 HashMap 선언하면서 좀 슬퍼짐...
2. CODE
import java.util.*;
class Solution {
public String solution(String[] participant, String[] completion) {
String answer = "";
// HashMap 선언
HashMap<String, Integer> dict = new HashMap<>();
// participant 돌면서 인원수 + 1
for (String player : participant) {
dict.put(player, dict.getOrDefault(player, 0) + 1);
}
// completion 돌면서 인원수 - 1
for (String player : completion) {
dict.put(player, dict.get(player) - 1);
}
// 인원수가 0이 아닌 사람이 정답
for (String key : dict.keySet()) {
if (dict.get(key) != 0) {
answer = key;
}
}
return answer;
}
}
댓글