완전 탐색 - 모의고사

krystal·2023년 10월 4일
0

코딩테스트 대비

목록 보기
6/11

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

문제의 개수에 따라 수포자의 답안을 만들어준다.
수포자의 답안 패턴 개수보다 문제의 개수가 많을 경우, 나누기와 나머지를 통해 답안 작성 ..

그 후 루프를 통해 정답이 맞았는지 확인하면서 점수 매긴다.
그 다음은 가장 높은 점수를 얻은 학생들을 리스트에 넣어서 반환한다.

# 답안 작성
def sub_answers(answers, s):
    if len(answers) > len(s):
        div = len(answers) // len(s)
        res = len(answers) % len(s)
        sub_s = s[:]
        for i in range(div-1):
            s += s
        s += sub_s[:res]
    return s

# 채점
def grade(answers, s):
    score = 0
    for idx, answer in enumerate(answers):
        if answer == s[idx]:
            score += 1
    return score

def solution(answers):
    
    s1 = [1,2,3,4,5]
    s2 = [2,1,2,3,2,4,2,5]
    s3 = [3,3,1,1,2,2,4,4,5,5]
    
    # 1번 수포자 답안
    if len(answers) > len(s1):
        s1 = sub_answers(answers,s1)
        print(s1)
    else:
        s1 = s1[:len(answers)]
    
    # 2번 수포자 답안
    if len(answers) > len(s2):
        s2 = sub_answers(answers,s2)
    else:
        s2 = s2[:len(answers)]
        
    # 3번 수포자 답안
    if len(answers) > len(s3):
        s3 = sub_answers(answers,s3)
    else:
        s3 = s3[:len(answers)]

    # 채점 결과
    s1_grade = grade(answers,s1)
    s2_grade = grade(answers,s2)
    s3_grade = grade(answers,s3)
    
    
    answer = []
    max_grade = max(s1_grade, s2_grade, s3_grade)
    # 높은 점수 받은 사람이 여럿일 경우 고려
    if max_grade == s1_grade:
        answer.append(1)
    if max_grade == s2_grade:
        answer.append(2)
    if max_grade == s3_grade:
        answer.append(3)
    
    return answer

패기롭게 냈지만..


시간초과로 틀리게 되었다. 아슬아슬하긴 했는데.. 진짜 이렇게 되네
어디서부터 시간 초과가 되었을까.. max함수를 없애보았는데 그건 문제가 안되는듯

아무래도 sub_answers 함수에서 시간초과가 되는건가?
한번 오류가 나더라도 sub_answers를 없애고 돌려보았다.

이번에는 시간초과가 뜨지않았다. 결국 답안 작성에서 시간초과가 되었다는건데... for문을 돌려서 답안 작성하지않고 그냥 바로 곱하기로 때려박았다.

# 답안 작성
def sub_answers(answers, s):
    div = len(answers) // len(s)
    res = len(answers) % len(s)
    sub_s = s[:]
    s = s*(div)
    s += sub_s[:res]
    return s

# 채점
def grade(answers, s):
    score = 0
    for idx, answer in enumerate(answers):
        if answer == s[idx]:
            score += 1
    return score

def solution(answers):
    
    s1 = [1,2,3,4,5]
    s2 = [2,1,2,3,2,4,2,5]
    s3 = [3,3,1,1,2,2,4,4,5,5]
    
    # 1번 수포자 답안
    if len(answers) > len(s1):
        s1 = sub_answers(answers,s1)
    else:
        s1 = s1[:len(answers)]
    
    # 2번 수포자 답안
    if len(answers) > len(s2):
        s2 = sub_answers(answers,s2)
    else:
        s2 = s2[:len(answers)]
        
    # 3번 수포자 답안
    if len(answers) > len(s3):
        s3 = sub_answers(answers,s3)
    else:
        s3 = s3[:len(answers)]

    # 채점 결과
    s1_grade = grade(answers,s1)
    s2_grade = grade(answers,s2)
    s3_grade = grade(answers,s3)
    
    
    answer = []
    max_grade = max(s1_grade, s2_grade, s3_grade)
    # 높은 점수 받은 사람이 여럿일 경우 고려
    if max_grade == s1_grade:
        answer.append(1)
    if max_grade == s2_grade:
        answer.append(2)
    if max_grade == s3_grade:
        answer.append(3)
    
    return answer

(+) 더 효율적인 방식이 있을까? 하고 찾아봤는데

   for idx, answer in enumerate(answers):
        if answer == pattern1[idx%len(pattern1)]:
            score[0] += 1
        if answer == pattern2[idx%len(pattern2)]:
            score[1] += 1
        if answer == pattern3[idx%len(pattern3)]:
            score[2] += 1

이런식으로 풀 수도 있었다. 굳이 답안을 만들지않고 그냥 %연산을 통해서만 하면 제일 깔끔했다... ^_^ 넘 슬프고..

profile
https://source-coding.tistory.com/

0개의 댓글