[프로그래머스/해시] Level 1 완주하지 못한 선수 (JAVA)

Jiwoo Kim·2021년 1월 20일
0

알고리즘 정복하기

목록 보기
13/85
post-thumbnail

문제

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

입출력 예

participantcompletionreturn
[leo, kiki, eden][eden, kiki]leo
[marina, josipa, nikola, vinko, filipa][josipa, filipa, marina, nikola]vinko
[mislav, stanko, mislav, ana][stanko, ana, mislav]mislav

풀이

  1. participant를 순서대로 탐색하며 이름을 key, 등장횟수를 value로 증가시키며 저장한다.
  2. completion을 순서대로 탐색하며 완주한 이름에 대해 value를 감소시킨다.
  3. HashMap에서 value가 0이 아닌 key를 불러와 리턴한다.

동명이인이 있을 수 있다는 조건 빼먹고 Set으로 풀었다가 다시 Map으로 풀었다!^^ 문제 조건을 꼼꼼히 읽자~

그리고 원래 1번을 한 줄로 쓰지 않았고, if문으로 이미 key가 존재하는지 체크해서 value를 get하고 증가시켜서 다시 put하는 방식으로 코드를 짰었다. 정말 가독성 떨어지는 비효율적인 코드다.

그러다 다른 사람의 풀이에서 getOrDefault라는 메소드를 봤고, 2줄 짜리를 한 줄 안에 깔끔하고 명확하게 넣을 수 있게 되었다. Map interface에만 있는 메소드인 것 같은데, 이렇게 또 몰랐던 메소드를 하나 더 배워 간다!


코드

import java.util.HashMap;
import java.util.Map;

class Solution {
    public String solution(String[] participant, String[] completion) {
        Map<String, Integer> participants = new HashMap<>();
        for (String person : participant) participants.put(person, participants.getOrDefault(person, 0) + 1);
        for (String person : completion) participants.put(person, participants.get(person) - 1);
        return participants.entrySet().stream().filter(entry -> entry.getValue() != 0).findFirst().get().getKey();
    }
}

0개의 댓글