https://programmers.co.kr/learn/courses/30/lessons/42576
문제 요약
마라톤 참가자 문자열 리스트 participarticipant 가 주어지고 완주한 선수 문자열 리스트인 completion이 주어집니다. 이 두 데이터를 이용해 완주하지 못한 선수를 return 하면 되는 문제입니다.
첫 번째 아이디어
문자열 리스트 중복 제거 이런 식으로 떠올렸습니다.
가장 먼저 떠올린 방법은 set을 이용한 방법!!
1
2
3
4
|
def solution(participant, completion):
answer = set(participant) - set(completion)
li = list(answer)
return li[0]
|
cs |
list형으로 변형하고 0번째 인덱스를 출력하도록 함은 어차피 완주하지 못한 선수는 1명뿐이고 우리가 원하는 것은 문자열로 반환이 된 값이기 때문입니다.
python으로 풀다보면 이 type 때문에 틀리는 경우도 종종 있으므로 주의해주세요.
뭐 어쨋든 set은 집합을 표현하기에 동명이인이 하나로 합쳐지는 문제점이 있어서 틀렸습니다.
두 번째 아이디어
for문을 돌면서 문자열을 전부 비교하고 이를 제거하다 보면 완주하지 못한 선수 한 명만 남지 않을까??
말도 안 되는 소스 코드가 등장할 예정이니 마음의 준비를 해주세요.
1
2
3
4
5
6
|
def solution(participant, completion):
for i in range(len(participant)):
for j in range(len(completion)):
if participant[i] == completion[j]:
participant.remove(completion[j])
return participant[0]
|
cs |
다시 보면 어이가 없는데 그때는 진짜 진지하게 풀었습니다.
여러 문제가 있지만 계속 지우다 보면 반복문이 리스트 범위를 넘어가서 에러가 발생합니다.
처음 아이디어 살리기
점점 고민하는 시간이 길어지면서 python 스럽지 않은 복잡한 코드가 나오더라고요.
애초에 Level 1인데..?? 그럴 리 없다면서 다른 방식을 찾아봤습니다.
collections.Counter를 찾았는데 이를 이용하면 되겠더라구요.
저 친구를 이용하면 ["mis","kiki","edam","mis"] 이런 리스트가 ({'mislav': 2, 'stanko': 1, 'ana': 1}) 이렇게 바뀐답니다.
해당 값들이 총 몇 번 나왔는지 딕셔너리형으로 바꿔줘요.
1
2
3
4
5
6
|
import collections
def solution(participant, completion):
answer = collections.Counter(participant) - collections.Counter(completion)
li = list(answer)
return li[0]
|
cs |
위 방식으로 풀어서 통과했습니다.
2번 아이디어를 살려보자
다 풀면 다른 사람들 코드를 볼 수 있거든요.
두 번째로 생각했던 아이디어를 올바른 방향으로 표현한다면 이런 코드가 되지 않을까 싶어요.
1
2
3
4
5
|
def solution(participant, completion):
for i in range(len(completion)):
if participant[i] != completion[i]:
return participant[i]
return participant[len(participant)-1]
|
cs |
본인의 코드랑 비교하면 허탈한 웃음이 나올 뿐...
반복문 자체도 틀렸지만 애초에 왜 제거라는 단어에 집착을 했는지...
많은 것을 배워가는 문제였습니다.
'알고리즘 > ps' 카테고리의 다른 글
[python] BOJ - 2217 로프 (0) | 2020.07.13 |
---|---|
[python] 프로그래머스 - 체육복 (0) | 2020.07.06 |
[BOJ] 백준 15829 Hashing (0) | 2020.07.02 |
BOJ 1152 (1) | 2020.06.30 |
그리디 알고리즘을 이용한 문제 (0) | 2019.06.03 |