내 코드
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을 기억하자!
'코딩코딩 > 파이썬' 카테고리의 다른 글
파이썬으로 배우는 알고리즘 트레이딩 No module named 에러 해결 (0) | 2021.07.19 |
---|---|
주피터 노트북 가상환경 커널 추가하기 삭제하기 (0) | 2021.05.16 |
[프로그래머스] 완주하지 못한 선수 - 리스트 정렬, 해시 (0) | 2021.04.24 |
do it django 코드 저장소 (0) | 2021.04.04 |
[pandas]판다스 df.info()를 했는데 non-null counts가 안 보여요 (0) | 2021.03.17 |
댓글