Programmers) 모의고사
문제
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5,
...
3번 수포자가 찍는 방식: 3, 3, 1, 1,
2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한 조건
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
입출력 예
| answers | return |
|---|---|
| [1,2,3,4,5] | [1] |
| [1,3,2,4,2] | [1,2,3] |
입출력 예 설명
입출력 예 #1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
- 모든 사람이 2문제씩을 맞췄습니다.
설명
입력된 리스트와 기존에 셋팅된 리스트 3개를 비교해,
일치하는 값이 많은 리스트의 번호를 출력하는 문제입니다.
기존의 리스트는 각각 5개 / 8개 / 10개의 숫자 패턴이 계속 반복되는 구조를
지녔는데요,
문제의 제한 조건을 보면
시험의 문제 갯수가 최대 10,000개이며
이는 5, 8, 10 전부 정수로 나눠 떨어지기 때문에
제한 조건에 맞게 기존 리스트를 확장시키는 데 별 무리가 없었을 것이라
생각합니다.
제가 발견한 규칙부터 바로 설명드리겠습니다.
1) 입력되는 문제는 1개에서 최대 10,000개까지 존재할 수 있기 때문에
문제 풀이 패턴을 기본적으로 10,000개까지 셋팅한다.
2) 기본 룰은 최대값 탐색 메커니즘을 활용하되, 최대값(맞은 개수)이 동일할 경우
최대값 번호 리스트에 번호를 추가한다. (새롭게 최대값이 갱신되면 최대값 번호
리스트를 값이 하나 들어가도록 초기화)
이게 끝입니다.
난이도가 낮은 문제라 어렵지 않게 풀 수 있었습니다.
def solution(answers): supo_list = { 1 : [1,2,3,4,5]*int(10000/5), 2 : [2,1,2,3,2,4,2,5]*int(10000/8), 3 : [3,3,1,1,2,2,4,4,5,5]*int(10000/10), } max_correct = -999 max_correct_people = [] for key in supo_list: supoja = supo_list[key][:len(answers)].copy() correct = len([1 for idx,val in enumerate(answers) if supoja[idx]==val]) if max_correct < correct: max_correct_people = [key] max_correct = correct elif max_correct == correct: max_correct_people.append(key) return max_correct_people
코드 리뷰를 하자면 다음과 같습니다.
1) 문제 설명에 나온 패턴대로 최대 10,000개 문제가 들어가도록 리스트를
확장시킵니다.
2) 최대 맞춘 개수를 넣을 변수와 해당 수포자의 번호를 입력할 리스트를
생성해둡니다.
3) 반복문을 돌리면서 수포자의 문제 풀이 패턴을 하나하나 가져옵니다.
가져올 때 주어진 문제 길이만큼 패턴을 슬라이싱 합니다.
4) 패턴과 입력 값을 비교하여 맞으면 1을 입력하는 리스트를 구축하고,
해당 리스트 크기를 세어 맞은 개수를 파악합니다.
5) 최대값 메커니즘을 사용하되 맞은 개수가 동일할 경우
많이 맞은 수포자 리스트에 번호를 append 합니다.
만약 최대값이 갱신 될 경우 해당 리스트는 초기화하고
새로이 들어온 번호만 들어있는 리스트로 저장합니다.
요새 바빠서 쉬운 문제만 다루고 있는데,
나중에 시간 내어 난이도 있고 도움이 되는 알고리즘 문제들을 다뤄보겠습니다.
더 참신한 방법이 있으면 다시 돌아오겠습니다~
댓글
댓글 쓰기