Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

냠냠뇸

[프로그래머스/LV.1] 모의고사(완전탐색) 본문

Python/Coding Test 기록

[프로그래머스/LV.1] 모의고사(완전탐색)

yerinn 2022. 1. 24. 19:51

문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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
수포자 1은 모든 문제를 맞혔습니다.
수포자 2는 모든 문제를 틀렸습니다.
수포자 3은 모든 문제를 틀렸습니다.
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2
모든 사람이 2문제씩을 맞췄습니다.

 


내 답안

def solution(answers):
    a=[1,2,3,4,5]                   # 100,000개의 답안만들기
    a=a*2000
    b=[2,1,2,3,2,4,2,5]
    b=b*1250
    c=[3,3,1,1,2,2,4,4,5,5]
    c=c*1000                  

    a_ans=[]
    a_cnt=0
    b_ans=[]
    b_cnt=0
    c_ans=[]
    c_cnt=0                 

    for i in range(len(answers)):  # 답이 맞을때 마다 각 고유배열(a,b,c_ans)에 1 추가
        if a[i]==answers[i]:       # 맞은갯수를 a,b,c_cnt에 각각 저장
            a_ans.append(1)
            a_cnt=a_ans.count(1)
        if b[i]==answers[i]:
            b_ans.append(1)
            b_cnt=b_ans.count(1)
        if c[i]==answers[i]:
            c_ans.append(1)
            c_cnt=c_ans.count(1)

    total=[]             # total=[1번학생 맞은갯수, 2번학생 맞은갯수, 3번학생 맞은갯수]
    total.append(a_cnt)
    total.append(b_cnt)
    total.append(c_cnt)

    first=max(total)    # first: 가장많이 맞은 사람의 맞은갯수
    ans=[]
    cnt=0

    if total.count(first)==1:     # 1등이 유일할때
        idx=total.index(first)    # (index+1)번 학생 반환
        ans.append(idx+1)
    else:
        for j in range(3):        # 유일하지 않을때
            if total[j]==first:   
                cnt+=1
                ans.append(cnt)
            else:
                cnt+=1

    return ans

함수보태보태 변수보태보태 for문보태보태 온갖보태보태병에 걸린 나..

쨌든 답은 맞췄지만 가독성 0에 효율성 0에 달성했다 ^^...

 

각 코드의 해석은 주석으로 남겻당...

조건에 맞는 학생을 출력하기 위한 인덱싱에 애를 먹었는데 ㅠㅠ

머리로는 enumerate 함수를 써야 한다는건 알았지만,,

아직 코린이인 나는 사용법을 숙지하지 못해 못씀

 

 

다른사람 풀이  #1 (enumerate 함수)

def solution(answers):
    pattern1 = [1,2,3,4,5]
    pattern2 = [2,1,2,3,2,4,2,5]
    pattern3 = [3,3,1,1,2,2,4,4,5,5]
    score = [0, 0, 0]
    result = []

    for idx, answer in enumerate(answers):
        if answer == pattern1[idx%len(pattern1)]:
            score[0] += 1
        if answer == pattern2[idx%len(pattern2)]:
            score[1] += 1
        if answer == pattern3[idx%len(pattern3)]:
            score[2] += 1

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

    return result

역쉬 enumerate 함수를 사용하셨다.

score 라는 배열을 선언해서 for문을 돌려

점수판 처럼 문제를 맞을때 마다 점수를 더해가는 방식인데,

 

(인덱스%패턴의 길이)로 순환구조를 만들어내 answer 값과 차례로 비교해내는 방식이 신박했다.

 

마지막에 최고점을 맞은 사람을 뽑아낼 때도 같은 함수를 이용하니

더 간결한 코드로 결과값을 출력해 낼 수 있었다.

 

 

다른사람 풀이  #2 (cycle 함수 /  itertools)

from itertools import cycle

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

    return [i + 1 for i, v in enumerate(scores) if v == highest]

이건 첨보는 함수가 등장해서 긁어왔다..

itertools의 cycle 함수를 쓴건데,

배열 내 값을 무한대로 반복하며 next를 통해 차례로 꺼내올 수 있다.

 

함수사용법 및 호출방법은 다음과 같다.

>>> import itertools
>>> emp_pool = itertools.cycle(['김은경', '이명자', '이성진'])
>>> next(emp_pool)
'김은경'
>>> next(emp_pool)
'이명자'
>>> next(emp_pool)
'이성진'
>>> next(emp_pool)
'김은경'
>>> next(emp_pool)
'이명자'
...

 

출처: https://wikidocs.net/108925