[BOJ 1966][백준 1966번] 프린터 큐 (파이썬 풀이)

도깨비젤리

·

2021. 6. 26. 23:18

https://www.acmicpc.net/problem/1966

 

🤔 문제 설명 및 입출력


 

 

 접근 방법


구현 자체보다 문제를 이해하는게 더 헷갈리는거 같습니다. 문제 자체는 특별한 기교가 있는게 아니라 걍 시키는거 잘하면 됩니다 N의 최대값도 100으로 작으니, 따로 시간 복잡도 고려하지 않고, 생각가는데로 구현하면 되겠다는 생각도 했습니다.

 

 

👨‍💻 소스 코드


  • 파이썬
    def resort(printer:list)->list:
        cnt = 0
        while True:
            max_priority = max(printer)[0]
            first = printer.pop(0)
            if first[0] != max_priority:
                printer.append(first)
            else: # first == max_priority 임
                cnt += 1
                if first[1] == "target":
                    return cnt
    
    
    TC = int(input())
    for _ in range(TC):
        N,M = map(int,input().split())
        
        # 숫자 리스트
        printer = list(map(int,input().split()))
        for idx in range(len(printer)):
            if idx == M:
                printer[idx] = (printer[idx],"target")
            else:
                printer[idx] = (printer[idx],"non-target")
    
        print(resort(printer))​

 

 

 

이건 필연적으로 원본 Queue가 훼손되게 되기 때문에 Queue를 입력받으면서 출력해야할 문서 (각 TC의 첫번째 줄의 2번째 숫자)에 표식을 붙여놔야지 재정렬 이후에도 출력해야할 문서를 알아볼수가 있습니다. 이때 enmuerate를 쓰면 세상 편할거라는 생각이 들었는데, 안타깝게도 Queue 입력이 한줄로 드르륵 들어와서 enmuerate를 쓸 수 없는 환경이라, 따로 for문을 이용해서 표식을 달아줬습니다.

 

 

출력 순서의 정렬은 크게 어려울 것이 없습니다. 기본적으로 while True로 뺑뺑이를 돌리는데, 매 뺑뺑이마다 Printer 리스트에서의 우선순위 최대값을 구한 다음, 맨 앞에 있는 놈을 pop(0)로 뽕 하고 뽑는습니다.

 

이렇게 뽑은 친구의 우선순위가 최대값보다 낮으면, 그대로 맨 뒤로 삽입해줍니다

 

하지만 만약에 그 친구가 리스트에서 가장 높은 우선순위를 가지고 있으면 그대로 보내버리고 cnt 를 1 올립니다. 하지만, 그 친구가 리스트에서 가장 높은 우선순위를 가짐과 동시에 우리가 찾는 타겟이라면, 여태까지 누적했던 cnt 값을 반환해서 출력토록 합니다.

 

상대적으로 비용이 많이 드는 pop(0)를 반복해서 썼지만, 워낙 N이 작은 문제라 파이썬으로도 무리없이 구현이 가능했습니다.

🔥 강평


 

그냥 의식의 흐름대로 코딩했는데 맞을 줄은 몰랐습니다.

상세히 파고 들면 분명 엉성한 로직이 있을것이다...이 점 양해바라고 더 피드백 해줄 부분이 있으시다면 말씀해주시면 감사드리겠습니다.

 

그나저나, 오늘 결심한 사항인데, 오늘부터는 무조건 1일 1알고를 하려고 합니다.

여태까지는 어려운 문제 푸는거에만 너무 집착을 했는데, 어려운 문제 하나를 몇일에 걸쳐서 푸는것보다 쉬운 문제 여러개를 풀면서 로직을 내재화 하는게 더 도움이 될 거 같다는 생각에서입니다.

 

 

그냥 그렇다고요 ㅎ