📋 문제
✳️ 코드 작성
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]
# 정답 비교 및 점수 계산
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
# 최대 점수를 가진 사람 찾기
max_score = max(score)
result = [idx + 1 for idx, s in enumerate(score) if s == max_score]
return result
💟 함수 정의
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]
- pattern1, pattern2, pattern3는 각각 3명의 사람들이 문제를 푸는 방식, 즉 정답을 찍는 패턴을 나타냄
- 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 = []
- score 리스트는 각 사람의 점수를 저장할 변수
- 초기값은 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
- enumerate(answers)는 answers 리스트의 각 요소에 대해 인덱스(idx)와 값을 동시에 반환
- 예를 들어, answers = [1, 3, 2, 4, 2]라면, 첫 번째 반복에서 idx = 0이고 answer = 1이 됨
- idx % len(pattern1)는 현재 문제의 인덱스를 패턴의 길이로 나눈 나머지를 구하는데, 이를 통해 패턴이 반복되도록 만들어 줌
- 예를 들어, pattern1의 길이는 5이므로, idx = 0일 때 idx % len(pattern1)은 0 % 5 = 0이 되어 pattern1[0]과 비교
- idx = 5일 때는 5 % 5 = 0이므로 다시 pattern1[0]과 비교
- 각 사람의 패턴과 answers 리스트에서 해당 문제의 정답(answer)을 비교
- 만약 answer가 각 패턴의 값과 같다면 해당 사람의 점수를 1점 증가
- 예를 들어, answer가 pattern1[idx % len(pattern1)]과 같다면 score[0] += 1을 수행하여 첫 번째 사람의 점수를 올
🟣 예시
만약 answers = [1, 3, 2, 4, 2]이고 첫 번째 반복에서 idx = 0이고 answer = 1이라고 가정
- pattern1[0 % 5] = pattern1[0] = 1이므로 첫 번째 사람이 맞췄음. 따라서 score[0] += 1이 됨
- pattern2[0 % 8] = pattern2[0] = 2이므로 두 번째 사람은 틀림
- pattern3[0 % 10] = pattern3[0] = 3이므로 세 번째 사람도 틀림
이 과정을 answers의 모든 요소에 대해 반복하여 각 사람의 점수를 계산하게 됨
💟 최대 점수를 가진 사람 탐색
max_score = max(score)
result = [idx + 1 for idx, s in enumerate(score) if s == max_score]
- max(score)로 score 리스트에서 가장 높은 점수를 계산하여 max_score 변수에 저장
- 예를 들어, score = [3, 2, 3]이라면, max_score = 3
- 리스트 컴프리헨션을 사용하여 최대 점수를 얻은 사람을 찾음
- for idx, s in enumerate(score)는 score 리스트의 각 점수를 인덱스와 함께 순차적으로 반복
- if s == max_score는 현재 점수(s)가 max_score와 같을 때만 해당 사람의 인덱스를 result 리스트에 추가
- result.append(idx + 1) 대신 리스트 컴프리헨션 [idx + 1 for idx, s in enumerate(score) if s == max_score]을 사용하여 한 줄로 간결하게 표현
- idx + 1은 사람 번호를 맞추기 위해 사용
- score[0]에 첫 번째 사람의 점수가 저장되지만, 실제 사람 번호는 1번이므로 +1을 해줌
🟣 예시
만약 score = [3, 2, 3]이라면
- max_score = 3
- enumerate(score)는 다음과 같은 순서를 따름
- idx = 0, s = 3 → s == max_score이므로 첫 번째 사람이 결과에 포함
- idx = 1, s = 2 → s != max_score이므로 두 번째 사람은 포함되지 않음
- idx = 2, s = 3 → s == max_score이므로 세 번째 사람이 결과에 포함
따라서 result = [1, 3]이 됨
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Python] 덧칠하기 (0) | 2024.10.02 |
---|---|
[Python] 소수 만들기 (0) | 2024.10.02 |
[Python] 콜라 문제 (0) | 2024.09.27 |
[Python] 푸드 파이트 대회 (0) | 2024.09.26 |
[Python] 가장 가까운 같은 글자 (0) | 2024.09.25 |