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'코딩' 카테고리의 다른 글
| 프로그래머스 - 코딩테스트 고득점 Kit - 완전탐색 - 카펫 (python) (0) | 2023.02.01 |
|---|---|
| 프로그래머스 - 코딩테스트 고득점 Kit - 완전탐색 - 소수 찾기 (python) (0) | 2023.02.01 |
| 프로그래머스 - 코딩테스트 고득점 Kit - 완전탐색 - 최소직사각형 (python) (0) | 2023.01.31 |
| 프로그래머스 - 코딩테스트 고득점 Kit - 해시 - 베스트앨범 (python) (0) | 2023.01.23 |
| 프로그래머스 - 코딩테스트 고득점 Kit - 해시 - 위장 (python) (0) | 2023.01.23 |