뭔가 변수가 2개 주어져야 할 것 같은데 1개가 주어져서 당황했다. 하드코딩하라는 뜻으로 이해하고 나니 무엇을 요구하는지는 간단하게 이해가 되었다.
풀이
일단 시험이 최대 10,000문제라고 해서 사용자의 답의 패턴보다 길 수 있다는 것을 고려했고 가장 높은 점수를 받은 사람이 여럿이 될 수 있다는 가능성에서 dictionary(Map 또는 Hash) 자료형을 사용해볼 수 있겠다는 생각이 들었다.
로직 자체는 간단하다.
- 패턴을 순회하며 문제가 모두 끝날 때까지 맞은 것의 개수를 구한다.
for i in range(len(answers)) :
maxRange = len(giveUpMathUser)
usersAnswer = giveUpMathUser[i % maxRange]
if answers[i] == usersAnswer :
score += 1
- 맞은 개수를 key로 하고 해당하는 userId를 List로 넣어준다.(이미 키에 값이 있다면 추가)
try :
try :
temp = userByScore[score]
temp.append(userId)
userByScore[score] = temp
except :
userByScore[score] = [userId]
- key를 정렬해서 가장 높은 key의 value(userIdList)를 반환한다.
scores = list(userByScore.keys())
scores.sort(reverse=True)
users = list(userByScore[scores[0]])
return users
전체 코드 👇
def solution(answers):
giveUpMathUser1 = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
giveUpMathUser2 = [2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5]
giveUpMathUser3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
gitUpMathList = [giveUpMathUser1, giveUpMathUser2, giveUpMathUser3]
userByScore = {}
userId = 1
score = 0
for user in gitUpMathList :
for i in range(len(answers)) :
maxRange = len(user)
if answers[i] == user[i % maxRange] :
score += 1
try :
temp = userByScore[score]
temp.append(userId)
userByScore[score] = temp
except :
userByScore[score] = [userId]
# 초기화
score = 0
userId += 1
scores = list(userByScore.keys())
scores.sort(reverse=True)
users = list(userByScore[scores[0]])
return users
print(solution([1,3,2,4,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 answerIdx, currentCorrectAnswer in enumerate(answers):
for userAnswerIdx, usersAnswer in enumerate(p):
if currentCorrectAnswer == usersAnswer[answerIdx % len(usersAnswer)]:
s[userAnswerIdx] += 1
# s의 max인 값에 해당하는 index +1의 List를 만들어줌
return [i + 1 for i, v in enumerate(s) if v == max(s)]