문제

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

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

 

제한사항

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

나의 코드

import java.util.HashMap;
public class AnIncompletePlayer {


	public static String solution(String[] participant, String[] completion) {
		String answer = "";
		HashMap<String, Integer> hash = new HashMap<>();	
        
		for(String par : participant) {		
			hash.put(par, hash.getOrDefault(par, 0) + 1);	
		}
		
		for(String com : completion) {			 
			hash.put(com, hash.getOrDefault(com, 0) - 1);
			
		}
		
		for(String par : participant) {	
			if(hash.get(par) == 1) {		
				answer = par;
			}
		}
		return answer;
	}
}

나의 풀이

1. HashMap 을 이용했다. Map에 들어가는 타입은 <String, Integer> 로 정의를 해놓고

2. String 에는 참가자의 이름, Integer 에는 참여 인원을 저장했다.

3. 처음 for문은 참가자의 길이만큼 돌려 HashMap 에 put하는 과정에 String에는 참가자를 넣으며 Integer에는

    getOrDefault 메서드를 이용했다. HashMap에는 참가자의 이름, 인원 수가 저장되면서 중복된 이름이 있다면

    getOrDefault 메서드가 value를 반환하면서 value에 +1 을 해주어 중복값을 처리한다.

    getOrDefault - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환한다.

4. 두번째 for문에서는 완주자의 길이만큼 돌리며 HashMap에 저장되어있는 value들을 -1씩 해준다.

    중복이 아닌데 완주를 하지 못했을 때 : value는 1로 올라간 후 다시 -1 되지 않아 1인 상태로 있는다.

    중복인데 완주를 하지 못했을 때 : value는 2로 올라간 후 -1이 되어 1인 상태로 있는다.

5. 마지막 for문은 참가자의 길이만큼 돌리며 참가자의 이름에 해당하는 value가 1인 참가자의 이름을 answer에 넣는다.

 

깃허브 : github.com/juju1997/CodingTest/blob/master/CodingTest/src/hash/AnIncompletePlayer.java

 

+ Recent posts