T.I.L (Python 맛보기 문제)

2023. 3. 20. 21:59T.I.L (Today_I_Learned)

문제

  • 수포자 3명(이하 s1, s2, s3)이 있습니다.
  • 수포자 3명은 수학 시험에 출제된 문제를 전부 찍으려고 합니다.
  • 단, 수포자 3명은 각자의 찍기 패턴이 있어 패턴대로만 찍습니다. 
  • 1번 문제부터 마지막 문제까지의 정답이 순서대로 들어있는 배열 answers가 있다고 가정합니다.
  • 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성합니다.
s1 = [1, 2, 3, 4, 5]
s2 = [2, 1, 2, 3, 2, 4, 2, 5]
s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

수포자 3명의 찍기 패턴


 

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

 

해결한 방법

 

1. solution 함수를 선언 합니다.

def solution(answers):

 

2. 함수 안에 s1, s2, s3의 찍기 패턴을 리스트로 작성 합니다. (가답안지에 답을 체크하는 느낌적인 느낌입니다.)

s1 = [1, 2, 3, 4, 5]
s2 = [2, 1, 2, 3, 2, 4, 2, 5]
s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

 

3. 리스트 answers의 요소들과 s1, s2, s3에 담긴 요소들을 각각 대조 합니다.

    (정답을 맞춰서 점수를 세어주는 느낌적인 느낌입니다.)

  • answers의 요소들을 answers 요소들의 수 만큼 출력합니다.
  • 위 과정을 진행하면서 if문을 활용하여 answers의 요소들과 s1, s2, s3의 요소들을 각각 대조합니다.
  • 순서마다 해당 순서의 i값을 s1, s2, s3 각각의 요소들의 길이로 나눠서 전체 문제의 길이만큼 각 수포자들의 정답 패턴을 반복해 줍니다. (전체 문제의 길이가 10문제라는 가정 하에 s1[i % len(s1)]이 아닌 s1[i]라고 한다면 answers 요소들의 길이가 s1 요소들의 길이를 넘어가서  'IndexError: list index out of range' 라는 에러 메세지를 볼 수 있습니다.)
point = [0, 0, 0]

for i, answer in enumerate(answers):
    if answer == s1[i % len(s1)]:
        point[0] += 1
    if answer == s2[i % len(s2)]:
        point[1] += 1
    if answer == s3[i % len(s3)]:
        point[2] += 1

 

4. 3번 과정에서 리스트 point에 요소로 들어간 수들을 사용해 누가 가장 높은 점수를 받았는지 산출해야 합니다.

    (s1, s2, s3 중에 점수가 가장 높은 녀석을 뽑아주는 과정 같은 느낌적인 느낌입니다.)

  • point안에 담겨진 요소들중 가장 큰 수를 max함수를 사용해 산출합니다.
  • 몇번째 best값이 max(point)의 값과 같은지 찾아줍니다.
  • i = [0, 1, 2] 이므로 i + 1을 한 값을 .append를 사용해 rank의 안에 넣어줍니다.
  • rank에 입력된 값을 return해 줍니다.
rank = []

for i, best in enumerate(point):
	if max(point) == best:
    	rank.append(i + 1)

return rank

 

전체 코드

 

def solution(answers):
    s1 = [1, 2, 3, 4, 5]
    s2 = [2, 1, 2, 3, 2, 4, 2, 5]
    s3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

    point = [0, 0, 0]
    rank = []

    for i, answer in enumerate(answers):
        if answer == s1[i % len(s1)]:
            point[0] += 1
        if answer == s2[i % len(s2)]:
            point[1] += 1
        if answer == s3[i % len(s3)]:
            point[2] += 1

    for i, best in enumerate(point):
        if max(point) == best:
            rank.append(i + 1)

    return rank