본문 바로가기
파이썬/파이썬 알고리즘

파이썬 프로그래머스 level 1. 모의고사

by Go! Jake 2021. 4. 30.

- 이전 글: 파이썬 프로그래머스 level 1. 신규 아이디 추천

- 이전 글: 파이썬 프로그래머스 level 1. 크레인 인형뽑기 게임

  문제

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요

  풀이

def solution(answers):
    answer=[]
    count1, count2, count3 =0,0,0
    first=[1,2,3,4,5]
    second=[2,1,2,3,2,4,2,5]
    third=[3,3,1,1,2,2,4,4,5,5]
    for index, value in enumerate(answers):
        if first[index%len(first)]==value:
            count1+=1
        if second[index%len(second)]==value:
            count2+=1
        if third[index%len(third)]==value:
            count3+=1
    _list=[count1,count2,count3]
    for i,j in enumerate(_list):
        if j==max(_list):
            answer.append(i+1)
            answer.sort()
    return answer

 

 

 

<1>

    answer=[]
    count1, count2, count3 =0,0,0
    first=[1,2,3,4,5]
    second=[2,1,2,3,2,4,2,5]
    third=[3,3,1,1,2,2,4,4,5,5]

answer - 가장 문제를 많이 맞춘 사람을 담는다.

count1, count2, count3 - 정답 횟수를 비교하기 위해 각각 변수를 만든다. 각각 1번 2번 3번 사람에 대응된다.

first,second,third - 3개 리스트에 정답이 반복되는 리스트를 만든다. 이는 추후에 정답을 맞췄는 지 비교하는 데 사용된다.

 

<2>

    for index, value in enumerate(answers):
        if first[index%len(first)]==value:
            count1+=1
        if second[index%len(second)]==value:
            count2+=1
        if third[index%len(third)]==value:
            count3+=1

for index, value in enumerate(answers): - 굉장히 유용하게 쓰이는 패턴이다. answers에서 출력하여 각각 답을 비교한다.

- index가 필요한 이유는 first[index%len(first)]==value 구조를 통해 first 리스트의 몇 번째 값으로 답과 맞추고 있는 지 비교해야되기 때문에 몇 번째 index인지 중요하다.

- enumerate는 각 값이 for문을 돌 때마다 index와 같이 표출해준다. 이 경우 index, value로 나누어 각각 index가 몇 번인지, 그리고 이에 해당하는 answer의 값을 받아 처리한다. enumerate를 사용하지 않는다면 별도로 index를 구해서 first 리스트의 몇 번째 리스트 요소로 답을 맞추고 있는 지 구해야된다.

- index%len(first) 정답의 같은 패턴이 반복되기 때문에 나머지 값으로 처리한다. 반복 = 나머지 고려 패턴이다. 예를 들어 리스트 요소 index를 0 1 2 3 을 반복해야된다면, 나머지로 처리하면 가능하기 때문이다.

- if first[index%len(first)]==value: first 리스트에 특정 인덱스가 돌아갈 때 해당하는 값과 정답이 같으면 count1을

올린다. 각각 1,2,3번 사람에 대응된다.

    

 

<3>

    _list=[count1,count2,count3]
    for i,j in enumerate(_list):
        if j==max(_list):
            answer.append(i+1)
            answer.sort()
    return answer

- _list=[count1,count2,count3] 리스트에 다시 담는다. 이 때 0번 index는 1번 사람, 1번 index는 2번, 2번 index는 3번 사람이 된다.

- for i,j in enumerate(_list):

      if j==max(_list):

          answer.append(i+1)

          answer.sort()

  return answer

다시 enumerate를 사용한다. 이 때 max(_list) 즉 최대 카운터를 가지는 값과 인덱스가 동일하다면, 해당 사람을 넣기 위해 i+1하여 담는다. 예를 들어 1번 사람이 최대로 맞춘 사람이라면, 0번 인덱스에서 j==max(_list) d조건으로 걸리게 되고, 이 때의 index 값인 i를 answer 리스트에 담는 것이다.

 

for문으로 최댓값과 현재값 비교 > 같다면 그 때의 index를 answer 리스트에 담는 구조이다.

 

- 다음 글: 파이썬 프로그래머스 level 1. K번째수

 

댓글