Algorithm/Programmers

[완전탐색] 프로그래머스 Lv1. 모의고사 - Python

jyjyjy25 2024. 3. 19. 23:08

🗂️ 문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

💡 접근법

학생 수는 3명이고, 각각의 학생이 찍는 답은 일정한 주기로 반복하므로 한 주기에 대해서만 리스트를 생성한다.

이후 맞는 값의 개수를 저장하는 answer_cnt 딕셔너리를 선언한다.

 

answer 값을 순회하면서 학생이 찍은 답과 같으면 cnt를 1 증가시킨다.

 

이후 값에 대해 딕셔너리를 내림차순 정렬한다.

내림차순으로 정렬되었기 때문에 0번 인덱스에 해당하는 키가 가장 정답을 많이 맞춘 학생을 의미한다. 하지만 동점자가 존재할 수 있으므로 max 변수를 통해 이를 확인한다.

 

😎 내 코드

def solution(answers):
    answer = []
    
    per1 = [1, 2, 3, 4, 5]
    per2 = [2, 1, 2, 3, 2, 4, 2, 5]
    per3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    per1 *= len(answers) // len(per_1) + 1
    per2 *= len(answers) // len(per_2) + 1
    per3 *= len(answers) // len(per_3) + 1

    answer_cnt = {"1": 0, "2": 0, "3": 0}
    for i, a in enumerate(answers):
        if a == per1[i]:
            answer_cnt["1"] += 1
        if a == per2[i]:
            answer_cnt["2"] += 1
        if a == per3[i]:
            answer_cnt["3"] += 1
    
    answer_cnt = sorted(answer_cnt.items(), key=lambda x: x[1], reverse=True)
    
    max = 0
    for k, v in answer_cnt:
        if max <= v:
            max = v
            answer.append(int(k))
    
    return answer

 

👀 배운 코드

def solution(answers):
    answer = []
    
    per1 = [1, 2, 3, 4, 5]
    per2 = [2, 1, 2, 3, 2, 4, 2, 5]
    per3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    answer_cnt = {"1": 0, "2": 0, "3": 0}
    for i, a in enumerate(answers):
        if a == per1[i%5]:
            answer_cnt["1"] += 1
        if a == per2[i%8]:
            answer_cnt["2"] += 1
        if a == per3[i%10]:
            answer_cnt["3"] += 1
    
    answer_cnt = sorted(answer_cnt.items(), key=lambda x: x[1], reverse=True)
    
    max = 0
    for k, v in answer_cnt:
        if max <= v:
            max = v
            answer.append(int(k))
    
    return answer

 

🧐 배운 점

  1. 비교할 리스트를 새로 만들지 않고 나머지 연산을 통해 인덱스를 계산하여 해당 인덱스에 대한 값을 비교하는 방법
    ex) per1의 리스트의 길이는 5이므로 5로 나머지 연산을 수행한다. if a == per1[i%5]:
  2. 딕셔너리 값으로 정렬
    d = sorted(d.items(), key=lambda x: x[1])