Algorithm

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

salmon16 2021. 2. 11. 18:29

출처 : programmers.co.kr/learn/courses/30/lessons/42840

 

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

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

programmers.co.kr

 

풀이 방법

완전 탐색문제로 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)