알고리즘

[프로그래머스] 모의고사 - 파이썬/python

욘아리 2024. 5. 27. 18:21

https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

수포자 삼인방이 문제를 전부 아래와 같은 방식으로 찍으려고 할 때, 가장 많은 문제를 맞힌 사람이 누구인지 구하는 문제다.

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, ...

 

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

 

예시

Example 1:

answers: [1,2,3,4,5]
return: [1]

 

Example 2:

answers: [1,3,2,4,2]
return: [1,2,3]

 

풀이

def solution(answers):
    answer = []
    
    person1 = [1, 2, 3, 4, 5]
    person2 = [2, 1, 2, 3, 2, 4, 2, 5]
    person3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    cnt = [0, 0, 0]
    
    for i, v in enumerate(answers):
        if v == person1[i % len(person1)]:
            cnt[0] += 1
        if v == person2[i % len(person2)]:
            cnt[1] += 1
        if v == person3[i % len(person3)]:
            cnt[2] += 1    

    max_cnt = max(cnt)
    for j, v in enumerate(cnt):
        if v == max_cnt:
            answer.append(j + 1)
    
    return answer
  • 수포자가 정답을 찍는 방식을 전부 리스트로 나타낸다.
  • 각각 수포자가 맞춘 문제 수를 저장할 리스트를 만든다.
  • answers 리스트의 각 문제 정답을 순회하며 각 수포자의 방식을 비교한다.
    • 문제의 인덱스를 수포자의 방식 길이로 나눈 나머지를 사용하여 반복을 처리한다.
    • 정답을 맞혔다면 해당 수포자 인덱스를 증가시킨다.
  • 가장 많이 맞춘 문제 수를 찾고, 그에 해당하는 수포자의 번호를 구한다.