python/알고리즘 문제풀이

[프로그래머스 | 파이썬3] 모의고사_enumerate, zip 활용

빛날희- 2021. 5. 15. 14:59

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

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 


 

리스트의 요소들의 인덱스와 값을 돌려주는 enumerate함수와 리스트와 리스트를 차례대로 튜플형태로 붙여 돌려주는 zip함수를 사용하여 풀었다. 

 

def solution(answers):

	# 1,2,3번의 답안 유형을 answers 길이에 각자 리스트(패턴)의 길이로 나눈 값만큼 반복하여 리스트 생성
    # 답안 길이가 각 리스트의 길이보다 작을 경우, 0번 반복될 경우를 방지하기 위해 1을 더함
    
    one= [1,2,3,4,5]; two= [2,1,2,3,2,4,2,5]; three= [3,3,1,1,2,2,4,4,5,5]
    leng= len(answers)
    
    # zip으로 학생들의 답안과 답지의 답안을 순서대로 zip함수로 묶음
    
    one= list(zip(one * (leng//5 +1), answers)); two= list(zip(two * (leng//8 +1), answers)); three= list(zip(three * (leng//10 +1), answers))
    
    # 만일 튜플의 첫번째 요소(학생답안)과 두번째 요소(답지)가 같으면 result요소에 1씩 더함
    
    result=[0,0,0]
    for i in range(leng):
        if one[i][0]==one[i][1]: result[0] += 1
        if two[i][0]==two[i][1]: result[1] += 1
        if three[i][0]==three[i][1]: result[2] += 1
        
    # result리스트의 값 중 최대가 되는 값의 인덱스와 같은 인덱스들에 1을 더해 리스트로 반환
   
   return [i+1 for i, value in enumerate(result) if value == max(result)]

 

return 문 부분에서 인덱스 값을 돌려줄 때 enumerate말고도 filter함수를 사용하여 다음과 같이 구현할 수도 있다. 

list(filter(lambda x: result[x] == max(result), range(len(result))))

하지만 이 경우엔 각 인덱스 값에 1씩 더해주는 연산식을 적용하기 복잡하여 list comprehension을 사용하여 풀었다.