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

Cjw.dev·2023년 3월 31일
0

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

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


제한사항

마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
completion의 길이는 participant의 길이보다 1 작습니다.
참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
참가자 중에는 동명이인이 있을 수 있습니다.
입출력 예
participant completion return
["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
"leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

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

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

문제풀이

해당 문제는 A배열와 B배열을 비교하여 A배열에 있는 데이터가 B배열에 있는가 없는가를 비교하여
없는 값을 뽑아내는 문제이다.
보자마자 이중 포문이 떠올라 풀어보았으나 시간초과로 틀렸다고 나왔다.

public String solution(String[] participant, String[] completion) {
        String answer = "";

        for(int i=0; i<participant.length; i++){
            for(int j=0; j<completion.length; j++){
                if(participant[i].equals(completion[j])){
                    participant[i] = "";
                    completion[j] = "";
                }
            }
        }
        for(int i=0; i<participant.length; i++){
            if(!participant[i].equals("")){
                answer = participant[i];
            }
        }
        return answer;
    }

다른풀이

해시를 사용하여 풀어보았다.

public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        HashMap<String, Integer> map = new HashMap<>();
       // 해시에 participant 담기
        for(String player : participant) 
            map.put(player, map.getOrDefault(player, 0) + 1); // defaultValue : 동명이인 처리
	  
      	// completion 인원 있으면 value 값 빼기 => 완주한 인원
        for(String player : completion) 
            map.put(player, map.get(player) - 1);

        // value가 0이 아닌 사람 찾기(완주 못한사람)
        for(String key : map.keySet()){
            if(map.get(key) != 0){
                answer = key;
            }
        }
        return answer;

paricipant

이름(key)명수(value
leo1
kiki1
eden1
for(String player : participant) 
            map.put(player, map.getOrDefault(player, 0) + 1); // defaultValue : 동명이인 처리

위 코드를 통해 표와 같이 해시에 담고 completion과 비교하여 해당 인원이 있으면 value값을 -1 하는 방식으로 value값을 지워나간다. (아래 코드)
그럼 결국 마지막에 value값이 남은 인원이 완주하지 못한 인원이 된다.

 for(String player : completion) 
            map.put(player, map.get(player) - 1);

알게된 것

getOrDefault : 해당 key가 있으면 value값을 가져오고, 없으면 지정한 디폴트값을 반환
ex) map.getOrDefault(player, 0) => player가 있으면 1 없으면 0을 반환

profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글