Developer J

파이썬 완주하지 못한 선수 프로그래머스 본문

개발자 되기 part1/Python

파이썬 완주하지 못한 선수 프로그래머스

Developer J 2021. 4. 23. 07:00
반응형

문제

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

마라톤에 참여한 선수들의 이름이 담긴 배열 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"

 

잘못된 풀이

언어의 문법적 특성을 완전히 이해하지 못한 상황에서 문제를 풀고 있다는 생각이 바로 드는 코드이다.

부족한 부분을 파악하고 그에 해당하는 문법을 명확히 하기 위해 생각한 코드를 남긴다.

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

    participant.sort()  // 각각을 오름차순으로 정렬해서
    completion.sort()   // 순차적으로 비교해서 같은 것은 제거하려는 생각이었다
    
    for i in len(completion):        //하지만, 잘못된 문법이다...
        if participant(i) == completion(i):
            participant.pop(i)
        answer = participant(-1)  //list 슬라이싱을 착각... participant[-1]
        
    return answer

TypeError: 'int' object is not iterable 이라는 에러를 마주했다. 


완벽히 알아야 할 개념

1. pop은 어디에 쓰는 가? list

   a = [1,2,4]

   a.pop()

   a = [1,2]

   a.pop(1)

   a = [1]

 

2. 오류 확인 과정에서 데이터 타입 확인하는 법은?

   print(type(a))  --> "<class 'int'>"

 

3. for문

for i in range(1, 2):
    print(i) // 출력: 1
   
for i in range(0, 2):
    print(i) // 출력: 0
             //       1

person = ["jun", "jang", "sun"]

for i in person:
    print(i) // 출력: jun
             //       jang
             //       sun

 

    불가능한 케이스

result=[1, 2]

for i in range(result):   

    print(i)
    
TypeError: 'list' object cannot be interpreted as an integer

------------------------------------------------------------------

result=[1, 2]

for i in len(result):   

    print(i)
    
TypeError: 'int' object is not iterable

 


해답

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for p,c in zip(participant, completion):
        if p != c:
            return p
    return participant.pop()
import collections          //print는 이해를 돕기위해 넣은 것

def solution(participant, completion):
    a=collections.Counter(participant)
    print(a)                       //Counter({'leo': 1, 'kiki': 1, 'eden': 1})
    answer = collections.Counter(participant) - collections.Counter(completion)
    print(answer)                  //Counter({'leo': 1})
    print(list(answer.keys()))     //['leo']
    return list(answer.keys())[0]  // leo

알게된 문법

zip : 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다. 리스트의 같은 인덱스끼리 짝을 지어준다. 만약 리스트의 길이가 다를 경우 같은 인덱스끼리만 짝을 짓고, 나머지는 zip 객체에서 제외된다.
i=[1, 2, 3]
k=[1, 2, 3, 4]
for a in zip(i, k):
  print(a)
  
 출력
(1, 1)
(2, 2)
(3, 3)

i=["1", "2", "3"]         //문자가 되는 지 항상 헷갈리기 때문에 적어본다
k=["1", "2", "3","4"]
for a in zip(i, k):
  print(a)

 출력
('1', '1')
('2', '2')
('3', '3')

 

느낀 점

문제 하나를 풀면서 잘 모르는 문법을 정리하는 것이 기본기를 다지는데 도움이 될 것 같다. 개인기(알고리즘 문제 풀기)에 사용할 언어를 python으로 정했으니 시간 나는데로 python에 익숙해져 보겠다. 

반응형