본문 바로가기

알고리즘 삽질장

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

반응형


문제설명

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

 

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

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

programmers.co.kr

사고과정

  • 완전탐색 문제라고 해서 DFS를 수행해야 하나 싶었지만 DFS를 활용하지 않아도 되었다. 그냥 주어진 찍는 방식 3가지 패턴을 주어진 문제 개수만큼 늘린 후 정답이 일치하는지 선형적으로 탐색하면서 맞은 정답 개수를 세면 되었다.
  • % 나누기 연산 기호를 적절히 활용해서 구현할 수 있을 듯 해서 활용했다.
  • 문제를 풀은 후, 다른 사람 풀이를 하나 보았는데 인상적인 풀이가 있어서 같이 적어두려고 한다. 동일하게 %연산 기호를 사용했는데 그 분은 나보다 좀 더 실용적이고 간결하게 %기호를 적절히 잘 사용하셨다.

풀이

- 다른 사람의 풀이(권장!)

def solution(answers):
    pattern1 = [1,2,3,4,5]
    pattern2 = [2,1,2,3,2,4,2,5]
    pattern3 = [3,3,1,1,2,2,4,4,5,5]
    score = [0, 0, 0]
    result = []

    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

    for idx, s in enumerate(score):
        if s == max(score):
            result.append(idx+1)

    return result

- 나의 풀이

def solution(answers):
    first = [1,2,3,4,5]
    second = [2,1,2,3,2,4,2,5]
    third = [3,3,1,1,2,2,4,4,5,5]
    
    def create_answer(rule):
        if len(rule) > len(answers):
            rule = rule[:len(answers)]
        elif len(answers) // len(rule) == 0:
            rule *= len(answers) // len(rule)
        else:
            rule *= len(answers) // len(rule)
            rule += rule[:len(answers) % len(rule)]
        return rule
    
    first = create_answer(first)
    second = create_answer(second)
    third = create_answer(third)
    
    score = [0] * 3
    max_score = -1
    for idx, result in enumerate([first, second, third]):
        cnt = 0
        for i in range(len(answers)):
            if answers[i] == result[i]:
                cnt += 1
        score[idx] = cnt
        max_score = max(max_score, cnt)
    
    final_res = []
    for i in range(3):
        if score[i] == max_score:
            final_res.append(i+1)
    return final_res
반응형