본문 바로가기

Coding Test

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

문제설명

 

더보기

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

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

 


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

✔ 문제를 보고싶으신 분은 더보기를 눌러주세요!

 

 

풀이

내가 이해한대로 문제를 요약해보자면,

📌마라톤에 참여한 선수 전체의 이름이 담긴 배열 participant 

📌마라톤에 참여하여 완주한 선수의 이름이 담긴 배열 completion 

📌완주하지못한 선수의 이름을 return (동명이인이 존재할 수 있다)

이다. 완주한 선수의 이름이 담긴 배열이 마라톤에 참여한 전체 선수의 배열보다 크기가 1이 작다는 걸 봐서 모두가 완주하는 상황은 없는 것 같다^_^....  

 

어떻게 문제를 풀까 고민하다.. HashMap과 삼항연산자가 생각나서 써보기로 했다. 삼항연산자 때문에 효율성 측면에서 안 좋지않을까 했는데 다행히 채점결과는 정확성: 50.0/효율성: 50.0으로 합계 100점이었다!  

 

제출 후 다른 사람의 풀이를 보는데... 깔끔하고 getOrDefault에 대해 배울 수 있는 좋은 코드가 있어서 가지고 왔다👍🏻

 

 

<내 풀이>

import java.util.Stack;

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

        HashMap<String, Integer> hsParticipant = new HashMap<>();

        for(String part : participant) {
        	hsParticipant.put(part, (hsParticipant.containsKey(part)? hsParticipant.get(part)+1 : 1 ));
        }
        // .containsKeys(key)는 Hashmap의 키 값이 존재하는 지 확인해준다. 존재하면 true, 없으면 false

        for(int i=0; i<completion.length; i++) {
	        if(hsParticipant.containsKey(completion[i])) {
	        	hsParticipant.put(completion[i], hsParticipant.get(completion[i]) - 1);
	        }
        }

        for(int i=0; i<participant.length; i++) {
        	if(hsParticipant.get(participant[i])>0) {
        		answer = participant[i];
        		break;
        	}
        }

        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);
	// .getOrDefault를 사용한 이유는 HashMap의 put은 key가 존재하면 value를 새로운 값으로 바꿔주는데
	// 이걸 사용하므로써 중복체크하여 1이 아닌 2가 들어가게 된다
        
        for (String key : hm.keySet()) {
            if (hm.get(key) != 0){
                answer = key;
                break; // 풀이엔 없었지만 넣으면 좋을 거 같아서 추가해봄
            }
        }
        return answer;
    }
}

 

 

직장동료와 코테스터디처럼 했던 코코만모에서

풀었던 문제😀 !