https://school.programmers.co.kr/learn/courses/30/lessons/42840#
문제의 개수에 따라 수포자의 답안을 만들어준다.
수포자의 답안 패턴 개수보다 문제의 개수가 많을 경우, 나누기와 나머지를 통해 답안 작성 ..
그 후 루프를 통해 정답이 맞았는지 확인하면서 점수 매긴다.
그 다음은 가장 높은 점수를 얻은 학생들을 리스트에 넣어서 반환한다.
# 답안 작성
def sub_answers(answers, s):
if len(answers) > len(s):
div = len(answers) // len(s)
res = len(answers) % len(s)
sub_s = s[:]
for i in range(div-1):
s += s
s += sub_s[:res]
return s
# 채점
def grade(answers, s):
score = 0
for idx, answer in enumerate(answers):
if answer == s[idx]:
score += 1
return score
def solution(answers):
s1 = [1,2,3,4,5]
s2 = [2,1,2,3,2,4,2,5]
s3 = [3,3,1,1,2,2,4,4,5,5]
# 1번 수포자 답안
if len(answers) > len(s1):
s1 = sub_answers(answers,s1)
print(s1)
else:
s1 = s1[:len(answers)]
# 2번 수포자 답안
if len(answers) > len(s2):
s2 = sub_answers(answers,s2)
else:
s2 = s2[:len(answers)]
# 3번 수포자 답안
if len(answers) > len(s3):
s3 = sub_answers(answers,s3)
else:
s3 = s3[:len(answers)]
# 채점 결과
s1_grade = grade(answers,s1)
s2_grade = grade(answers,s2)
s3_grade = grade(answers,s3)
answer = []
max_grade = max(s1_grade, s2_grade, s3_grade)
# 높은 점수 받은 사람이 여럿일 경우 고려
if max_grade == s1_grade:
answer.append(1)
if max_grade == s2_grade:
answer.append(2)
if max_grade == s3_grade:
answer.append(3)
return answer
패기롭게 냈지만..
시간초과로 틀리게 되었다. 아슬아슬하긴 했는데.. 진짜 이렇게 되네
어디서부터 시간 초과가 되었을까.. max함수를 없애보았는데 그건 문제가 안되는듯
아무래도 sub_answers 함수에서 시간초과가 되는건가?
한번 오류가 나더라도 sub_answers를 없애고 돌려보았다.
이번에는 시간초과가 뜨지않았다. 결국 답안 작성에서 시간초과가 되었다는건데... for문을 돌려서 답안 작성하지않고 그냥 바로 곱하기로 때려박았다.
# 답안 작성
def sub_answers(answers, s):
div = len(answers) // len(s)
res = len(answers) % len(s)
sub_s = s[:]
s = s*(div)
s += sub_s[:res]
return s
# 채점
def grade(answers, s):
score = 0
for idx, answer in enumerate(answers):
if answer == s[idx]:
score += 1
return score
def solution(answers):
s1 = [1,2,3,4,5]
s2 = [2,1,2,3,2,4,2,5]
s3 = [3,3,1,1,2,2,4,4,5,5]
# 1번 수포자 답안
if len(answers) > len(s1):
s1 = sub_answers(answers,s1)
else:
s1 = s1[:len(answers)]
# 2번 수포자 답안
if len(answers) > len(s2):
s2 = sub_answers(answers,s2)
else:
s2 = s2[:len(answers)]
# 3번 수포자 답안
if len(answers) > len(s3):
s3 = sub_answers(answers,s3)
else:
s3 = s3[:len(answers)]
# 채점 결과
s1_grade = grade(answers,s1)
s2_grade = grade(answers,s2)
s3_grade = grade(answers,s3)
answer = []
max_grade = max(s1_grade, s2_grade, s3_grade)
# 높은 점수 받은 사람이 여럿일 경우 고려
if max_grade == s1_grade:
answer.append(1)
if max_grade == s2_grade:
answer.append(2)
if max_grade == s3_grade:
answer.append(3)
return answer
(+) 더 효율적인 방식이 있을까? 하고 찾아봤는데
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
이런식으로 풀 수도 있었다. 굳이 답안을 만들지않고 그냥 %연산을 통해서만 하면 제일 깔끔했다... ^_^ 넘 슬프고..