Python/알고리즘 문제 풀이

[코테] 완주하지 못한 선수

마이구미+ 2023. 7. 14. 16:26

문제 링크

 

프로그래머스

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

programmers.co.kr

<로직 고민/>

  • 오잉 participant를 돌리면서 completion에 해당하는 이름이 있으면 빼면 되는 거 아닌가??
def solution(participant, completion):
    answer = ''
    for marathoner in participant:
        if marathoner in completion:
            participant.remove(marathoner)
    print(participant)
    return answer
  • 이렇게 했는데 왜 안 되지..? participant에 한 명만 남아야 하는데 다 2명씩 남는다 뭐지..?
def solution(participant, completion):
    answer = ""
    while True:
        if participant[-1] in completion:
            participant.pop()
        else:
            answer = participant[-1]
            break
    return answer
  • 이렇게 하니까 이제 3번째 예시에서 인덱스에러가 뜬다
  • 동명이인 때문에 그러는 거 같아서 
  • 완주 명단에 있으면 완주 명단에 있는 이름도 같이 뺐다
...
            finish = participant.pop()
            completion.remove(finish)
...
  • 5번째 줄을 finish라는 변수에 담고 그 아래줄을 추가했다
  • 이렇게 하니까 예시 3개는 통과하는데 채점하니까 효율성에서 시간초과로 탈락이다 ㅠ
  • 음....일단 그러니까 in을 쓰는 건 버려야겠다
  • 차라리 이름 별로 정렬을 하고 participant랑 completion을 비교해서 다르면 그때의 participant가 답이 되지 않을까
def solution(participant, completion):
    participant.sort()
    completion.sort()
    completion.append("nothing")
    for p, c in zip(participant, completion):
        if p != c:
            return p
  • 이렇게 하니까 일단 예시 3개는 통과했다
  • 4번째 줄에 nothing을 추가해준 이유는 completion이 하나 모자라기 때문에 개수를 맞춰주기 위함이다
  • 2번 예시처럼 정답이 맨 끝에 위치하게 됐는데 completion이 하나 모자라면 null 값이 뜨기 때문...
  • 흠 근데 정렬을 하는 게 맞나..? 정렬하는 것도 시간 오래 걸리지 않나?
  • 일단 채점 ㄱㄱ
  • 오 됐다,,

<완성된 풀이/>

def solution(participant, completion):
    participant.sort()
    completion.sort()
    completion.append("nothing")
    for p, c in zip(participant, completion):
        if p != c:
            return p

코드 실행 시간


<다른 사람 풀이/>

- 천재풀이1

import collections


def solution(participant, completion):
    answer = collections.Counter(participant) - collections.Counter(completion)
    return list(answer.keys())[0]
  • 와 이건 또 뭐래...
  • Counter 객체라서 빼기 연산이 가능한 거라고 하넹,,,,흠,,,,
  • 신기하군...

- 천재풀이2

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p, c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1]
  • null값이 나와서 participant랑 completion 길이를 맞춰줘야 하는구나 하고 nothing을 넣었는데 그냥 이렇게 하면 되는거였군...
  • 이 풀이가 더 좋은 것 같다 사람 이름이 nothing일 수도 있으니까...
  • 물론 nothing 말고 숫자 0 이나 1 이런 거 넣으면 절대 사람 이름과 겹칠 일은 없겠지만...!

<수정/>

def solution(participant, completion):
    participant.sort()
    completion.sort()
    completion.append(-1)
    for p, c in zip(participant, completion):
        if p != c:
            return p
  • 사람 이름이 nothing일 수도 있으니까 절대 사람 이름과 겹칠 일 없게 completion 맨 끝에 -1을 추가해주었다