https://programmers.co.kr/learn/courses/30/lessons/42840
완전탐색의 기본 문제입니다.
문제 풀이
1. 각 수포자의 찍기 패턴을 list로 담아줍니다 (길이 각 5, 8, 10)
그리고 각각의 정답 횟수를 정의해줍니다 (기본 0).
first = [1, 2, 3, 4, 5] #5
second = [2, 1, 2, 3, 2, 4, 2, 5] #8
third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] #10
first_cnt, second_cnt, third_cnt = 0, 0, 0
2. 입력된 정답의 길이만큼 for loop
=> 정답을 맞은 사람이면 위에서 정의한 정답 횟수에 1을 더해줍니다.
=> i%5, i%8, i%10 을 사용하여 각 list별 순환이 되도록 해줍니다 (첫번째 수포자의 경우 1, 2, 3, 4, 5, 1, 2, 3, ... 과 같이).
이후 전체 정답 횟수를 한 개의 list에 담습니다.
for i in range(len(answers)):
if answers[i] == first[i%5]:
first_cnt += 1
if answers[i] == second[i%8]:
second_cnt += 1
if answers[i] == third[i%10]:
third_cnt += 1
all_cnt = [first_cnt, second_cnt, third_cnt]
3. enumerate를 사용하여 index와 전체 정답 횟수를 for loop
=> 전체 정답 횟수의 최대값과 같으면, 해당 index에서 1을 더한 값을 answer list에 넣어주고 (몇 번째 학생이 가장 많이 맞췄는지 기록), 최종적으로 answer list를 반환해줍니다.
answer = []
for idx, cnt in enumerate(all_cnt):
if cnt == max(all_cnt):
answer.append(idx+1)
전체 코드
def solution(answers):
first = [1, 2, 3, 4, 5] #5
second = [2, 1, 2, 3, 2, 4, 2, 5] #8
third = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] #10
first_cnt, second_cnt, third_cnt = 0, 0, 0
for i in range(len(answers)):
if answers[i] == first[i%5]:
first_cnt += 1
if answers[i] == second[i%8]:
second_cnt += 1
if answers[i] == third[i%10]:
third_cnt += 1
tmp = [first_cnt, second_cnt, third_cnt]
answer = []
for idx, cnt in enumerate(tmp):
if cnt == max(tmp):
answer.append(idx+1)
return answer
'Algorithm' 카테고리의 다른 글
[파이썬] 백준 1927번, 11279번, 11286번: 최소 힙, 최대 힙, 절대값 힙 (0) | 2021.07.06 |
---|---|
[파이썬] 백준 1676번: 팩토리얼 0의 개수 (0) | 2021.07.05 |
[파이썬] 백준 1931번: 회의실 배정 (0) | 2021.07.02 |
[파이썬] 백준 11399번: ATM (0) | 2021.07.01 |
[파이썬] 백준 11047번: 동전 0 (0) | 2021.07.01 |