본문 바로가기

코딩

프로그래머스 - 코딩테스트 고득점 Kit - 완전탐색 - 모의고사 (python)

728x90

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

문제는 위 링크를 확인하시면 됩니다~~

 

문제를 다 이해하셨다는 전제하에 문제를 해결한 아래 코드를 설명하도록 하겠습니다.

 

생각한 알고리즘

 

1. n번 수포자가 찍는 방식에 대한 리스트를 각각 만듭니다.

-만든 이유: 찍는 방식을 보면 규칙성이 있어서 규칙성이 있는 단위만 저장했고, 굳이 더 길게 저장을 할 필요가 없기 때문입니다.

예) 1,2,3,4,5,1,2,3,4,5,1,2,3,4,5, .....  => [1,2,3,4,5]로만 저장

 

2. 1,2,3번 수포자에 대한 조건을 만든 후, 이 조건을 충족하는지 봅니다.

예) 첫번째 수포자가 i번째로 찍은 수와 answers의 경우 i번째값이 동일하다면 맞춘 것이므로 문제를 맞췄다고 볼 수 있다.

- %를 이용한 이유: 첫번째 수포자가 i번째로 찍은 수 == (i/5의 나머지)번째로 찍은 수

 

3. 세 사람 중 가장 많이 맞춘 사람 찾기(완전탐색)

만약 i번째 사람이 가장 많이 맞췄다면 i+1, ... 3번째 사람 중에서 본인과 동일한 문제를 맞춘 사람을 찾기 위해 아래와 같이 코드를 작성하였다.

- index()는 리스트에 동일한 원소를 갖는 값이 여러개가 있더라도 그 중에서 가장 낮은 인덱스를 출력함

따라서 i 뒤에 있는 사람 중 최대값(문제 정답 개수)을 갖는 사람을 찾기 위해 for문을 이용하였다.

예) 문제대입: 문제를 맞춘 개수가 같은 사람이 여러명이더라도 가장 낮은 인덱스를 출력함

- i+1한 이유: 0번째 인덱스에 저장된 값이 1번째 사람이 맞춘 개수여서 0+1을 하여 1을 answer에 저장해야한다.

 

def solution(answers):
    #1. n번째 수포자가 찍는 방식 
    one=[1,2,3,4,5]
    two=[2,1,2,3,2,4,2,5]
    thr=[3,3,1,1,2,2,4,4,5,5] 
    
    #2. 1, 2, 3번째 수포자들이 문제를 얼마나 맞추는지 확인
    
    data=[0,0,0] #인덱스 i-1에 i번째 수포자가 푼 문제 개수를 저장
    for i in range(len(answers)):
        if one[i%5]==answers[i]: #5개 단위
            data[0]+=1
        if two[i%8]==answers[i]: #8개 단위
            data[1]+=1
        if thr[i%10]==answers[i]: #10개 단위
            data[2]+=1
    
    answer = []
    #3. 세 사람 중 가장 많이 맞춘 사람 찾기
    check=data.index(max(data))
    answer.append(check+1)
    for i in range(check+1,3,1):
        if data[check]==data[i]:
            answer.append(i+1)
    return answer