안드로이드 세계

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

알고리즘/자바(JAVA)

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

리안94 2021. 1. 19. 17:42

출처 : programmers.co.kr/learn/courses/30/lessons/42576

 

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

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

programmers.co.kr

 

문제 설명

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

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

 

이문제는 해시 맵을 사용하여도 되고, 두 배열을 정렬 후 동일하지 않은 값을 리턴해주면 되는 문제이다.

 

두 가지 방법을 다 설명할 것이다.

 

1. 해시 맵

public String solution(String[] participant, String[] completion) {
	String answer = "";
		
	Map<String, Integer> marathon = new HashMap<>();
		
	for(String name : participant) {
		if (marathon.containsKey(name)) {
			marathon.put(name, marathon.get(name)+1);	
		}else {
			marathon.put(name, 1);
		}
	}
		
	for(String name : completion) {
		marathon.put(name, marathon.get(name) - 1);
	}
		
	for(String key : marathon.keySet()) {
		if (marathon.get(key) > 0) {
			answer = key;
			break;
		}
	}
		
	return answer;
}

먼저 marathon이라는 해시 맵을 만들어준다. Key는 사람 이름을, Value는 인원수를 카운트하기 위해서 <String, Integer>로 선언해주었다.

 

participant를 먼저 넣어준다. 동명이인이 있을 수 있으니 키가 동일한 경우를 체크해주어야 한다. 키가 이미 존재하면 카운트를 하나 올려주고, 아니라면 1을 넣어준다.

 

다음은 completion의 값을 계산해주는데, 키가 다른 경우는 존재하지 않기 때문에 해당 Value를 1씩 빼준다.

 

마지막으론 완주를 하였다면 해시 맵에는 0이 되어야 하기 때문에 0이 아닌 경우를 찾고 리턴해주면 된다.

 

getOrDefault라는 메서드를 사용하게 되면 더욱더 깔끔한 코드가 될 수 있다. 코드 참고는 다른 사람 풀이에 들어가면 맨 위에 존재한다.

 

2. 배열

public String solution(String[] participant, String[] completion) {
    Arrays.sort(participant);
    Arrays.sort(completion);
        
    for ( i=0; i<completion.length; i++){

        if (!participant[i].equals(completion[i])){
             return participant[i];
        }
    }
    return participant[participant.length - 1];
}

 

먼저 두 개의 배열을 정렬을 해준다.

 

completion배열이 participant의 배열보다 항상 하나가 적기 때문에 completion배열의 길이를 이용해서 반복문을 돌린다.

 

반복문을 돌리면서 정렬이 서로 된 상태이기 때문에 동일한 인덱스에는 동일한 이름이 나와야 한다. 동일한 이름이 나오지 않는 경우를 찾아서 리턴해주면 되고, 마지막의 경우는 반복문을 돌지 않기 때문에 participant배열의 마지막 부분을 리턴해주면 된다.

Comments