티스토리 뷰

 

💻JAVA 코드 바로보기

 

 

문제 설명

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

 

 


🌼JAVA 알고리즘

 

초기화면

 

 

 

 

풀이 과정

participant의 모든 값을 조사해서, participant와 completion 사이에 같은 값이 없을 때에만 answer에 추가하면 된다!
라고 생각하여 풀었으나, 중복되는 이름에서 정상적으로 작동하지 않았다
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        boolean t = false;
        int cnt = 0;
        for(int i=0;i<participant.length;i++){
            for(int j=0;j<completion.length;j++){
                if(participant[i].equals(completion[j])) t = true;
            }
            if(t==false) answer=participant[i];
        }
        System.out.println(participant.length); //확인용

        return answer;
    }
}

 

이를 해결하기 위해 위의 풀이방식에서, 한번 판별에 사용한 completion의 값을 null로 변경하여 중복이름을 다시 처리하지 않도록 수정했다
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        boolean t = false;
        int cnt = 0;
        for(int i=0;i<participant.length;i++){
            t = false;
            for(int j=0;j<completion.length;j++){
                if(participant[i].equals(completion[j])){
                    completion[j]=null;
                    t = true;
                } 
            }
            if(t==false) answer=participant[i];
        }
        

        return answer;
    }
}

그런데 위 방법으로 풀었을 때 테스트결과가 잘 나왔지만,
채점 결과는 case1을 제외하고 모두 실패했다.

break문을 추가하여 실패경우를 수정했다.
class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        boolean t = false;

        for(int i=0;i<participant.length;i++){
            t = false;
            for(int j=0;j<completion.length;j++){
                if(participant[i].equals(completion[j])){
                    completion[j]=null;
                    t = true;
                    break;
                } 
            }
            if(t==false) answer+=participant[i];
        }

        return answer;
    }
}
이렇게 해도 효율성검사에서는 모두 시간초과로 총점 50점이 최대였다..
해시를 사용하는 문제이지만, 아직 해시개념을 배우지 않았기에 이정도로 만족하겠다!

 

 

 

 

완성 코드 (효율성 검사 통과 x)

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        boolean t = false;

        for(int i=0;i<participant.length;i++){
            t = false;
            for(int j=0;j<completion.length;j++){
                if(participant[i].equals(completion[j])){
                    completion[j]=null;
                    t = true;
                    break;
                } 
            }
            if(t==false) answer+=participant[i];
        }
        

        return answer;
    }
}

 

코드 결과

 

 

 

 

 

정답 코드 (다른사람 풀이 참고)

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; 
              System.out.println(answer);
              break; 
          } 
        }
        return answer;
    }
}

 

 

 


링크

 

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

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

programmers.co.kr

 

 

About Me

💻GitHub/KimSky904 KimSky904 - Overview Department of New Media Software. KimSky904 has 8 repositories available. Follow their code on GitHub. github.com

code-review.tistory.com

 

댓글