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

Dragony·2022년 1월 25일
0

코딩테스트

목록 보기
28/29

근 2년만에 다시 코딩테스트 연습을 하려고 프로그래머스에 들어갔다... 코테 푸는 방법을 다 까먹어서 1단계부터 애먹었다 ㅠ^ㅠ
그때는 C++ 로만 풀었었는데 졸업하고 잘 안쓰다보니ㅋㅋ 메서드들 까먹...ㅠ 대학생때 매일 백준 풀때는 이렇게 돌머리는 아니였던 것 같은데..
오늘부터 1일 1커밋 1일 1코테 노오력해보장 +_+....


문제는 아래와 같다. 링크 들어가서 참고.
https://programmers.co.kr/learn/courses/30/lessons/42576

1트

def solution(participant, completion):
    answer = ''
    for i in participant:
        if(participant.count(i) > completion.count(i)):
            answer = i
    
    return answer

처음에는 그냥 간단하게 파이썬 count 함수를 이용해서, 사람 수 비교해서 구하려고 했었다. (어차피 낙오자는 1명이니까, 동명이인 고려해서 참여자 배열에 더 많이 카운팅 된 이름이 낙오자 이름임.)
하지만 결과는..

효율성 테스트에서 무너짐.
여러 생각이 들었다. 배열을 도는게 아닌가?ㅜ 아니면 count를 쓰면 안되나....

카테고리 생각 안하고 백지상태에서 풀려고했는데.. 해시 카테고리에 있으니 Hash를 써서 풀어보기로 했다.


2트

일단 hash를 사용하려고 봤더니 key를 사람 이름으로 두고, 사람 수를 value 값으로 두는게 가장 쉬운 접근일 것 같았다.

일단 소스는 아래와 같다.

def solution(participant, completion):
    hash_dict = {}
    answer = ''
    for i in participant:
        if(i in hash_dict):
            hash_dict[i] += 1
        else:
            hash_dict[i] = 1
    
    for i in completion:
        hash_dict[i] -= 1
        
    for key, value in hash_dict.items():
        if value == 1:
            answer = key
            
    
    return answer

파이썬 딕셔너리에, 참여자 이름을 key로, 해당 이름을 가진 사람 수를 value로 잡고 값을 저장해주었다.

그리고 완주자 배열을 for문으로 돌면서, 인원 수에서 1씩 빼준다.

중요한 것은, 참여자 배열 N이면 완주자 배열은 N-1이다. 문제의 가정 자체가 완주하지 못한 사람은 무조건 1명이기 때문이다.

최종 딕셔너리에서, 동명이인과는 상관없이 완주하지 못한 사람의 value가 1이 될 것임은 자명하다.

그래서 value가 1인 key(사람 이름)를 찾아내 리턴했다

통과~!



1트보다 코드도 더 길고 지저분하다. 하지만 퍼포먼스적으로 뭔가 차이가 있지 않을까 생각된다. 소스 자체도 리팩토링 할 수 있을 것 같지만.. 포스팅은 여기서 마무리하곘다.

profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.

0개의 댓글