Problem Solving

[프로그래머스] 완주하지 못한 선수 - Python3

Dev_en 2023. 1. 29. 04:49

문제 설명

마라톤에 참여한 선수들의 이름과 완주한 선수들의 이름이 담긴 배열이 주어졌을 때, 완주하지 못한 선수의 이름을 return 하는 문제(동명이인 O)

https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 알고리즘 분류 - 해시
  • 난이도 - Level 1

접근 방법

1. Dictionary

set으로 바꾸고 차집합을 구하는 방식으로 풀어보려 했더니 JSON 에러가 나서 딕셔너리를 이용해 풀었다.

{이름: 경기장 내 인원 수}의 형태로

participant의 이름들을 key로, 0을 value로 가지는 딕셔너리를 만든 후, participant를 탐색하며 발견된 이름들의 value에 1씩 더해줬다.

그리고 completion을 탐색하며 이름이 발견되면 딕셔너리의 value값을 1씩 빼줬다.

이 과정을 마치면 value 값이 1 이상인 key값이 완주하지 못한 선수의 이름이 된다.

 

2. Set

(다른 사람의 풀이 참고)

set을 이용하면 json 오류는 둘째치고 동명이인을 어떻게 처리할지가 고민이었는데, completion 원소들이 participant와 completion에서 각각 몇 번 등장하는 지를 세준 후, 등장횟수가 다른 원소를 리턴하면 되는 거였다.

 

3. Collections

(다른 사람의 풀이 참고)

가장 간단한 방법이다. Counter 자료형으로 변환해준 후, participant-completion 차집합 연산을 하면 남은 원소가 답이 된다.

 

4. Hash

(다른 사람의 풀이 참고)

졸리니까 자고 일어나서 마저 공부해보겠다....


관련 개념

collections.Counter()

해시 가능한 객체를 세는 데 사용하는 딕셔너리 서브 클래스

얘랑 해시 개념도 자고 일어나서 마저....


답안 코드

+9

1. Dictionary

def solution(participant, completion):
    answer = ''
    
    cnts = {p:0 for p in participant}
    
    for p in participant:
        cnts[p] += 1
        
    for c in completion:
        cnts[c] -= 1
        
    for p in participant:
        if cnts[p] > 0:
            answer = p
            
    return answer

2. Set

(다른 사람의 풀이 참고)

#

3. Collections

(다른 사람의 풀이 참고)

#

4. Hash

(다른 사람의 풀이 참고)

#