Welcome! Everything is fine.

[프로그래머스/Lv.1] 완주하지 못한 선수 - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 완주하지 못한 선수 - Java

개발곰발 2024. 5. 6.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌 풀이

참가자 명단에는 있으나 완주자 명단에는 없는 선수의 이름을 반환하는 문제이다. 주의할 점은 참가자 중에 동명이인이 있을 수 있다는 점이다. 내가 작성한 풀이의 대략적인 흐름은 다음과 같다.

  • 참가자 배열을 돌며 HashMap에 <참가자 이름, 인원 수> 형태로 참가자들의 정보를 저장한다.
  • 완주자 배열을 돌며 HashMap에 저장된 key와 같은 이름이 나올 경우
    • 해당 이름이 1개인 경우, 해당 이름으로 된 key를 삭제한다.
    • 해당 이름이 2개 이상인 경우(동명이인이 있을 경우), 해당 이름의 인원수를 1 감소시킨다.
  • 위 과정을 거치면 완주자 명단에 없는 이름이 남기 때문에 해당 key를 answer에 대입한 후 반환한다.

아래와 같은 과정에서 보통은 map.containsKey()를 사용했었는데, 이제는 getOrDefault() 메서드를 알게 되어 사용해보았다. 해당 key에 대한 value가 없을 경우 기본값으로 0을 넣어준다.

HashMap<String, Integer> map = new HashMap<>();
for (int i = 0; i < participant.length; i++) {
    String key = participant[i];
    map.put(key, map.getOrDefault(key, 0) + 1);
}

 

그리고나서 completion 배열을 돌며 해당 map에 완주자가 있다면 지운다. 단, 동명이인이 있을 경우 인원 수를 1 감소시킨다.

for (int i = 0; i < completion.length; i++) {
    if (map.containsKey(completion[i])) {
        if (map.get(completion[i]) == 1) map.remove(completion[i]);
        else map.replace(completion[i],map.get(completion[i]) - 1);
    }
}

 

남은 keyfmf answer에 넣어준 후 반환한다.

for (String key : map.keySet()) {
    answer = key;
}

📌 전체코드

다른 사람들의 코드를 보니 해시 말고도 주어진 배열을 정렬한 후 푸는 방법도 있었다. 여러가지 방법을 시도해보고 자신에게 맞는 방법으로 풀면 될 것 같다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < participant.length; i++) {
            String key = participant[i];
            map.put(key, map.getOrDefault(key, 0) + 1);
        }
        
        for (int i = 0; i < completion.length; i++) {
            if (map.containsKey(completion[i])) {
                if (map.get(completion[i]) == 1) map.remove(completion[i]);
                else map.replace(completion[i],map.get(completion[i]) - 1);
            }
        }
        
        for (String key : map.keySet()) {
            answer = key;
        }
        
        return answer;
    }
}