본문 바로가기
JAVA/문제 풀이

[프로그래머스] 완주하지 못한 선수 문제 (Java Hash 풀이)

by 스코리아 2023. 8. 27.

안녕하세요, 스코리아입니다.

오늘은 자바(Java)의 Hash(해시)를 이용한 프로그래머스 Lv.1 완주하지 못한 선수 문제를 풀어보겠습니다.

 

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

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

programmers.co.kr

  • 마라톤을 참가하는 선수 중 한 명의 선수를 제외하고 모두 완주했습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.
  • 완주하지 못한 선수를 return 하는 코드를 작성하면 됩니다.

프로그래머스 문제 - 완주하지 못한 선수

문제에 나와있는 예시를 토대로 설명해 보겠습니다.

participant (참가자) completion (완주자) return (미완주자)
["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
  • mislav 이름을 가진 참여자가 2명 있습니다. 완주자 목록에는 mislav 참여자가 1명이기 때문에 미완주자는 mislav입니다.
  • 이와 같이 동명이인이 있을 수 있으므로 Map을 활용하여 key에는 사람 이름을, value에는 참가자 등장 횟수를 기록합니다.
  • 완주자에 대해 value를 1씩 감소시킨 후, value가 0이 아닌 key 값을 return 하면 미완주자를 찾을 수 있습니다.

풀이 과정

위의 예시를 토대로 설명한 대로, HashMap을 이용하여 풀이하였습니다.

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        HashMap<String, Integer> map = new HashMap<>();
        for(String p : participant){ // 참가자 목록
            map.put(p, map.getOrDefault(p, 0) + 1);
        }
        for(String c : completion){ // 완주자 목록
            map.put(c, map.get(c) - 1);
        }
        for(String i : map.keySet()){ // 미완주자 찾기
            if(map.get(i) != 0){
                return i;
            }
        }
        return "";
    }
}
  1. key 값은 참가자의 이름(String)을, value 값에는 참가자 등장 횟수(Integer)를 기록하는 HashMap을 생성하였습니다.
  2. 참가자 list인 participant을 for문으로 돌려서 map의 key를 참가자 이름으로 하여금 value에 참가자가 없으면 1을 넣고, 참가자가 있으면 그 값에 1을 더해서 넣습니다. 여기서 ". getOrDefault(p,0)"은 key 값이 p인 value가 존재하지 않는다면 0을 가져오고, 존재한다면 해당 value를 가져옵니다.
  3. 완주자 list인 completion을 for문으로 돌려서 map의 key를 참여자 이름으로 하여금 value에 해당 참여자의 value에서 1을 감소한 값을 저장합니다.
  4. map.keySet()을 이용하여 map에 대한 for문을 돌리고 value값이 0이 아닌 key 값(미완주자)을 return 합니다.

 

실행 결과

프로그래머스 문제 실행결과 - 완주하지 못한 선수

  • 대부분의 테스트는 0~1ms 정도로, 비교적 빠른 모습입니다.

 


지금까지 자바(Java) 해시를 이용한 프로그래머스 '완주하지 못한 선수' 문제에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.