본문 바로가기

Algorithm

[Algorithm/JAVA][프로그래머스] 완주하지 못한 선수

반응형

[프로그래머스] 완주하지 못한 선수

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

문제설명

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

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

제한사항

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

Code

import java.util.HashMap;
import java.util.Map;
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer= "";
        HashMap<String,Integer> hm = new HashMap();
        for(String people : participant) hm.put(people,hm.getOrDefault(people,0)+1);
        for(String people : completion) hm.put(people,hm.get(people)-1);
        for(Map.Entry<String,Integer> tmp: hm.entrySet()){
            if(tmp.getValue() !=0){
                answer = tmp.getKey();
                return answer;
            }
        }
        return answer;
    }
}

Code 설명

HashMap을 이용해서 key가 사람의 이름, value가 사람 수인 hm을 선언해준다.
그리고 participant를 반복문을 돌려서 hm에 넣어주는데 이미 존재한다면 그 value에 1을 더해주고 아니라면 0에다가 1을 더해준다.
다음으로 completion을 반복문을 돌면서 hm에 value값을 1씩 빼준다. 그러면 결과적으로 한명만 value가 1이고 나머지는 0이된다.
hm을 반복문을 통해서 value가 0인값을 찾아서 return해준다.

배운점

이 문제는 처음에는 그냥 String 배열을 이용해서 sort를 해준다음 하나하나 비교해서 풀었다. 하지만 다른사람의 풀이를 보고
String 배열을 이용한 방식은 sort도 두번하고 마지막에 하나하나 비교하는 반복문까지 사용하기 때문에 시간이 더 오래걸린다는것을 알게되었다.
그래서 이번 HashMap을 사용했다.
HashMap은 key,value를 가진구조이고, key를 이용해서 검색을 빠르게 할 수 있다는 장점을 가지고 있다.
이번 문제에서는 HashMap<String, Integer> hm = new HashMap()을 이용해서 선언해주고
반복문을 돌면서 hm.put(key, value)를 이용해서 넣어주었다.

  1. 여기서 hm.getOrDefalut를 사용하였는데 get은 key값을 이용해서 검색한 다음 value를 단순히 리턴해주는데 이 때 해당 key값이 없다면 null을 리턴해준다. 하지만 getOrDefalut는 key가 없을때 null을 반환해주지않고, 두번째 매개변수로넘겨준 default값을 리턴해주게된다.
  2. 그리고 HashMap을 순회하는 방식이다. Iterator를 사용하는 방식도 있고 for문 방식이 있는데 익숙한 for문을 사용했다.(Iterator는 너무 복잡하고 왜 쓰는지 잘 모르겠다.) 해시맵에는 entrySet()이라는 메소드가 있는데 이는 key,value를 가진 entrySet을 리턴해준다. 그래서 Map.entry tmp를 이용해서 받아주었다.
반응형