프로그래머스 Lv1 문제입니다. 실전에 대비하기 위해 30분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42840
[나의 풀이]
⌛ 25분
from collections import Counter
from itertools import cycle
def solution(answers):
answer = []
len_answers = len(answers)
res = {str(i):0 for i in range(1,4)}
ans_1 = [1,2,3,4,5] # (5개)
ans_2 = [2,1,2,3,2,4,2,5] # (7개)
ans_3 = [3,3,1,1,2,2,4,4,5,5] # (10개)
cnt = 0
for ans1,ans2,ans3 in zip(cycle(ans_1),cycle(ans_2),cycle(ans_3)):
if cnt==len_answers:
break
if answers[cnt%len_answers]==ans1:
res['1'] += 1
if answers[cnt%len_answers]==ans2:
res['2'] += 1
if answers[cnt%len_answers]==ans3:
res['3'] += 1
cnt += 1
most_v = Counter(res).most_common()[0][1]
for k,v in Counter(res).most_common():
if v==most_v:
answer.append(int(k))
answer.sort()
return answer
완전탐색 문제입니다. 구현하는 것 자체는 어렵지 않았지만 최대한 간결히 표현하기 위해 노력해본 풀이입니다.🐤🐤🐤
1,2,3번 수포자별로 문제를 찍는 방식이 다르기 때문에 zip() 함수안에 cycle() 객체로 변환시켜 for문을 돌렸습니다. 이때, 문제 갯수만큼 실행하고 break하였습니다.
또한 정답을 가장 많이 맞춘 수포자를 고르기 위해 Counter 객체의 most_common()함수를 활용하였습니다.
[다른 사람의 풀이1]
def solution(answers):
pattern1 = [1,2,3,4,5]
pattern2 = [2,1,2,3,2,4,2,5]
pattern3 = [3,3,1,1,2,2,4,4,5,5]
score = [0, 0, 0]
result = []
for idx, answer in enumerate(answers):
if answer == pattern1[idx%len(pattern1)]:
score[0] += 1
if answer == pattern2[idx%len(pattern2)]:
score[1] += 1
if answer == pattern3[idx%len(pattern3)]:
score[2] += 1
for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)
return result
% 나머지함수와 인덱싱으로 모의고사 정답(answers)별 수포자들이 답을 체크한 풀이입니다.
[다른 사람의 풀이2]
def solution(answers):
p = [[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
s = [0] * len(p)
for q, a in enumerate(answers):
for i, v in enumerate(p):
if a == v[q % len(v)]:
s[i] += 1
return [i + 1 for i, v in enumerate(s) if v == max(s)]
모의고사 정답과 수포자들의 정답을 2중 for문으로 돌며 해결한 풀이입니다.🐆🐆🐆
감사합니다.