프로그래머스: 완주하지 못한 선수

kgh128·2023년 1월 29일

코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Programmers/%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80_%EB%AA%BB%ED%95%9C_%EC%84%A0%EC%88%98.java


1. 완주한 선수들을 HashMap에 정리

  • key: 선수의 이름
  • value: 해당 이름을 가진 선수의 수

완주한 선수들(completion 배열)을 HashMap에 위와 같이 넣는다. 완주한 선수들 중에서도 동명이인이 있을 수 있으니 해당 선수의 이름이 map에 존재하지 않으면 value로 1을 넣고, 이미 존재하면 value로 (기존의 value) + 1을 넣는다.

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

2. 완주하지 못한 선수 찾기

참가자들(participant 배열)을 돌면서 해당 선수가 map에 있는지를 확인한다. 완주하지 못한 선수가 되는 조건은 두가지가 있다.

  • map의 key에 이름이 없는 선수 -> !map.containsKey(participant[i])
  • map의 value가 0인 선수 -> map.get(participant[i]) == 0

두번째 조건은 동명이인 때문에 넣은 조건이다. 동명이인이 있는데 한 명은 완주하고, 한 명은 완주하지 못한 경우 완주한 선수들을 정리한 map의 key에는 이름이 존재한다. 그러나 완주한 선수는 한 명이기 때문에 해당 key에 대한 value는 1이 된다.

위의 두가지 조건에 모두 해당되지 않는 경우는 해당 이름을 가진 선수 한 명이 통과했다는 의미로 선수 이름에 대한 value에 (기존의 value) - 1을 넣는다. 동명이인의 경우에는 한 명이 통과하여 (기존의 value) - 1을 하면 value가 0이 되므로 다른 한 명은 두번째 조건에 걸려 완주하지 못한 선수를 찾아낼 수 있다.

for (int i = 0; i < participant.length; i++) {
	if (!map.containsKey(participant[i]) || map.get(participant[i]) == 0) {
		answer = participant[i];
		break;
	}
            
	map.put(participant[i], map.get(participant[i]) - 1);
}

동명이인을 고려하지 않아 3번 테스트 케이스에 걸렸다. 문제를 꼼꼼히 읽자.

0개의 댓글