본문 바로가기

내일배움 캠프/TIL

2023 03 20 모의고사 코드테스트

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

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

제한 조건

시험은 최대 10,000 문제로 구성되어있습니다.
문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answer return
[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

부끄러운 나의 코드...

def solution(answers):
    answer = []
    a = [1, 2, 3, 4, 5]
    b = [2, 1, 2, 3, 2, 4, 2, 5]
    c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    index1 = 0 
    index2 = 0
    index3 = 0
    a_cnt = 0
    b_cnt = 0
    c_cnt = 0
    for z in answers:
        if z == a[index1]:
                  a_cnt+=1
        if z == b[index2]:
                  b_cnt+=1
        if z == c[index3]:
                  c_cnt+=1    
        index1 = (index1+1) % len(a)
        index2 = (index2+1) % len(b)
        index3 = (index3+1) % len(c)
    rank = [a_cnt,b_cnt,c_cnt]
    toprank = max(rank)
    for i in range(1,len(rank)+1):
        if rank[i-1] == toprank:
            answer.append(i)
    return answer

제출하기전에는 index값을 가져올 방법을 생각하지를 못해서 따로 지정해서

각각 코드에 비교를 했었는데....

for idx,answer in enumerate(answers):

를 통해서 굳이 index1 2 3으로 나뉘어서 안해도 1부터 answers의 값만큼 증가하는 index값을 찾을수가 있게 되었고

index1 = (index1+1) % len(a)

이 코드도 인덱스의 이상만큼 올라가면 0으로 초기화 하려고 사용한 코드였는데

if score == a[idx%len(a)]:

이런식으로 굳이 초기화를 해주지않아도 5%5 --- 0 6%5--- 1 7%5 ----2

이런식으로 알아서 배열이 순환이 되는것을 뒤늦게 깨달았다...

 

조금더 코드를 줄일 수 있는 요소는 찾았지만 가장 부끄럽게 수정하고 싶은 부분만

정리해서 올렸습니다