티스토리 뷰

728x90

[Python]프로그래머스 문제풀이 - 모의고사






서문




오늘은 프로그래머스 사이트 / 코딩테스트 / 완전탐색 부분 첫 번째 문제풀이를 하겠습니다. 문제를 살펴보겠습니다. 😉




코드의 전개 논리가 궁금하시다면, 밑의 사이트에 들어가서 코드를 작성하여 visualize해주시면 코드가 어떤 식으로 흘러가는지 눈으로 파악하실 수 있습니다!



출처: http://pythontutor.com/




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 함수를 작성해주세요.




2. 제한사항


  • 시험은 최대 10,000 문제로 구성되어있습니다.

  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.

  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.



3. 입출력 예 설명


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

#1


  • 수포자 1은 모든 문제를 맞혔습니다.

  • 수포자 2는 모든 문제를 틀렸습니다.

  • 수포자 3은 모든 문제를 틀렸습니다.

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



#2


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





본문




요약



  • 세 명이 자신만의 찍기 방법으로 문제를 찍는다.

  • answers에 문제의 답이 주어진다.

  • 가장 많이 맞춘 사람을 return해라 (각 사람은 순서대로 1,2,3)


문제풀이



코드


def solution(answers):
    a = [1, 2, 3, 4, 5] * 2000
    b = [2, 1, 2, 3, 2, 4, 2, 5] * 1250
    c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 1000

    a_c = 0
    b_c = 0
    c_c = 0
    final = []

    for i in range(len(answers)):
        if  a[i] == answers[i]:
            a_c += 1

        if b[i] == answers[i]:
            b_c += 1

        if c[i] == answers[i]:
            c_c += 1

    final.extend([(1,a_c),(2,b_c),(3,c_c)])
    final.sort(key=lambda x: x[1], reverse=True)

    if final[0][1] > final[1][1]:
        return [final[0][0]]
    elif final[0][1] == final[1][1]:
        return [final[0][0],final[1][0]]
    elif final[0][1] == final[1][1] and final[1][1] == final[2][1]:
        return [final[0][0],final[1][0],final[2][0]]


결과



채점 결과
정확성: 100.0
합계: 100.0 / 100.0



Detail Code Review



  • a,b,c의 문제 패턴이 존재한다. 제한사항에서 문제의 길이가 10,000이라고 한다. 이때 완전탐색을 사용할 방법이 무엇이 있을까? 나는 패턴을 문제의 길이와 같게 해준 다음 문제의 길이만큼 포문으로 탐색을 하려고 했다. 다른 방법으로는 a,b,c 패턴들을 각 각 한 번에 도는 방법이다. 그 동안 count를 해주면 된다.

  • 문제를 돌면서 문제의 답과 세 명의 답들을 비교하고 같으면 count를 +=1 늘려준다

  • 문제의 길이만큼 for문을 돌고 나면 각 사람의 정답 수가 구해진다. 그럼 list에 (순서, 카운트) 순으로 담는다.

  • 카운트 순으로 정렬을 하는데 많이 맞춘 사람 순 (x[1], reverse=True) 으로 정렬한다.

  • 만약 첫 번째 사람이 두 번째 사람보다 많이 맞추면 그 사람의 순서를 return한다.

  • 만약 두 번째 사람과 첫 번째 사람의 정답수가 같으면 그 두 사람을 return한다.

  • 만약 세 번째 사람까지 정답수가 같으면 3명을 순서대로 return한다.





혹시 문제가 있는 부분이 있으시면 말씀해주세요. 더 좋은 아이디어도 알려주시면 감사하겠습니다.😉




댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함