일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Django Nodejs 차이점
- 입/출력
- 프레임워크와 라이브러리의 차이
- 엑셀
- UI한글변경
- getline
- 구조체와 클래스의 공통점 및 차이점
- 연결요소
- 표준 입출력
- 장고란
- Django의 편의성
- 매크로
- vscode
- scanf
- 시간복잡도
- Django란
- k-eta
- string 메소드
- 입출력 패턴
- correlation coefficient
- 알고리즘 공부방법
- 이분그래프
- double ended queue
- EOF
- iOS14
- c++
- 백준
- string 함수
- 2557
- 자료구조
Archives
- Today
- Total
Storage Gonie
Level 1 | Python | 완주하지 못한 선수(해시) 본문
반응형
1. 문제설명
수많은 마라톤 선수들이 마라톤에 참여하였고, 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
participant : 마라톤에 참여한 선수들 이름이 담긴 배열
completion : 완주한 선수들 이름이 담긴 배열
위와 같이 변수가 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
<중요제약조건>
참가자 중에는 동명이인이 있을 수 있습니다.
2. 주의해야 했던 점
- 쉬운문제라고 단순하게 생각해서 정렬도 안된상태로 둘을 비교하거나,
- 정렬을 했더라도 같은걸 찾았을 때 중간에서 pop 해서 없애버리는 방식은 리스트의 중간에서 이뤄나는 연산이므로 O(n)의 복잡도로 인해서 효율성 평가에서 막혀버렸었다.
- 이에 삽입자체가 O(1)의 복잡도를 가지는 dict 데이터형(해시테이블 알고리즘을 기반으로 만들어짐)을 사용하였다.
- 리스트 원소의 개수를 체크할 때 count 메소드를 사용하면 효율면에서 떨어져 합격할 수 없었다.
3. 내 풀이
def solution(participant, completion):
answer = ''
# 이름의 개수를 센 딕셔너리를 참가자, 완주자에 대해서 각각 만듬
p_dic = make_dictionary(participant)
c_dic = make_dictionary(completion)
# 중복된 이름이 없다면 1개만 나올 것임
lst = list(set(p_dic.keys()) - set(c_dic.keys()))
# 중복된 이름이 없는 경우
if len(lst) == 1:
answer = lst[0]
# 중복된 이름이 있는 경우
elif len(lst) == 0:
for p in participant:
if p_dic[p] != c_dic[p]:
answer = p
break
return answer
# 참가자 혹은 완주자 리스트로 이름을 카운트한 딕셔너리 생성
def make_dictionary(lst):
dic = {}
for item in lst:
keys = dic.keys()
# 딕셔너리에 없다면 생성 후 1로 초기화
if item not in keys:
dic[item] = 1
# 딕셔너리에 있다면 카운트 1증가
else:
dic[item] += 1
return dic
4. 다른 사람 풀이
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
return list(answer.keys())[0]
반응형
Comments