SW 마에스트로 준비(8)

프로그래머스 level 1

완주하지 못한 선수

https://programmers.co.kr/learn/courses/30/lessons/42576

마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

백준과 달리 특이한 점은, 입력값이 배열로 주어지며 return은 문자열로 나와야 한다.

※ 참가자 중에는 동명이인이 있을 수 있다 -> 집합 사용 불가.

=> 어떤 자료구조를 써야할지 모르겠다. 해시를 써야하는 것 같다.

=> 3월13일. 모르겠어서 다른 블로그 참조.

참고한 블로그 https://oneshottenkill.tistory.com/331

첫 번째 궁금증

participant = rl() 이렇게 입력을 받은 뒤, print(participant.sort()) 하면 에러가 난다. 전부다 문자열로 인식되기 때문이다. 즉, 함수의 인자값으로 들어갈 때, 해당 인풋은 list형식으로 읽히지만, input()으로 받아들여지는 모든 타입은 문자열이다.

str 형태로 list에 저장하려면 input().split()을, int형으로 저장하려면 list(map(int,input().split()))을 하면 된다.

두 번째 궁금증

def solution(participant, completion):
    participant.sort()
    completion.sort()

    for i in participant:
        for j in completion:
            if(i == j):
                participant.remove(i)

    return participant


print(solution(['leo', "kiki", "eden"], ["eden", "kiki"]))

=> 이렇게 돌렸는데 값이 이상하다. 출력값이 ['kiki', 'leo']로 나온다. 왜냐하면 리스트를 순회하면서 리스트의 요소들을 제거하다보니 스킵하고 지나가는 값들이 생기게 된다. 그래서 놓치는 값들이 발생하게 된다.

=> 새로운 리스트를 만들어서 제거하는 방법이 가장 좋다!

 import sys


def rl(): return sys.stdin.readline()


def solution(participant, completion):

    participant.sort()
    new = participant[:]
    completion.sort()

    for i in participant:
        for j in completion:
            if(i == j):
                new.remove(i)
    return new


print(solution(['leo', "kiki", "eden"], ["eden", "kiki"]))

이런 식으로 수정 가능하겠다.

세 번째

def solution(participant, completion):
    participant.sort()
    new = participant[:]
    completion.sort()
    
    for i in participant:
        for j in completion:
            if (i == j):
                new.remove(i)    
    return ' '.join(new)

이렇게 작성하니, 모든 동명이인을 다 퇴출시키는 문제가 발생한다.

네 번째

다른 사람 코드를 참고하니,

대다수가 for문의 방향을 completion부터 시작하고 그 다음 안쪽 for문을 participant로 둔 뒤, participant에 대해서 remove를 해준 것을 확인할 수 있다.

이 경우 정확도 40, 효율성 0이 나온다.

이 이상 잘 모르겠어서 이제부터는 찾아본 코드에 대한 정리다.

다섯번째 코드 참고하기

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for i in range(len(completion)):
        if participant[i] != completion[i]:
        	#완주 못한 사람 체크
            return participant[i]
	# 동명이인이고 완주를 하지 못했으나 이름 상 제일 뒤에 있는 사람
    return participant[-1]


출처: https://oneshottenkill.tistory.com/331 [copyndpaste.cf <- 주소창에서 포트폴리오 확인]

왜 이 코드가 가능한가 ? 전제 조건에 단 한명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였다는 글이 있다. 따라서 if문에 들어와서 return을 하지 못했다면, 가장 마지막, 동명이인에 해당하는 경우를 return 해줘야 한다.


참고자료

리스트에서 단어 가져오는 방법?

0%