Lv1. 모의고사 ( Python )
# 문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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] |
문제 해결 시 고려사항
- 각 수포자 별로 답을 찍는 패턴이 존재한다
문제에서, 각 수포자가 문제를 찍는 방식이 정해져 있음을 알 수 있다. 각 수포자 별 답을 고르는 패턴은 아래와 같다.
# 수포자 별 답안 선택 패턴 p1 = [1,2,3,4,5] p2 = [2,1,2,3,2,4,2,5] p3 = [3,3,1,1,2,2,4,4,5,5]
위에서 발견한 답안 선택 패턴을 이용하여 주어지는 answers 배열의 길이만큼 수포자 별로 배열을 생성해준다.
# 1번 수포자가 선택한 답안 리스트 ps1 = [] for i in range(len(answers)): ps1.append(p1[i%5]) # 2번 수포자가 선택한 답안 리스트 ps2 = [] for i in range(len(answers)): if i % 8 == 0 or i % 8 == 4 or i % 8 == 6: ps2.append(2) elif i % 8 == 1 or i % 8 == 2 or i % 8 == 3: ps2.append(i % 8) elif i % 8 == 5: ps2.append(4) else: ps2.append(5) # 3번 수포자가 선택한 답안 리스트 ps3 = [] for i in range(len(answers)): if i % 10 == 0 or i % 10 == 1: ps3.append(3) elif i % 10 == 2 or i % 10 == 3: ps3.append(1) elif i % 10 == 4 or i % 10 == 5: ps3.append(2) elif i % 10 == 6 or i % 10 == 7: ps3.append(4) else: ps3.append(5)
위와 같은 작업 이후에는 각 선택지에 대한 점수를 매긴 후 최대 점수를 받은 수포자의 번호를 answer 배열에 삽입한다. 단, 동일 최대점수를 가진 수포자가 존재한다면 수포자 번호에 대한 오름차순 정렬을 실시한 후 answer를 반환한다.# 수포자 별 채점 결과 cnts 배열 내에 저장 cnt1 = 0; cnt2 = 0; cnt3 = 0 cnts = [] for i in range(len(answers)): if answers[i] == ps1[i]: cnt1+=1 if answers[i] == ps2[i]: cnt2+=1 if answers[i] == ps3[i]: cnt3+=1 cnts.append(cnt1) cnts.append(cnt2) cnts.append(cnt3) # 최대 점수 보유자의 번호를 answer에 삽입 후 오름차순 정렬 maxVal = max(cnts) for idx in range(len(cnts)): if cnts[idx] == maxVal: answer.append(idx+1) answer.sort()
전체 코드
def solution(answers):
answer = []
# 수포자 별 답안 선택 패턴
p1 = [1,2,3,4,5]
p2 = [2,1,2,3,2,4,2,5]
p3 = [3,3,1,1,2,2,4,4,5,5]
# 1번 수포자가 선택한 답안 리스트
ps1 = []
for i in range(len(answers)):
ps1.append(p1[i%5])
# 2번 수포자가 선택한 답안 리스트
ps2 = []
for i in range(len(answers)):
if i % 8 == 0 or i % 8 == 4 or i % 8 == 6:
ps2.append(2)
elif i % 8 == 1 or i % 8 == 2 or i % 8 == 3:
ps2.append(i % 8)
elif i % 8 == 5:
ps2.append(4)
else:
ps2.append(5)
# 3번 수포자가 선택한 답안 리스트
ps3 = []
for i in range(len(answers)):
if i % 10 == 0 or i % 10 == 1:
ps3.append(3)
elif i % 10 == 2 or i % 10 == 3:
ps3.append(1)
elif i % 10 == 4 or i % 10 == 5:
ps3.append(2)
elif i % 10 == 6 or i % 10 == 7:
ps3.append(4)
else:
ps3.append(5)
# 수포자 별 채점 결과 cnts 배열 내에 저장
cnt1 = 0; cnt2 = 0; cnt3 = 0
cnts = []
for i in range(len(answers)):
if answers[i] == ps1[i]:
cnt1+=1
if answers[i] == ps2[i]:
cnt2+=1
if answers[i] == ps3[i]:
cnt3+=1
cnts.append(cnt1)
cnts.append(cnt2)
cnts.append(cnt3)
# 최대 점수 보유자의 번호를 answer에 삽입 후 오름차순 정렬
maxVal = max(cnts)
for idx in range(len(cnts)):
if cnts[idx] == maxVal:
answer.append(idx+1)
answer.sort()
return answer