본문 바로가기
알고리즘/문제 풀이

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

by _eunji_ 2021. 7. 15.

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

 

코딩테스트 연습 - 완주하지 못한 선수

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

programmers.co.kr

문제 설명

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

제한사항

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

해시 개념이 생각나지 않아서 못 풀었다.

 

알고리즘

1. String값을 키로 갖고 Integer형을 값으로 갖는 해시 맵을 선언한다.

2. 반복문을 통해 participant를 탐색하면서 참여자 이름을 키로 하고 값을 1씩 증가시킨다. (기본값은 0)

3. completion을 탐색하면서 이름이 같을 경우 1씩 감소시킨다.

4. 참여했을 때 1의 값을 갖고 완주했을 때 1씩 감소시키므로 0이 아닌 키를 찾는다. (동명이인이나 완주하지 못했을 경우 0이 아닌 1의 값을 갖는다)

 

 

* getOrDefault(Object key, V DefaultValue)

  • key : 값을 가져와야 하는 요소의 키
  • defaultValue :지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값
import java.util.HashMap;
class Solution {
    public String solution(String[] participant, String[] completion) {
        HashMap<String,Integer> map=new HashMap<String,Integer>();
        String answer = "";
        
        for (String name : participant){ map.put(name, map.getOrDefault(name, 0) + 1);}
        for (String name : completion){ map.put(name, map.get(name) - 1);}

        for (String key : map.keySet()) {
            if (map.get(key) != 0){
                answer = key;
            }
        }
        
        
        return answer;
    }
}

 

 

 

다른 풀이

import java.util.*;
class Solution {
    public String solution(String[] participant, String[] completion) {
        
        String answer = "";
       
        Arrays.sort(participant); 
        Arrays.sort(completion);
        
        int i; 
        for(i = 0; i < completion.length; i++){ 
            if(!participant[i].equals(completion[i])){
                return participant[i]; } // 중간에 다른 이름을 발견한 경우
        }

        return participant[participant.length-1]; //마지막 선수의 이름이 다른 경우
    }
}

해시 문제로 분류되어 있지만 정렬을 이용하면 쉽게 풀 수 있다.

댓글