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

kimminjunnn·2025년 8월 26일

알고리즘

목록 보기
161/319

난이도 : level 1
유형 : 완전 탐색
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42840


문제 파악

answer에 문제의 답 배열을 입력받고,
1,2,3 번 사람들 중 누가 제일 많이 맞혔는지 return하는 문제이다.

각 사람의 답의 규칙은 다음과 같다.

1번

1,2,3,4,5,1,2,3,4,5... 식으로 1번부터 5번까지 차례로 반복하여 답을 찍는다.
5자리씩 반복하며 답을 찍는다.

2번

2,1,2,3,2,4,2,5/2,1,2,3,2,4,2,5
8자리씩 반복하며 답을 찍는다.

3번

3,3,1,1,2,2,4,4,5,5
10자리씩 반복하며 답을 찍는다.

우선 answer의 length만큼 1번, 2번, 3번 사람의 규칙의 의한 답 배열을 생성하고
answer와 몇개 일치하는지 count하여 가장 큰 count값을 가진 사람들의 배열을 return해주면 될 것 같다.

  1. answer.length 만큼의 각 사람들의 배열 만들기
  2. answer와 a,b,c 사람들의 배열을 비교하여 a_count, b_count, c_count 에 저장하기
  3. 가장 큰 x_count 구하기 ( 이때 중복이라면 둘다 배열에 넣기 )

해답 및 풀이

def solution(answers):
    n = len(answers)

    # 1번 수포자 배열 생성
    def make_a(n):
        result = []
        for i in range(n):
            result.append((i % 5) + 1)  # 1,2,3,4,5 반복
        return result
    
    # 2번 수포자 배열 생성
    def make_b(n):
        pattern = [2,1,2,3,2,4,2,5]
        result = []
        for i in range(n):
            result.append(pattern[i % len(pattern)])
        return result
    
    # 3번 수포자 배열 생성
    def make_c(n):
        pattern = [3,3,1,1,2,2,4,4,5,5]
        result = []
        for i in range(n):
            result.append(pattern[i % len(pattern)])
        return result
    
    # 각 사람들의 답안 시퀀스
    a = make_a(n)
    b = make_b(n)
    c = make_c(n)
    
    # 정답과 비교해서 맞춘 개수 세기
    a_count = 0
    for i in range(n):
        if answers[i] == a[i]:
            a_count += 1

    b_count = 0
    for i in range(n):
        if answers[i] == b[i]:
            b_count += 1

    c_count = 0
    for i in range(n):
        if answers[i] == c[i]:
            c_count += 1
    
    # 최고 점수 찾기
    max_count = max(a_count, b_count, c_count)
    
    # 최고 점수를 받은 사람(들) 담기
    answer = []
    if a_count == max_count:
        answer.append(1)
    if b_count == max_count:
        answer.append(2)
    if c_count == max_count:
        answer.append(3)
    
    return answer

간단한 문제였지만 코드가 왠지 지저분한 것 같아 지피티에게 고급스러운 버젼을 구현해달라고 했다.

지피티의 코드

def solution(answers):
    # 각 수포자의 반복 패턴
    p1 = [1, 2, 3, 4, 5]
    p2 = [2, 1, 2, 3, 2, 4, 2, 5]
    p3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    def score(pattern, answers):
        m = len(pattern)
        cnt = 0
        for i, a in enumerate(answers):
            if a == pattern[i % m]:
                cnt += 1
        return cnt

    s1 = score(p1, answers)
    s2 = score(p2, answers)
    s3 = score(p3, answers)

    top = max(s1, s2, s3) if answers else 0

    result = []
    if s1 == top: result.append(1)
    if s2 == top: result.append(2)
    if s3 == top: result.append(3)
    return result

지피티는 pattern을 각 배열을 따로 빼고, answers의 길이의 따른 답안을 생성하는 함수를 각각 만드는 것이 아닌 합쳐서 만들어서 더 깔끔한 코드를 구현했다.

enumerate() 도 활용하였고
max값 구할때는 리스트 컴프리헨션을 사용하여 아주 보기 좋은 코드를 구현했다.

profile
Frontend Engineers

0개의 댓글