https://programmers.co.kr/learn/courses/30/lessons/42840
프로그래머스에서 "모의고사" 문제를 풀었다.
이는 완전탐색 문제인데, 완전탐색이란 컴퓨터의 빠른 계산 능력을 잘 이용하는 방법으로 가능한 경우의 수를 하나하나 나열하며 답을 찾는 방법을 의미한다.
문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.
학생들의 답과 정답을 어떻게 비교해야할지가 가장 막막했다.
학생 한명 한명 정답 하나하나 전부 비교하자니 효율성이 별로일 것 같고.. 결국 다른 사람들의 풀이를 참조하여 정답을 주기별로 끊어 나열한 후 값을 비교하는 방법을 알게 되었다.
def solution(answers):
answer = []
score = [0,0,0]
student1 = [1,2,3,4,5]
student2 = [2,1,2,3,2,4,2,5]
student3 = [3,3,1,1,2,2,4,4,5,5]
for i in range(len(answers)) :
if answers[i] == student1[i%5] :
score[0] += 1
if answers[i] == student2[i%8] :
score[1] += 1
if answers[i] == student3[i%10] :
score[2] += 1
for idx, num in enumerate(score) :
if num == max(score) :
answer.append(idx +1)
return answer
학생 3명의 답이 일정한 주기로 반복되기 때문에 한 주기만 리스트로 만들었다.
또 학생들의 점수를 기록할 score 리스트도 만들었다. 이때 각 인덱스별로 1점씩 오르게 하기 위해 빈 리스트가 아니라 학생 수 만큼의 원소로 채워서 리스트를 만들었다.
answers 길이만큼 for이 반복되도록 한 후 student1,2,3의 각 길이인 5, 8, 10으로 student1,2,3의 인덱스를 나눈 나머지 값을 구하는 방법을 사용했다.
student1[i%5]은 student1의 길이로 나눈 것의 나머지 값인데, 0-9까지가 반복되어 answers의 첫번째~마지막 인덱스를 반복할 수 있다.
answers[i] == student1[i%5]을 만족하여 student1가 정답을 맞출 때 마다 score의 첫번째 원소인 student1의 점수를 1씩 더해준다.
이는 student2,3도 동일하다.
마지막으로 가장 많이 정답을 찍은 학생이 한명이 아니라 두명 이상일 수도 있기에 enumerate 함수를 사용하여 점수에 해당하는 인덱스 즉, 학생을 구하도록 했다.
맞힌 개수가 최댓값을 가질 때 인덱스+1(인덱스가 0부터 시작하므로)을 리스트 answer에 추가하면 된다.
다른 사람들의 풀이를 찾아보기 전까지는 나머지를 구하는 연산자를 사 방법을 생각해 내지 못했고 이렇게 사용할 수도 있다는 것을 배우게 되었다. 기억해두면 유용하게 사용할 수 있을 것 같다.