출처 : programmers.co.kr/learn/courses/30/lessons/42840
풀이 방법
완전 탐색문제로 1번, 2번, 3번 학생들은 자신의 규칙에 따라 반복해서 찍는다.
ex) 1번은 1, 2, 3, 4, 5 반복
그러므로 답(answers)을 하나씩 돌아가며 answers의 인덱스에 각 학생의 반복하는 답의 개수를 나눈 나머지를 각각의 학생들의 답 배열에 넣어주어 나온 값과 answers를 비교하여 일치하면 score을 +1 씩 해주어서 점수를 채점한다
나중에 학생들의 점수를 sort할때 학생의 번호가 필요하므로 학생들의 점수는 score = [학생 번호, 점수] 형태로 선언을 해준다
// 학생들의 [학생 번호, 점수]
score =[[1, 0], [2, 0], [3, 0]]
// 학생 1, 2, 3 의 답 반복 패턴
sol1 = [1, 2, 3, 4 ,5]
sol2 = [2, 1, 2, 3, 2, 4, 2, 5]
sol3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
def solution(answers):
answer = []
for i in range(len(answers)):
// 각 학생의 인덱스
index1 = i % 5
index2 = i % 8
index3 = i % 10
if sol1[index1] == answers[i]:
score[0][1] += 1
if sol2[index2] == answers[i]:
score[1][1] += 1
if sol3[index3] == answers[i]:
score[2][1] += 1
// 학생 점수를 내림차순으로 lambda함수를 사용하여 정렬
score.sort(key = lambda x : x[1], reverse =True)
// 점수 동점자가 발생했을 때 처리
if score[0][1] == score[1][1]:
answer.append(score[0][0])
answer.append(score[1][0])
if score[0][1] == score[2][1]:
answer.append(score[2][0])
else:
answer.append(score[0][0])
return answer
더 좋은 풀이
다른 분들의 코드를 보니 점수를 sort대신 enumerate함수를 사용하여 최고점의 학생을 선택하는 것을 볼 수 있다.
enumerate 함수는 각 배열에서 인덱스와 배열값을 가져오는 함수이다
예시코드)
for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)
'Algorithm' 카테고리의 다른 글
[프로그래머스] 키패드 누르기 (Python) (0) | 2021.02.15 |
---|---|
[프로그래머스] 3진법 뒤집기 (Python) (0) | 2021.02.14 |
[algospot] 너드인가, 너드가 아닌가? (c++) (0) | 2021.02.14 |
[프로그래머스] 체육복 (c++) (0) | 2021.02.10 |
[프로그래머스] 완주하지 못한 선수 (c++) (0) | 2021.02.07 |