문홍의 공부장

[Java] 프로그래머스 Lv1. 완주하지 못한 선수 풀이 본문

알고리즘/프로그래머스

[Java] 프로그래머스 Lv1. 완주하지 못한 선수 풀이

moonong 2020. 1. 14. 00:15
반응형

문제 설명

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

제한사항

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

나의 풀이

이 문제는 [해시] 로 구분되어 있어, HashMap을 사용하는 게 출제자가 의도한 모범답안인 듯 싶다.
나는 처음에 hashMap의 containsKey() 를 사용하여 풀고자 하였는데, 깔끔하게 풀리지 않아 포기하고 그냥 for loop을 돌렸다. ㅠㅠ(참가자 중에는 동명이인이 있을 수 있다 라는 조건 때문에, 내가 생각한 방법으로는 풀리지 않았다.)
풀고 나서 다른 사람의 풀이를 보니 getOrDefault()라는 멋진 방법을 사용하였길래 이 역시 함께 정리 해보려 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public String solution(String[] participant, String[] completion) {
    String answer = "";
 
    Arrays.sort(participant);
    Arrays.sort(completion);
 
    for(int i=0; i< completion.length; i++){
          if(!completion[i].equals(participant[i])){
            answer = participant[i];
            break;
        }               
    }
    if(answer.equals("")) {
        answer = participant[participant.length-1];
    }
 
    return answer;
}
cs

다른 사람의 풀이

getOrDefault()는, 특정 key가 특정 value와 map 되어있다면 해당 value를 리턴하고, 그렇지 않을 경우 default value를 리턴하는 메소드이다.

즉, 아래 solution에서 해시맵에 runner 를 key로 설정하고, runner를 이미 key로 가지고 있다면 해당 value를, 가지고 있지 않다면 default value = 0 을 리턴한다. (동명이인 체크)
이후 맵을 전체출력하며 key와 value 를 확인한다. 이 때, 메소드의 key의 값만 필요한 경우 keySet()을 사용하며, key와 value가 모두 필요할 경우 entrySet() 을 이용한다.
keySet()을 이용하여 key를 받아온 후, get()하여도 구동하기는 하나, 효율성 면에서 entrySet()을 사용하는 것이 낫다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for (String player : participant) map.put(player, map.getOrDefault(player, 0+ 1);
        for (String player : completion) map.put(player, map.get(player) - 1);
        
        for (Map.Entry<String, Integer> key : map.entrySet()) {
           if(key.getValue() != 0) {
                answer = key.getKey();
            }
        }
        return answer;
    } 
cs


사실, 아직 효율성이나 속도면에서는 어떻게 처리되는 것인지 잘 이해가 안되는 부분이 많다. 내 방법으로 풀었을 때 배열을 정렬하고 또 for loop 을 돌리는 거라 비효율적이라 생각했는데 테스트는 다 통과되고,
다른사람의 풀이 방법도 map 을 출력할 때 keySet()으로 key를 뽑고 다시 get()하여도 테스트는 다 통과되더라.

앞으로 프로그래머스 코딩테스트 연습 문제들 차근차근 풀어 정리하고, 해당 내용들 공부해서 같이 올리려고 한다. 문제 풀다 보면 다른 사람의 풀이를 보면서 오.. 어떻게 저런 생각을 했지? 하고 감탄하고 가는 경우가 많다. 자극 받고 나도 열심히 해야지.
HashMap 클래스의 메소드에 대해서는 다른 포스팅에서 좀 더 정리해 볼 예정이다.

덧. 티스토리에 마크다운 기능 추가됐다고 해서 깃허브와 티스토리 중 (지킬이나 마크다운 언어를 안배워도 되는) 티스토리로 블로그 개설했는데, 제공되는 마크다운이 썩 예쁘지가 않다. 하이라이팅 기능을 내가 못찾는 건지 아직 안된건지..

반응형