Programming/Coding Test

프로그래머스 코딩테스트 lv 1. 모의고사 문제 풀이

makeitworth 2021. 4. 28. 21:16

문제 : lv 1 <모의고사>

 

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

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

programmers.co.kr

 

입력 : 정답이 순서대로 들어있는 배열 answers

출력 : 가장 많은 정답을 맞힌 사람이 담긴 배열 answer

 

생각의 과정

세 사람은 아래의 배열이 계속 반복되는 방식으로 답을 입력한다.

 

first = [1,2,3,4,5]
second = [2,1,2,3,2,4,2,5]
third = [3,3,1,1,2,2,4,4,5,5]

 

생각할 지점이 2개 있었다.

 

1. 문제의 갯수가 세 사람의 입력 배열보다 훨씬 길어지면 어떻게 할 것인가?

 

  1.  응답자 리스트를 늘린다. -> 리스트 * n
  2.  정답 리스트의 인덱스를 줄인다. -> 탐색할 때의 인덱스를 ( i % len(리스트))로...

이중에서 2번을 선택해서 풀었다.

 

2. 가장 점수를 높게 받은 사람이 1명 이상일 수도 있다.

 

-> 그래서 그냥 max(맞은 점수 리스트)로는 해결할 수가 없다.

->  max(맞은 점수 리스트)으로 최고 점수를 파악한 다음, 최고 점수와 값이 같은 인덱스를 모두 뽑아야 한다.

 

제출 답안

def solution(answers):
    #속도 향상을 위해 딕셔너리로 만듦
    person = {0: [1,2,3,4,5]
         ,1: [2,1,2,3,2,4,2,5]
         ,2: [3,3,1,1,2,2,4,4,5,5]}
    #점수는 값으로 인덱스하기 쉽게 리스트로 만듦
    score = [0,0,0]

    # 사람별로
    for j in range(len(person)):
        #답지를 탐색
        for i in range(len(answers)):
            #문제 갯수가 개인별 답안 리스트보다 훨씬 크므로 전체문제수를 개인 리스트 길이로 나눈 나머지로 인덱스
            #정답과 제출 답안이 같으면
            if answers[i] == person[j][i%len(person[j])]:
                #점수 1점 올리기
                score[j] += 1
                
    #최고 점수인 사람이 1명 이상일 수도 있어서 최고점수를 뽑은 다음
    max_score = max(score)
    
    #최고 점수와 점수가 같은 사람의 인덱스를 리스트에 넣기
    return [x+1 for x in range(len(score)) if score[x] == max_score]

 

for 문이 여러개 들어가 마음에 들지 않지만, 

다행히 효율성 테스트가 없었고, 통과되었다.