본문 바로가기

코딩테스트

[프로그래머스] 완주하지 못한 선수 문제풀이

스터디원과 함께 하루 1개씩 코딩테스트 문제를 풀기로 했다. 

오늘 풀었던 문제는 프로그래머스의  [완주하지 못한 선수] 라는 문제다. 

 

 

 

문제 설명 : 

수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

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

 

제한 사항 : 

  • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
  • completion의 길이는 participant의 길이보다 1 작습니다.
  • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
  • 참가자 중에는 동명이인이 있을 수 있습니다.

[틀렸던 문제풀이]

 

이 문제는 개인적으로 꽤 애를 먹었던 것 같다. 

 

처음에는 문제가 간단하다고 생각했다. 

단순히 비교하고, 두 배열 간의 다른 부분을 뽑아내기만 하면 된다고 생각했기 때문이다.

 

그래서 작성한 코드는 다음과 같다. 

def solution(participant, completion):
    answer = ''
    for p in participant:
            if p in completion:
                completion.remove(p)
            else:
                answer = p
                print(p)

1.participant에 있는 요소 하나하나를 completion에도 있는지 확인한다. 

 

2.만약 completion에 해당 요소가 있다면 completion에서 그 요소를 삭제한다. 

-> 이름이 중복된 경우를 제외하기 위해서. 

 

3.만약 completion에 해당 요소가 없다면, answer에 그 요소를 집어넣는다. 

 

 

이런식으로 문제를 풀었다. 그런데, 아니나 다를까 효율성 점수가 0점이 나왔다. 

나는 코딩테스트를 거의 공부해본적이 없는지라, 효유성 점수가 무엇인지 몰랐다. 

그래서 조금 검색을 해서 알아봤더니, 

연산횟수를 고려해야 한다는 것이다. 

 

연산횟수가 많아지면 많아질수록, 연산의 시간이 늘어나고, 연산의 시간이 늘어난다는것은 

시간적인 면에서 효율성이 떨어진다는 것이다. 

 

이 효율성에 영향을 미치는 것들에는 대표적으로

1.이중 반복문

2.remove 사용. 

 

이 있었다. 내가 작성한 코드에 그대로 들어가 있던 것이다. 

그래서 새롭게 문제에 접근해야했다. 

 

romove를 사용하지 말것. 

이중반복문을 가능하면 사용하지 말것. 

 


[맞았던 문제풀이]

 

def solution(participant, completion):
    answer = ''
    participant.sort()
    completion.sort()

    for p,c in zip(participant,completion):
        if(p == c):
            continue
        else:
            answer = p
            break
    return answer

 

이 문제는 내게 있어서 두마리 토끼를 잡을 것을 요구하고 있었다. 

1)두 배열을 비교해서 없는 요소를 찾을 것. 

2)한 배열에 같은 요소가 두개가 있을 경우도 고려해서 찾을 것.. 

 

 

이 문제를 어떻게 해결할 수 있을까 고민해보다 나온 방법은 

 

1.배열을 순서대로 정렬하기

 

그래서 배열을 순서대로 정렬하는 방법을 검색했다. 

그랬더니 sort()라는 함수를 찾을 수 있었다. 

 

바로 적용시켜보았더니,

두 배열이 같은 순서대로 요소가 나열되는 것을 발견할 수 있었다. 

 

2.두 배열을 순서대로 나란히 비교하기. 

이 두 배열을 어떻게하면 순서대로 나란히 비교할 수 있을까.

고민했다. 고민해보던 중 2시간 전에 풀었던 '내적'문제에서 사용했던 

zip함수가 기억이 났다. 

그래서 바로 두 함수를 나란히 집어놓고 그 안에서 서로를 비교하게 만들었다. 

-> for p,c in zip(participant,completion):
        if(p == c):
            continue
        else:
            answer = p
            break

 


느낀점 : 

아직 파이썬 함수가 익숙하지 않다. 

그래도 이제 시작인걸 욕심내지 않으려한다. 

오늘만해도 벌써, zip, sort, remove함수를 배웠다. 

 

무엇보다 문제가 풀리고, 정답입니다! 라는 alert창에 나올때는

이 문제가 아무리 난이도가 낮다고 해도

내게는 기쁨이 된다.