본문 바로가기
알고리즘/프로그래머스 - 파이썬

프로그래머스) 모의고사

by AI Sonny 2022. 9. 4.
728x90

문제 설명

수포자는 수학을 포기한 사람의 준말입니다.

 

수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다.

 

수포자는 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하는 값을 오름차순 정렬해주세요.

 

입출력 예

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

 

내 생각

1. 인형 뽑기 문제처럼 중첩 for 문을 사용

2. 그 후 문제의 번호를 뽑는다.

 

처음 나의 코드

못풀었다...

 

문제에 대한 이해가 잘못되었다.

 

나는 처음에 answer 답이 문제의 길이보다 커야하는데 반대로 생각했다.

 

문제에 answer를 넣는게 아니라 answer를 문제를 넣어야했다.

 

그래서 문제가 안풀렸던 것이다.

 

바뀐 코드

 

def solution(a):
    cnt = [0,0,0]
    res = []
    a1 = [1, 2, 3, 4, 5]
    a2 = [2, 1, 2, 3, 2, 4, 2, 5]
    a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    for i in range(len(a)):
        if a1[i%5] == a[i]:
            cnt[0] += 1
        if a2[i%8] == a[i]:
            cnt[1] += 1
        if a3[i%10] == a[i]:
            cnt[2] += 1

    for i in range(len(cnt)):
            if max(cnt) == cnt[i]:
                res.append(i+1)
    return res

 

처음에 최종 결과의 인덱스 번호를 출력할 리스트 res를 만든다.

 

 그리고 각 수포자들의 맞은 개수를 나타낼 리스트를 만든다.

 

이 후 for 문을 이용하여 각 길이에 맞게 정답이 맞으면 cnt에 +1을 한다.

 

그리고 for문을 한번 더 돌려 cnt의 최대값이 같은 것을 res 리스트에 1을 더해 담는다.

 

부족한 개념

1. 각 문제의 패턴을 파악한 후 for 문을 어떻게 돌려야할지 몰랐는데 모듈러 연산이라는 것을 알게 되었다.

 

쉽게 말해 나누는 수(제수)로 A mod B 에서, B가 modulus에 해당한다.

 

그래서 if a1[i%5] == a[i]을 보면 a1의 값이 5가 들어가면 0 이 반환되어 if문이 나오게 된다.

 

2. 숫자를 셀 때 배열로 센다는 것을 생각하지 못했다.

 

cnt를 리스트를 이용해서 따로 따로 셀 수 있다는 것을 배웠다.

 

3. max값에 대해 어떻게 인덱스 번호를 출력할지에 대해 고민이 많았는데 간단하게 for문을 이용하면 되었다.

 

max값이 cnt [i]와 같다면 append하여 res에 담아낸다.

728x90

댓글