[프로그래머스] 모의고사 파이썬 python
본문 바로가기
Python/Python 코딩테스트

[프로그래머스] 모의고사 파이썬 python

by 쏠수있어ㅤ 2021. 6. 23.
반응형

 

모의고사

 

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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하는 값을 오름차순 정렬해주세요.

입출력 예

answersreturn

[1,2,3,4,5] [1]
[1,3,2,4,2] [1,2,3]

 

 

나의 코드 

def solution(answers):
    a = '12345'*(len(answers)//5)+'12345'[:len(answers)%5]
    b = '21232425'*(len(answers)//8)+'21232425'[:len(answers)%8]
    c = '3311224455'*(len(answers)//10) + '3311224455'[:len(answers)%10]
    
    A=[0,0,0,0]
    for i in range(len(answers)):
        if answers[i]==int(a[i]): A[1] += 1
        if answers[i]==int(b[i]): A[2] += 1
        if answers[i]==int(c[i]): A[3] += 1
    
    return [i for i in range(len(A)) if A[i] == max(A)]

어떻게든 답을 구하려고 애쓰다가 문자열로 풀었다 

 

 

 

다른 분들 코드 1

def solution(answers):
  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]
  score=[0,0,0]
  result=[]

  for idx, answer in enumerate(answers):
    print(idx,answer)
    if answer == p1[idx%len(p1)]:
      score[0] += 1 
    if answer == p2[idx%len(p2)]:
      score[1] += 1
    if answer == p3[idx%len(p3)]:
      score[2] += 1 

  for idx, s in enumerate(score):
    if s==max(score):
      result.append(idx+1)

  return result
  

enumerate을 쓰면 index가 0부터 쭉 - 나온다. 그 인덱스를 패턴들의 길이로 나눠서 답을 맞추기 ! 

 

 

고수 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] * 3

  for idx, a in enumerate(answers):
    for idx2, pattern in enumerate(p):
      if a==pattern[idx%len(pattern)]:
        s[idx2] += 1 
 
  return [i+1 for i in range(len(s)) if s[i] == max(s)]

위의 코드를 for로 합쳤다! 

 

 

 

고수 3 

from itertools import cycle

def solution(answer):
  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 answer:
    for i in range(3):
      if next(giveups[i])==num:
        scores[i] += 1

  return [i+1 for i in range(len(scores)) if scores[i]==max(scores)]

solution([1,2,3,4,5])

 

cycle이라는 걸 처음 봤다 !! cycle을 쓸 때 next()를 써서 다음 거를 쉽게 가져올 수 있구나... 

 

 

배운 점 : cycle, enumerate 

반응형

댓글