🧪 알고리즘 ~ 코딩테스트

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

핑크빛연어 2021. 3. 26. 17:13

 

프로그래머스 에서 코딩테스트 문제 완주하지 못한 선수 를 풀어봤습니당~

1단계입니당!

 

programmers.co.kr/learn/courses/30/lessons/42576

 

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

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

programmers.co.kr

 

 

 

* 문제 설명

 

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

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

제한사항

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

입출력 예

participantcompletionreturn

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

 


 

 

 

문제풀이

 

저는 3가지 풀이방법을 거쳐서 통과를 하였는데요!

하나씩 작성해보겠습니다~

 

 

풀이 1

 

처음엔 이렇게 간단하게 풀었는데 

[ 정확성: 10.0 , 효율성: 0.0 ] 이 나왔습니다.....😇! 

 

이 문제는 HashMap 을 이용해서 풀어야 하는 문제여서 그런것 같았습니다.

 

import java.util.*;

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(!participant[i].equals(completion[i])) {
		    	answer = participant[i];
		    }
   		}
        
        return answer;

    }
}

 

 

풀이 2 - HashMap 사용 (1)

 

그래서 HashMap 을 사용해서 풀어보았어요!@_@!

그런데 또 [ 정확성: 10.0 , 효율성: 0.0 ] 이 나왔습니다.....😨🤭😱! 

 

import java.util.*;

class Solution {
	public String solution(String[] participant, String[] completion) {
		String answer = "";
        
		Arrays.sort(participant);
		Arrays.sort(completion);
        
		Map<String, Integer> hash = new HashMap<>();
    	
		//이름을 key, 이름마다 몇개가 있는지를 value 로 넣기 
		for(int i=0; i<participant.length; i++) {
			// hash.getOrDefault(a, b) 
			// -- hash에 a라는 키가 존재하면 a, 그렇지 않으면 b 를 반환 
			hash.put(participant[i], hash.getOrDefault(participant[i], 0)+1);
		}
        
		//이름(key)마다 개수(vaule)를 -1 해줘서 
		//개수(value) 가 0 이 아닌건 완주하지 못한 선수가 된다.
		for(int i=0; i<completion.length; i++) {
			hash.put(completion[i], hash.get(participant[i])-1);
		}
    	
		//개수(value) 가 0 이 아닌 건 완주하지 못한 선수가 되므로
		//value(개수) 가 0 이 아닌 key(이름) 을 answer 에 넣어준다. 
		for(String key : hash.keySet()){ //저장된 key값 확인
			if(hash.get(key) != 0) {
				answer = key;
				break;
			}
		}
		return answer;

	}
}

 

 

풀이 3 - HashMap 사용 (2)

 

그래서 다시 도전해보았는데 HashMap 을 사용할 때 for문은 다음과 같이 쓰는게 효율성이 좋은 것 같아효..😬

이렇게 사용하니 통과하였습니다!

 

import java.util.*;

class Solution {
	public String solution(String[] participant, String[] completion) {
    	String answer =""; 
        
    	// Arrays.sort(participant);
    	// Arrays.sort(completion);
        
       	HashMap<String, Integer> hash = new HashMap<>();
       
       	//이름을 key, 이름마다 몇개가 있는지를 value 로 넣기 
       	for(String part : participant) {
    		// hash.getOrDefault(a, b) 
           	// -- hash에 a라는 키가 존재하면 a, 그렇지 않으면 b 를 반환 
           	hash.put(part, hash.getOrDefault(part, 0) + 1); 
       	}
           
       	//이름(key)마다 개수(vaule)를 -1 해줘서 
       	//개수(value) 가 0 이 아닌건 완주하지 못한 선수가 된다.
       	for(String comp : completion) {
        	hash.put(comp, hash.get(comp) -1); 
       	}
           
       	//개수(value) 가 0 이 아닌 건 완주하지 못한 선수가 되므로
       	//value(개수) 가 0 이 아닌 key(이름) 을 answer 에 넣어준다. 
       	for(String key : hash.keySet()) {   //저장된 key값 확인
        	if(hash.get(key) != 0) { 
            	answer = key; 
          		break; 
           	} 
      	} 
       	return answer;

    }
}

 

예를 들어

participant 배열 : ["mislav", "stanko", "mislav", "ana"]

completion 배열 : ["stanko", "ana", "mislav"]

가 이렇게 되어있으면

Arrays.sort 를 이용하여 정렬을 먼저 해줍니다.

 

그러면 

participant 배열 : ["ana", "mislav", "mislav", "stanko"]

completion 배열 : ["ana", "mislav", "stanko"]

가 되겠죠?

 

participant.length 만큼 for문을 돌려서

Map<String, Integer> hash = new HashMap<>();

이 map 에 key 는 이름, value 는 이름의 개수 값을 넣어줍니다.

 

그러면 hash 의 값은 아래의 표처럼 나올거예요!

key value
ana 1
mislav 2
stanko 1

 

 

여기서 completion.length 만큼 for문을 돌려서

key(이름)값 마다 value(개수) 에 -1 을 해줍니다.

 

그러면 완주한 사람 이름의 개수는 0이 되고 완주하지 못한 사람의 이름의 개수는 1이 되겠죠?

key value
ana 0
mislav 1
stanko 0

이렇게 될거예요~

 

그 후 마지막으로 hash.keySet() 을 사용해서 hash 의 value 가 0 이 아닌 key 값을 answer 에 넣으면 되겠죠?

 

 

그래서 완주못한 선수는 mislav 가 됩니다.

 

 

 


 

마지막으로..! HashMap 값을 출력하는 방법 2가지 입니다.

 

 

HashMap 값을 출력하는 방법

 

HashMap 이란?

 - Map 인터페이스를 구현한 대표적인 Map  컬렉션

 - Map<key, value> 형태의 객체

 - 키는 중복될 수 없습니다

 - 기존에 저장된 키와 동일한 키로 값이 저장되면 기존의 값은 없어지고 새로운 값으로 대치됩니다.

 - 해시함수를 통해 key 와 value 가 저장되는 위치를 결정하므로,

    사용자는 그 위치를 알 수 없고 삽입되는 순서와 들어 있는 위치 또한 관계가 없습니다.

 

 

entrySet() 사용

//entrySet() 활용
for(Entry<String, Integer>entry : hash.entrySet()) {
   System.out.println("[ key : "+entry.getKey()+" ] value : "+entry.getValue());
}

 

 

keySet() 사용

//keySet() 사용
for(String key : hash.keySet()){  
   System.out.println("[ key : "+key+" ] value : "+hash.get(key));   	   
}

 

 

 

완주하지 못한 선수 끝~🏃🏻‍♀️🏃🏻‍♂️

 

 

 

728x90
반응형