본문 바로가기
Algorithm/Programmers

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

by 홍월이_ 2023. 1. 11.

시작하며...

모든 알고리즘 문제 풀이는 제가 직접 짜서 정답을 맞춘 결과만을 공유합니다.

마지막 'More Solution'은 다른 정답자들 풀이 중 생각지 못했던 부분들이나 좋게 느껴진 풀이법 몇개를 가져와서 공유하였습니다.

 

[Level 1] 모의고사

 

프로그래머스

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

programmers.co.kr

 

문제 설명

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

입출력 예

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.

 

My Solution

def solution(answers):
    stu1 = [1, 2, 3, 4, 5]
    stu2 = [2, 1, 2, 3, 2, 4, 2, 5]
    stu3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    scores = [0, 0, 0]
    
    for idx, answer in enumerate(answers):
        if stu1[idx % len(stu1)] == answer:
            scores[0] += 1
        if stu2[idx % len(stu2)] == answer:
            scores[1] += 1
        if stu3[idx % len(stu3)] == answer:
            scores[2] += 1
    
    answer = []
    for i, score in enumerate(scores):
        if score == max(scores):
            answer.append(i+1)
            
    return answer

학생들의 점수와 정답을 전부 비교해보아야하는 완전탐색 문제이다.

  • 학생들의 문제 풀이 패턴을 stu1, stu2, stu3에 저장한다. 같은 패턴을 반복해서 사용하므로 최초 1회 패턴만 저장해둔다.
  • 세 학생의 정답수를 카운트 하는 scores라는 길이 3의 리스트를 만든다.
  • 각 학생들의 풀이 패턴과 정답을 비교해서 같다면 scores의 해당 학생들의 인덱스에 1씩 카운트 해준다.
  • 학생들마다 풀이 패턴의 길이가 다르고, 풀이 패턴이 반복 순환하기떄문에 enumerate를 사용해서 정답의 인덱스를 가져와 학생들의 정답 풀이패턴 길이로 나눈 나머지를 이용하여 풀이패턴에서의 인덱스를 찾는다.
  • 정답 비교가 끝나면 scores에는 각 학생들의 점수가 담겨져 있고, 그 중에서 점수가 가장 높은 학생을 찾아내면 된다.
  • 최고점 학생이 여러명 일수있기때문에 max 함수를 바로 쓰기보다는 반복문을 활용해서 비교해주면서 answer 배열에 추가해주었다.

 

More Solution

from itertools import cycle

def solution(answers):
    giveups = [
        cycle([1,2,3,4,5]),
        cycle([2,1,2,3,2,4,2,5]),
        cycle([3,3,1,1,2,2,4,4,5,5]),
    ]
    scores = [0, 0, 0]
    for num in answers:
        for i in range(3):
            if next(giveups[i]) == num:
                scores[i] += 1
    highest = max(scores)

    return [i + 1 for i, v in enumerate(scores) if v == highest]

이중 for문을 구성해서 시간복잡도가 늘어난 것이 아쉽지만, cycle이라는 모듈이 있어서 공유려고 가져와보았다!

댓글