본문 바로가기
Coding Test

231209 완주하지 못한 선수 - Level 1

by mmm- 2023. 12. 9.

문제 설명

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

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

 

제한사항

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

 

입출력 예

 

입출력 예 설명

예제 #1
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #2
"vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

예제 #3
"mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.


코드

import java.util.*;

class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);
        String answer = participant[completion.length];
        HashMap<Integer, String> map = new HashMap<>();
        
        for(int i=0; i<completion.length; i++) {
            map.put(i, completion[i]);
        }
        
        for(int i=0; i<completion.length; i++) {
            if(!map.get(i).equals(participant[i])) {
                answer = participant[i];
                break;
            }
        }
        
        return answer;
    }
}

 

풀이

participant와 completion을 비교하기 위해 정렬을 한 후, answer를 선언하며 participant의 마지막 번째 인덱스에 있는 값을 넣어준다.그리고 HashMap을 통해 key에는 Integer형의 인덱스 번호를, value에는 String 형의 completion의 i번째 값을 넣어준다. 그 후 0부터 completion의 길이전까지 for문을 돌려주는데, 그만큼 돌려주는 이유는 completion과 participant의 값들을 비교할건데 completion의 길이가 1만큼 더 짧기 때문에 IndexOutOf 에러를 막기 위해서이다. 반복문 안에서 map의 i번째에 있는 값과 participant의 i번째에 있는 값이 다르면 answer에 participant[i]의 값을 넣어주고 break; 를 해주고 그 값이 같다면 반복문을 계속해서 돈다. 여기서 answer를 생성할 때 participant배열의 마지막 인덱스 값으로 초기화해주는 이유는 for문을 completion만큼 돌면 participant의 마지막 인덱스에 존재하는 사람의 이름이 answer에 들어가지 않기 때문에 그러한 문제를 막기 위해 생성할 때 participant배열의 마지막 인덱스 값으로 초기화해준 것이다.

 

다른 사람 풀이

import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        HashMap<String, Integer> hm = new HashMap<>();
        for (String player : participant) hm.put(player, hm.getOrDefault(player, 0) + 1);
        for (String player : completion) hm.put(player, hm.get(player) - 1);

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

participant를 hm에 넣어주는데 player가 존재하는 키면 해당하는 값을 가져와 +1을 해주고, hm에 존재하지 않는다면 값에 0을 넣어준다. 그리고 완주자의 경우에는 키인 player에 해당하는 값을 가져와 -1을 해준다.

hm의 키를 하나씩 가져와 그에 해당하는 값이 0이 아니면 완주를 하지 못했다는 것을 의미하기 때문에 answer에 key를 넣어준다.

 

정리

  • keySet()
    : map에 값을 전체 출력하는 메서드 
    • map에 값을 전체 출력하기 위해 사용되는 메서드는 keySet()말고 entrySet()도 있음.
    • keySet()은 key의 값만 필요한 경우에 사용되지만, 
      entrySet()은 key와 value의 값이 모두 필요한 경우 사용한다. 

 

참고
1) https://tychejin.tistory.com/31

 

 

'Coding Test' 카테고리의 다른 글

231214 바탕화면 정리 - Level 1  (0) 2023.12.14
231212 폰켓몬 - Level 1  (0) 2023.12.12
231130 문자열 나누기 - Level 1  (0) 2023.11.30
231129 체육복 - Level 1  (1) 2023.11.29
231128 로또 최고 순위와 최저 순위 - Level 1  (1) 2023.11.28