본문 바로가기
프로그래머스 풀이/level_1(Java)

[프로그래머스 연습문제 level_2 ] 완주하지 못한 선수

by happyhelen 2021. 11. 2.

문제 설명

 

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

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

제한사항

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

입출력 예

 

["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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

 

 


 

 

처음 생각

 

이중 for 문이 효율성 테스트에서 실패할 걸 짐작은 했지만 우선 그렇게 풀어보기로 했다

 

참가자 중에 동명이인이 있을 수 있으므로 우선 완주한 것으로 확인되는 참가자는 "x" 를 대입하는 것으로

 

표시하고 break; 로 빠져나오도록 풀 것이다

 

그리고 이중 for 문을 사용하지 않기 위해 Arrays.sort() 로 participant 배열과 completion 배열을 오름차순 정렬하고

 

같은지 비교하다가 만약 다르다면 그것이 정답이 된다

 

 

 

내가 푼 방법

 

- 이중 for 문 활용

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        // 완주자 이름이 참가자 명단에 있는지 확인
        for(int i=0; i<completion.length; i++){
            for(int j=0; j<participant.length; j++){
                if(completion[i].equals(participant[j])){
                    participant[j] = "x";
                    break;
                }
            }
        }
        
        for(String a : participant){
            if(!a.equals("x")){ // "x" 로 표시되지 않은 이름이 answer
                answer = a;
            }
        }
        return answer;
    }
}

 

 

 

다른 방법

 

- Arrays.sort() 활용

import java.util.Arrays;
class Solution {
    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;
    }
}

 

 

 

++ 해시 사용

import java.util.Map;
import java.util.HashMap;

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        
        Map<String, Integer> map = new HashMap<>();
        
        // key:참가자이름, value: 인원수+
        for(String p : participant){ 
            map.put(p, map.getOrDefault(p,0)+1); 
        } // 동명이인은 getOrDefault로 불러온 값 + 1
        
        // key:참가자이름, value: 인원수-
        for(String c : completion){
            map.put(c, map.get(c)-1);
        }
        
        // value:1 인 참가자가 answer
        for(Map.Entry<String, Integer> entry : map.entrySet()){
            if(entry.getValue()==1){
                answer = entry.getKey();
            }
        }

        return answer;
    }
}