본문 바로가기

Problem Solving/Programmers

[프로그래머스] Level 1 모의고사 | 파이썬 | 완전탐색 (🌟 itertools.cycle 사용하기)

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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]

 

🙋‍♂️while문을 사용한 풀이

def solution(answers):
	# A, B, C 길이의 최소공배수인 40으로 배열 길이 변경
    A = [1, 2, 3, 4, 5] * 8
    B = [2, 1, 2, 3, 2, 4, 2, 5] * 5
    C = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 4
    score = [0] * 3		# 점수를 담을 배열 선언
    idx = 0				# 배열 A, B, C에 적용할 인덱스 초기화
    while answers:	
        if idx == 40:	# 만약 idx가 40이 되면
            idx = 0		# 다시 0으로 변경
        if answers[0] == A[idx]:
            score[0] += 1
        if answers[0] == B[idx]:
            score[1] += 1
        if answers[0] == C[idx]:
            score[2] += 1
        del answers[0]	# 확인한 답은 제거
        idx += 1		# idx 이동
        
    res = []	# 결과를 담을 배열
    max_score = max(score)	
    for i in range(len(score)):
        if score[i] == max_score:	# 최댓값과 같은 경우
            res.append(i + 1)		# res배열에 추가
    return res

수포자들의 답이 담긴 세 배열을 어떻게 돌릴지 고민하다 최소공배수를 사용했다. 세 배열을 최소공배수 길이로 맞춰 반복문 내에서 같은 인덱스를 사용할 수 있도록 했다.

 

✌ itertools 라이브러리를 사용한 풀이

import itertools
def solution(answers):
    students = [itertools.cycle([1, 2, 3, 4, 5]),
                itertools.cycle([2, 1, 2, 3, 2, 4, 2, 5]),
                itertools.cycle([3, 3, 1, 1, 2, 2, 4, 4, 5, 5])]
    score = [0] * 3
    for answer in answers:
        for idx in range(len(students)):
            if next(students[idx]) == answer:
                score[idx] += 1
    max_score = max(score)
    return [i+1 for i in range(len(score)) if score[i] == max_score]

다른분들의 풀이를 참고해 itertools를 사용해봤다. itertools.cycle(iterable)함수는 iterable을 순서대로 무한히 반복하는 이터레이터를 생성한다. 

 

코드에서는 students안에 이터레이터를 생성하고, for문 안에서 next를 호출해 값을 확인했다. 

 

반환 시 사용하는 코드도 수정해주었다. max_score까지는 첫번째 방법과 동일하게 구하고, 반환 시에는 list comprehension을 사용했다.

 

 


참고자료 및 문제 출처

 

itertools.cycle 관련

 

05-01 itertools.cycle - 무한 반복자

`itertools.cycle(iterable)` 함수는 iterable을 순서대로 무한히 반복시키는 이터레이터를 생성하는 함수이다. ## 문제 여러분은 전화가 올때마다 ...

wikidocs.net

프로그래머스-모의고사

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr