일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 쓰레드 풀
- 스프링 부트3
- streamlit
- 컬렉션 프레임웍
- conda remove
- 스프링 부트
- 사이킷런 회귀
- 컬렉션 인터페이스
- 차원증가
- 오라클
- h2 데이타베이스
- Java
- 완주하지못한선수
- 자바 로그 레벨
- Selenium
- oracle
- REST API
- 파이썬
- 알고리즘
- 사이킷런
- URI 원칙
- 자바 열거형
- openai
- Python
- WinError5
- db
- 프로그래머스
- 셀레니움
- GIT
- 머신러닝
- Today
- Total
노트 :
[프로그래머스] 완주하지 못한 선수 본문
https://school.programmers.co.kr/learn/courses/30/lessons/42576
[문제 설명]
수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.
마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.
[제한사항]
- 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
- completion의 길이는 participant의 길이보다 1 작습니다.
- 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
- 참가자 중에는 동명이인이 있을 수 있습니다
[입출력 예]
participant | completion | return |
["leo", "kiki", "eden"] | ["eden", "kiki"] | "leo" |
["marina", "josipa", "nikola", "vinko", "filipa"] | ["josipa", "filipa", "marina", "nikola"] | "vinko" |
["mislav", "stanko", "mislav", "ana"] | ["stanko", "ana", "mislav"] | "mislav" |
[입출력 예 설명]
예제 #1: "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #2: "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.
예제 #3: "mislav"는 참여자 명단에는 두 명이지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.
[첫번째 시도] 효율성 테스트 실패
def solution(participant, completion):
for person in participant:
if person in participant:
if participant.count(person) != completion.count(person):
return person
else:
return person
for문과 containment문을 사용하여 participant 배열에는 속해있지만, completion에는 속해있지 않은 선수 이름을 반환한다.
동명이인이 있을 수 있으므로 count 함수를 사용하여 participant 배열의 선수 수와 completion 배열의 선수 수를 비교한다.
같지 않다면, 해당 선수 이름을 반환한다.
이 방법으로 정확성 테스트는 통과했지만, 효율성 테스트에서 시간초과로 실패하였다.
[두번째 시도] 효율성 테스트 실패
def solution(participant, completion):
for person in participant:
if participant.count(person) != completion.count(person):
return person
처음 시도했던 방법을 좀더 단순화하였다.
containment문을 사용없이, 바로 participant 배열과 completion 배열 요소의 개수를 비교하였다.
일치하지 않는다면, 해당 선수명을 반환하는 방식을 사용하였으나 여전히 시간초과로 실패ㅠ
전혀 다른 방식으로 풀어야 한다는 것을 깨달았다.
[세번째 시도] 효율성 테스트 실패
def solution(participant, completion):
p_set = set(participant)
p_dict = {}
for p in p_set:
p_dict[p] = participant.count(p)
print(p_dict)
for c in completion:
p_dict[c] -= 1
print(p_dict)
for i in p_dict:
if p_dict[i] != 0:
return i
participant의 선수명을 키로, 동명이인의 수를 값으로 가지는 딕셔너리를 만들었다.
이후 completion의 요소를 for문으로 돌면서 해당 요소를 키로 가지는 딕셔너리의 값을 하나씩 줄인다.
최종적으로 딕셔너리의 값이 0이 아닌 키를 반환한다.
그런데!!!
이 방법도 효율성 테스트에서 실패했다ㅠㅠㅠ
좀더 고민해봐야겠다...
'Algorithm' 카테고리의 다른 글
선택 정렬 (Selection Sort) (0) | 2023.05.18 |
---|---|
[알고리즘] 알고리즘 설계 기법 (1) | 2023.02.02 |
[프로그래머스] 완주하지 못한 선수2 (0) | 2022.10.03 |
[프로그래머스] 문자열 다루기 기본 (0) | 2022.09.28 |
[프로그래머스] 내적 (0) | 2022.09.27 |