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을 사용하여 풀었다.
'python > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스 | 파이썬3] 소수 만들기_combinations활용 (2) | 2021.05.17 |
---|---|
[프로그래머스 | 파이썬3] 음양더하기_ 기본연산식, sum함수 사용 (2) | 2021.05.15 |
[프로그래머스 | 파이썬3] 체육복_ set, pop 사용 (1) | 2021.05.13 |
[프로그래머스 | python3] K번째 수_ sort() 사용 (2) | 2021.05.12 |
[프로그래머스 | python3] 완주하지 못한 선수 (1) | 2021.05.11 |