본문 바로가기
Code/Python & Django

[Python][프로그래머스] 완주하지 못한 선수 - python

by 코드포휴먼 2020. 3. 6.

<문제>

 

<해결방법 - 실패>

javascript와 같이 sort()함수를 이용하고자 했다. 

for문의 동작방식이 javascript와 다르다.

그러나 IndexError: list index out of range 오류가 났다. 원소 개수가 하나 적은 completion 배열은 비교 불가능하다는 것이다. participant 배열의 마지막 요소만 남을 때 비교할 수 없어서 다른 방식을 찾아야 했다.

(1차-1과 1차-2는 비슷한 방식이다. 단순메모용)

#1차-1
def solution(participant, completion):
    answer = ''
    participant.sort()
    completion.sort()
    num = 0
    for p in participant:
        if p == completion[num]:
            num += 1
            continue
        else:
            answer += p
            return answer
#1차-2
def solution(participant, completion):
    answer = ''
    participant.sort()
    completion.sort()
    for n in range(len(participant)):
        if participant[n] != completion[n]:
            answer += participant[n]
            return answer

 

javascript가 index를 넘어선 원소에 대해 undefined로 처리해주는 것과 달리 파이썬은 아예 오류난다. 

javascript는 1차 방식으로 풀었다.

https://code4human.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98-javascript

 

[프로그래머스] 완주하지 못한 선수 - javascript

<문제> <해결방법> function solution(participant, completion) { var answer = ''; participant.sort(); completion.sort(); for(let i=0; i<participant.length; i++){="" if(participant[i]="" !="=" completion[i]){..<="" p=""> </participant.length;>

code4human.tistory.com

 

 

<다른 사람의 풀이>

zip() 함수를 이용해서 푼 경우

def solution(participant, completion):
    participant.sort()
    completion.sort()
    for par, com in zip(participant, completion) :
        if par != com :
            return par  

    return participant[-1]  #for문 다 돌고 하나만 남은 경우 solution(['a','c','c'], ['a','c'])   

 

hash() 함수를 이용해서 푼 경우

딕셔너리의 개념을 잘 

 

<사용된 개념>

1. sort() 함수

python으로 정렬하는 방법은 본체 정렬복사본 반환으로 나뉜다.

javascript의 sort()와 같이 복사본이 만들어지지 않고 본체가 정렬된다.

1.1.본체를 정렬하는 방법

오름차순 arr.sort()

내림차순 arr.sort(reverse=True)

거꾸로 뒤집기 arr.reverse()

a = [1, 10, 5, 7, 6]
a.reverse()
print(a)
#[6, 7, 5, 10, 1]


a.sort()
print(a)
#[1, 5, 6, 7, 10]


a.sort(reverse=True)
print(a)
#[10, 7, 6, 5, 1]

 

arr.sort()에는 key 옵션이 있다. key 옵션에 지정된 함수의 결과에 따라 정렬한다.

#원소의 길이를 key로 사용
m = '나는 파이썬을 잘하고 싶다'
m = m.split()
print(m)   #['나는', '파이썬을', '잘하고', '싶다']
m.sort(key=len)
print(m)   #['나는', '싶다', '잘하고', '파이썬을']
m.sort(key=len, reverse=True)
print(m)   #['파이썬을', '잘하고', '나는', '싶다']

 

1.2.복사본을 받아 정렬하는 방법

아래를 적용한 뒤 대입해서 사용한다. reversed(arr)는 iterable한 객체를 반환하므로 확인을 위해서는 list(obj)로 한번 더 변형해야 한다.

오름차순 sorted(arr)

내림차순 sorted(arr, reverse=True)

거꾸로 뒤집기 reversed(arr)   

x = [1 ,11, 2, 3]
y = reversed(x)
print(y)   #<list_reverseiterator object at 0x1060c9fd0>
print(list(y))
#[3, 2, 11, 1]

y = sorted(x)
print(y)
#[1, 2, 3, 11]

y = sorted(x, reverse=True)
print(y)
#[11, 3, 2, 1]

 

sorted(arr)도 마찬가지로 key 옵션을 활용할 수 있다.

#객체의 인덱스 중 일부를 key로 사용
student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
s = sorted(student_tuples, key=lambda student: student[2])   # sort by age
print(s)
#[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 

2. zip() 함수

python의 zip(*iterable)은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.

여기서 사용한 *iterable은 반복 가능(iterable)한 자료형 여러 개를 입력할 수 있다는 의미이다.

zip(*iterable)은 복사본 반환을 반환하는 reversed(arr)처럼 확인을 위해서는 list(obj)로 한번 더 변형해야 한다.

zip([1, 2, 3], [4, 5, 6])   #<zip at 0x23ff0cf5680>
list(zip([1, 2, 3], [4, 5, 6]))   
#[(1, 4), (2, 5), (3, 6)]

list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

list(zip("abc", "def"))
#[('a', 'd'), ('b', 'e'), ('c', 'f')]


#짝이 모자르면 버림해버린다.
list(zip([1, 2, 3], [4, 5, 6], [7, 8]))   
#[(1, 4, 7), (2, 5, 8)]

list(zip("abc", "de"))
#[('a', 'd'), ('b', 'e')]

 

3. 딕셔너리 (해시)

 

 

 

 


<출처>

python 정렬

https://wikidocs.net/16041

python sort()의 key 옵션

https://docs.python.org/ko/3/howto/sorting.html

다른 사람들의 풀이방법

https://ychae-leah.tistory.com/24?category=332760

https://programmers.co.kr/learn/courses/30/lessons/42576/solution_groups?language=python3

python zip() 함수

https://wikidocs.net/32#zip

 

<a href="https://developer.mozilla.org/ko/docs/Learn/Server-side/Django/skeleton_website"><p>링크 걸어보기</p></a>

 

댓글