Algorithm

[Python] 프로그래머스 완전탐색 모의고사

씬프 2021. 4. 7. 17:39
반응형

프로그래머스 코딩테스트 연습문제 중 완전탐색 모의고사 문제

 

수포자가 찍는 방법을 반복되게 주어졌다.

1번은 1, 2, 3, 4, 5를 반복하고

2번은 2, 1, 2, 3, 2, 4, 2, 5를 반복

3번은 3, 3, 1, 1, 2, 2, 4, 4, 5, 5를 반복한다.

 

나는 큐 구조를 만들어 정답지 큐가 비어있기 전까지 1번부터 꺼내어

각각 수포자의 선택과 비교하고, 수포자의 답은 다시 큐에 Append하는 방식을 생각했다.

 

from collections import deque

def solution(answers):
    answer = []
    
    queue = deque(answers)
    
    forgiven_1 = deque([1, 2, 3, 4, 5])
    forgiven_2 = deque([2, 1, 2, 3, 2, 4, 2, 5])
    forgiven_3 = deque([3, 3, 1, 1, 2, 2, 4, 4, 5, 5])
    
    cnt = [0] * 3
    
    while queue:
        res = queue.popleft()
        fir = forgiven_1.popleft()
        sec = forgiven_2.popleft()
        thr = forgiven_3.popleft()
        
        if res == fir:
            cnt[0] += 1
        if res == sec:
            cnt[1] += 1
        if res == thr:
            cnt[2] += 1
        
        forgiven_1.append(fir)
        forgiven_2.append(sec)
        forgiven_3.append(thr)
    
    for i in range(len(cnt)):
        if cnt[i] == max(cnt):
            answer.append(i + 1)
    
    return answer

수포자가 반복되는 것이 있는데, 이를 반복문으로 줄일 수 있을 것 같았다.

from collections import deque
def solution(answers):
    answer = []
    
    queue = deque(answers)
    
    forgiven = [
        deque([1, 2, 3, 4, 5]),
        deque([2, 1, 2, 3, 2, 4, 2, 5]),
        deque([3, 3, 1, 1, 2, 2, 4, 4, 5, 5])
    ]
    
    cnt = [0] * 3
    
    while queue:
        res = queue.popleft()
        
        for i in range(len(forgiven)):
            tmp = forgiven[i].popleft()
            if res == tmp:
                cnt[i] += 1
            forgiven[i].append(tmp)
    
    for i in range(len(cnt)):
        if cnt[i] == max(cnt):
            answer.append(i + 1)

    return answer

중복되는 부분 반복문으로 처리했다.

'Algorithm' 카테고리의 다른 글

[Java]  (0) 2021.04.19
[Java] 정렬 알고리즘  (0) 2021.04.19
[Python] 정렬  (0) 2021.04.04
[Python] DFS, BFS  (0) 2021.04.04
구현 문제  (0) 2021.03.27