본문 바로가기
코딩코딩/파이썬

[프로그래머스] 모의고사

by g0n1 2021. 4. 25.
728x90

내 코드

def solution(answers):
    s1, s2, s3 = 0,0,0
    n = len(answers)
    c = n//40+1
    a1 = [1,2,3,4,5]*(8*c)
    a2 = [2,1,2,3,2,4,2,5]*(5*c)
    a3 = [3,3,1,1,2,2,4,4,5,5]*(4*c)
    
    for i in range(n):
        if answers[i] == a1[i]:
            s1 += 1
        if answers[i] == a2[i]:
            s2 += 1
        if answers[i] == a3[i]:
            s3 += 1
            
    scores = [s1,s2,s3]
    m = max(scores)
    winners = []
    for i in range(3):
        if scores[i] == m:
            winners.append(i+1)
    return winners

개 드럽다 ㅋㅋ

답안지를 문제 개수를 커버할 수 있을만큼 만들어놓고 인덱싱으로 하나씩 비교해ㅔ보면서 맞은 수를 체크한다.

그 뒤에는 최고점을 찾아 m으로 기억해두고, 점수를 하나씩 보면서 최고점과 같은 점수를 가진 index가 몇번인지 체크해두었다가 return해준다.

남의 코드

enumerate 사용

for문을 반복하면서 해당 횟수를 같이 반환해주는 iterator? 다.

pattern1[idx%len(pattern1)]

답안지 참조를 이런 식으로 하였다. 풀어서 살펴보자면,

문제번호%답개수 를 하면 문제번호를 답개수로 나눈 결과의 나머지가 나온다. 그 나머지로 답안지를 인덱싱하는 것이다. 이러면 단순한 답안지라도 cycle을 돌면서 참조할 수 있다. 점수도 인덱싱으로 +=1 해주었다.

for q, a in enumerate(answers):
	for i, v in enumerate(p):
    		if a == v[q%len(v)]:
        		s[i] += 1

이런 식으로 점수를 채점하는 코드도 있었다. 

q: 문제 번호

a: 문제의 답

i: i번째 사람, 사람을 가리키는 인덱스

v: i번째 사람이 작성한 답안지

각 문제 번호 마다 (문제번호%답개수)로 답을 인덱싱하여 비교하고 채점한다.

위의 코드를 좀 더 축약하여 표현했다고 볼 수 있겠다.

cycle 사용

from itertools import cycle

a = cycle([1,2,3,4,5])

for i in range(len(answers)):
	if answers[i] == a[i]:
    	s += 1

itertools의 cycle을 사용했다. cycle은 인덱스가 인덱싱하는 리스트의 전체 개수를 넘어가면 알아서 맨 첫번째 원소부터 다시 인덱싱해주는 편리한 자료형이다. 원형 연결 리스트? 라고 하면 될 것 같다.

나도 이 자료구조에 대해서 배운 적이 있어서 구현해서 써볼까 싶었는데 기억이 안나서 포기했다.ㅎㅎ

그냥 itertools에서 cycle을 import 하자!!!

 

정리

for idx, v in enumerate(list):
	어쩌고 저쩌고



from itertools import cycle
cycle([1,2,3,4,5])

굳이 cnt를 만들지 않아도 되는 enumerate,

알아서 참조를 편리하게 해주는 cycle을 기억하자!

728x90

댓글