/ 제출 1 /
def solution(answers):
result = []
n = len(answers)
first = [1,2,3,4,5]
second = [2,1,2,3,2,4,2,5]
third = [3,3,1,1,2,2,4,4,5,5]
students = [first, second, third]
for student in students:
score = 0
# answer이 학생찍는 기본배열보다 작을 때
if n < len(student):
for a, s in zip(answers, student[:n]):
if a == s:
score += 1
# 학생 찍는 기본 배열보다 answer이 많을 때
else:
# 기본 배열 늘려주기
student = student*(n//len(student))
remain = n%len(student)
if remain != 0:
student += student[:remain]
for a, s in zip(answers, student):
if a == s:
score += 1
result.append(score)
answer = []
best = 0
for i in range(3):
if best <= result[i]:
answer.append(i+1)
best = result[i]
return answer
/ 제출 2 /
def solution(answers):
result = []
n = len(answers)
first = [1,2,3,4,5]
second = [2,1,2,3,2,4,2,5]
third = [3,3,1,1,2,2,4,4,5,5]
students = [first, second, third]
for student in students:
score = 0
# answer이 학생찍는 기본배열보다 작을 때
if n < len(student):
for a, s in zip(answers, student[:n]):
if a == s:
score += 1
# 학생 찍는 기본 배열보다 answer이 많을 때
else:
# 기본 배열 늘려주기
student = student*(n//len(student))
remain = n%len(student)
if remain != 0:
student.extend(student[:remain])
print(student)
for a, s in zip(answers, student):
if a == s:
score += 1
result.append(score)
answer = []
best = max(result)
for i in range(3):
if best == result[i]:
answer.append(i+1)
return answer
수정사항 1 .
for i in range(3):
if best <= result[i]:
answer.append(i+1)
best = result[i]
우선 마지막 부분에서 카운팅을 정말 이상하게 했습니다. 한 번 answer에 appedn되면 나올 수 없게 되었습니다. 그래서 제일 큰 값이 생겨도 이전 작은 값이 answer에 남아있게 됩니다.
answer = []
best = max(result)
for i in range(3):
if best == result[i]:
answer.append(i+1)
최고값을 찾아서 해당 값에 맞는 학생을 넣습니다.
해당 문제 카테고리가 완전탐색에, 학생 수도 3명 밖에 되지 않아 요렇게 작성합니다.
수정사항 2.
else:
# 기본 배열 늘려주기
student = student*(n//len(student))
remain = n%len(student)
if remain != 0:
student.extend(student[:remain])
print(student)
for a, s in zip(answers, student):
if a == s:
score += 1
기본 배열을 늘려주는 부분도 extend() 를 써서 다시 작성했습니다. 리스트와 리스트를 더하는 함수입니다. 함수명이 직관적이어서 코드 의미를 알기 더 좋아보여 변경했습니다.
/ 다른 분들 풀이 /
from itertools import cycle
def solution(answers):
giveups = [
cycle([1,2,3,4,5]),
cycle([2,1,2,3,2,4,2,5]),
cycle([3,3,1,1,2,2,4,4,5,5]),
]
scores = [0, 0, 0]
for num in answers:
for i in range(3):
if next(giveups[i]) == num:
scores[i] += 1
highest = max(scores)
return [i + 1 for i, v in enumerate(scores) if v == highest]
처음 보는 내장함수여서 관심 있게 살펴봤는데 전체적으로 코드가 참 좋습니다.
우선 cycle() 함수는 list요소를 무한순회하며 연장 가능한 함수입니다.
주어지는 인자값이 너무 크면 공간을 많이 차지할 수 있으니 그 점을 주의하라고 제시되어 있습니다.
https://docs.python.org/3/library/itertools.html#itertools.cycle
itertools — Functions creating iterators for efficient looping — Python 3.10.5 documentation
itertools — Functions creating iterators for efficient looping This module implements a number of iterator building blocks inspired by constructs from APL, Haskell, and SML. Each has been recast in a form suitable for Python. The module standardizes a co
docs.python.org
https://www.geeksforgeeks.org/python-itertools-cycle/
Python - Itertools.cycle() - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'CodingTest > Programmers' 카테고리의 다른 글
[ 프로그래머스 ] 약수의 개수와 덧셈 (0) | 2022.06.23 |
---|---|
[ 프로그래밍 ] 폰켓몬 (0) | 2022.06.23 |
[ 프로그래머스 ] 소수 만들기 (0) | 2022.06.22 |
[ 프로그래머스 ] 음양 더하기 (0) | 2022.06.22 |
[ 프로그래머스 ] 크레인 인형뽑기 게임 (0) | 2022.06.22 |