완주하지 못한 선수에 대한 문제 설명은 다음의 링크를 참고해주시기 바랍니다. 문제 설명
코딩테스트 연습 - 완주하지 못한 선수
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수
programmers.co.kr
해당 문제는 참가자(participant)와 완주자(completion)가 주어지고, 단 한 명의 선수를 제외하고 모든 선수가 마라톤을 완주했다는 조건을 만족합니다. 따라서 정렬과 딕셔너리를 이용하여 문제를 해결할 수 있습니다.
다음은 정렬을 이용한 문제 해결 방법입니다.
- 참가자 배열을 정렬한다.
- 완주자 배열을 정렬한다.
- index를 하나씩 돌어가며 index에 따른 참가자, 완주자 배열의 값을 비교한다.
- 3의 값이 같다면 아무런 처리를 하지 않는다.
- 3의 값이 다르다면 해당 index의 참가자가 완주하지 못한 선수이므로 결과로 반환한다.
- 모든 index를 돌아본 후에도 결과가 반환되지 않았다면 마지막 선수가 완주하지 못한 선수이므로 결과로 반환한다.
다음은 정렬 해결 순서를 코드로 구현한 것입니다.
def solution(participant, completion):
participant.sort()
completion.sort()
for i in range(len(completion)):
if (participant[i] != completion[i]):
return participant[i]
return participant[len(participant)-1]
처음 참가자와 완주자의 값이 같지 않은 부분이 정답이 될 수 있는 이유는 한 명을 제외한 모든 선수가 마라톤을 완주했기 때문입니다.
다음은 딕셔너리를 이용한 문제 해결 방법입니다.
- 참가자 배열값을 순환한다.
- 딕셔너리에 1의 원소가 존재하지 않으면 key, value를 1의 원소, 1로 초기화해준다.
- 딕셔너리에 1의 원소가 존재하면 해당 key의 value를 1 더 해준다.
- 완주자 배열 값을 순환한다.
- 딕셔너리에 4의 원소의 value를 -1 해준다.
- 딕셔너리의 key, value를 순환하며 count가 0이 아닌 선수를 반환한다.
다음은 딕셔너리 해결 순서를 코드로 구현한 것입니다.
def solution (participant, completion):
answer = []
player_dict = {}
for player in participant:
if player in player_dict:
player_dict[player] += 1
else:
player_dict[player] = 1
for player in completion:
player_dict[player] -= 1
answer = [player for player, count in player_dict.items() if count != 0]
return answer[0]
결괏값을 answer[0]으로 반환할 수 있는 이유는 한 명의 제외한 모든 선수가 마라톤을 완주하였기 때문에 answer 배열에는 값이 1개가 존재하고, 그것이 정답이라는 것이 보장이 되기 때문입니다.
딕셔너리를 사용하면 정렬로 해결하는 방법과는 다르게 여러 명이 완주하지 못한 상황에 대해서 조금 더 유연하게 대처할 수 있습니다.
정렬을 사용한 방법, 딕셔너리를 사용한 방법 모두 효율성 테스트를 통과하지만 계산된 시간을 비교해보았을 때 딕셔너리를 사용한 방법이 더 빨랐습니다. 아마 정렬을 사용한 방법은 O(nlogn)(정렬 시간)의 시간 복잡도를 가지고, 딕셔너리를 사용한 방법은 O(n)(참가자, 완주자 순환)의 시간 복잡도를 가지기 때문인 것 같습니다.
이번 문제는 처음에는 정렬을 이용하여 해결하였지만 추후 시간이 흐른 뒤에 해쉬로 접근하여 한번 더 해결을 하였습니다. 이렇듯 프로그래밍에는 여러 해결 방법이 존재합니다. 다른 방법으로 접근하여 해결하는 방법을 연습하는 것도 코딩 테스트 능력 향상에 있어 중요한 것 같습니다.
'취업을 준비하며 정리하는 컴퓨터 지식 > Problem Solving' 카테고리의 다른 글
[Problem Solving] 프로그래머스 92341 주차 요금 계산 (0) | 2022.01.17 |
---|---|
[Problem Solving] 프로그래머스 92334 신고 결과 받기 (0) | 2022.01.14 |
[Problem Solving] 프로그래머스 67257 수식 최대화 (0) | 2022.01.12 |
[Problem Solving] 프로그래머스 42626 더 맵게 (0) | 2022.01.11 |
[Problem Solving] 백준 4963 섬의 개수 (0) | 2022.01.10 |