본문 바로가기
Study/Algorithm & Data structure

[프로그래머스] [완전탐색] 모의고사 (201103)

by 후이 (hui) 2020. 11. 5.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

 

 

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

제한 조건

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

입출력 예

answersreturn

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

입출력 예 설명

입출력 예 #1

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

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

입출력 예 #2

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

 

 

2. 풀이 

 

1) 내 풀2

import math

def solution(answers):

    q_cnt = len(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]

    if q_cnt > 5:
        stu1 = stu1 * math.ceil(q_cnt / 5)

    if q_cnt > 8:
        stu2 = stu2 * math.ceil(q_cnt / 8)

    if q_cnt > 10:
        stu3 = stu3 * math.ceil(q_cnt / 10)

    cnt_list = [0,0,0]

    for ans, a1, a2, a3 in zip(answers, stu1, stu2, stu3):
        if ans == a1:
            cnt_list[0] += 1

        if ans == a2:
            cnt_list[1] += 1

        if ans == a3:
            cnt_list[2] += 1

    result = []
    max_val = max(cnt_list)
    result = [ idx+1 for idx, num in enumerate(cnt_list) if num == max_val]

    return result

 

 

우선 문제 수가 각 학생들의 답안 길이보다 길경우에는 

학생들의 답안을 늘려주는 식으로 접근을 했다 

 

가령 10문제 일때 

stu2 는 8번까지 답안만 있으니까, 2번 반복되도록 

10/8 = 1.xx -> 올림해서 2 로 만들어줌 

 

 

 

2) 더 나은 풀이 (인덱스) 

 

def solution(answers):

    q_cnt = len(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]

    cnt_list = [0,0,0]
    for idx, ans in enumerate(answers):
        if ans == stu1[idx % len(stu1)]:
            cnt_list[0] += 1

        if ans == stu2[idx % len(stu2)]:
            cnt_list[1] += 1

        if ans == stu3[idx % len(stu3)]:
            cnt_list[2] += 1

    max_val = max(cnt_list)
    result = [idx+1 for idx, num in enumerate(cnt_list) if num == max_val]

    return result

 

이게 더 나은 풀이라는 생각이 든다. 

 

만약 전체 길이가 학생들의 인덱스를 초과하는 경우 그 인덱스에서 학생 전체길이를 나눈 나머지로 

위의 예와 같이 10문제고 9번째 루프차례일때 

stu2의 리스트 길이는 다했지만 

idx%len(pattern1) ==> 9%8 이므로 9번째 인덱스가 아니라 다시 1로 들어가지게 된다 굿굿

 

 

 

 

 

3. 풀이

리스트 길이 안맞을 때 인덱스 나누기 연산 써보자 

이 방법 분명 다른 곳에서도 써먹을 수 있을듯. 

728x90
반응형

댓글