Algorithm
프로그래머스
Python
모의고사

모의고사 문제 (opens in a new tab)

뭔가 변수가 2개 주어져야 할 것 같은데 1개가 주어져서 당황했다. 하드코딩하라는 뜻으로 이해하고 나니 무엇을 요구하는지는 간단하게 이해가 되었다.

풀이

일단 시험이 최대 10,000문제라고 해서 사용자의 답의 패턴보다 길 수 있다는 것을 고려했고 가장 높은 점수를 받은 사람이 여럿이 될 수 있다는 가능성에서 dictionary(Map 또는 Hash) 자료형을 사용해볼 수 있겠다는 생각이 들었다.
로직 자체는 간단하다.

  1. 패턴을 순회하며 문제가 모두 끝날 때까지 맞은 것의 개수를 구한다.
    for i in range(len(answers)) : 
      maxRange = len(giveUpMathUser)
      usersAnswer = giveUpMathUser[i % maxRange]
      if answers[i] == usersAnswer :
        score += 1
  1. 맞은 개수를 key로 하고 해당하는 userId를 List로 넣어준다.(이미 키에 값이 있다면 추가)
try :
    try :
      temp = userByScore[score] 
      temp.append(userId)
      userByScore[score] = temp
    except :
      userByScore[score] = [userId]
  1. 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)]