본문 바로가기
IT 톺아보기/알고리즘

소프티어(softeer) [인증평가(5차) 기출] 업무 처리 | python

by 파초우 2023. 1. 26.
반응형

https://softeer.ai/practice/info.do?idx=1&eid=1256 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

문제

어떤 부서의 업무 조직은 완전이진트리 모양이다. 즉, 부서장이 루트이고 부서장 포함 각 직원은 왼쪽과 오른쪽의 부하 직원을 가진다. 부하 직원이 없는 직원을 말단 직원이라고 부른다.

 

모든 말단 직원은 부서장까지 올라가는 거리가 동일하다. 조직도 트리의 높이는 H이다. 아래는 높이가 1이고 업무가 3개인 조직도를 보여준다.

 

 

업무는 R일 동안 진행된다. 처음에 말단 직원들만 각각 K개의 순서가 정해진 업무를 가지고 있다. 각 업무는 업무 번호가 있다. 각 날짜에 남은 업무가 있는 경우, 말단 직원은 하나의 업무를 처리해서 상사에게 올린다. 다른 직원들도, 대기하는 업무가 있는 경우 업무를 올라온 순서대로 하나 처리해서 상사에게 올린다. 단, 홀수 번째 날짜에는 왼쪽 부하 직원이 올린 업무를, 짝수 번째 날짜에는 오른쪽 부하 직원이 올린 업무를 처리한다.

 

부서장이 처리한 일은 완료된 것이다. 업무를 올리는 것은 모두 동시에 진행한다. 따라서 그날 올린 업무를 상사가 처리하는 것은 그 다음날에야 가능하다.

 

부서의 조직과 대기하는 업무들을 입력 받아 처리가 완료된 업무들의 번호의 합을 계산하는 프로그램을 작성하라.

제약조건

1 ≤ H ≤ 10

1 ≤ K ≤ 10

1 ≤ R ≤ 1,000

입력형식

첫 줄에 조직도의 높이 H, 말단에 대기하는 업무의 개수 K, 업무가 진행되는 날짜 수 R이 주어진다.

그 다음 줄부터 각각의 말단 직원에 대해 대기하는 업무가 순서대로 주어진다.

제일 왼쪽의 말단 직원부터 순서대로 주어진다.

출력형식

완료된 업무들의 번호 합을 정수로 출력한다.


해당 문제는 queue를 이용한 문제이다. Day가 +1 될 때마다 작업을 진행하고 마지막 최상위 상사가 작업을 완료한 건에 대해서만 완료로 한다.

이진트리

이를 위해 이진 트리 형태로 리스트를 만드는 것이 중요하고, 각 노드를 queue로 만들어 앞의 작업을 출력할 수 있도록 한다.
다음 조건으로는 홀수 날짜와 짝수 날짜에 따라 상위 노드의 오른쪽과 왼쪽 하위 노드의 업무 처리가 가능해진다. 그렇기 때문에 day에 따라 업무를 완료하는 노드를 지정해주는 함수를 작성한다.
각 작업의 처음은 최상위 노드에 작업이 있는지 확인하고 있는경우 작업을 완료 해주고 아닌 경우 그냥 지나간다. 그 다음 하위 노드부터는 날짜에 따라 짝수와 홀수 column 노드의 작업을 진행하여 완료된 건에 대해 상위 노드로 보내준다.
이를 주어진 날만큼 수행한다.
아래 코드를 보자.

 

import sys
from collections import deque
input = sys.stdin.readline

# 값을 입력받고 2차원 Array를 H + 1 크기 만큼 만들어준다.
# 마지막 row의 노드들에 해야할 작업을 넣어준다.
answer = 0
H, k, r = map(int, input().split())
boards = [[deque() for _ in range(2 ** h)] for h in range(H + 1)]
boards[-1] = [deque(map(int, input().split())) for _ in range(2 ** H)]


# 날짜가 r이 될 때까지 작업을 진행하는데,
# (0, 0) 노드에 작업이 있으면 answer에 작업의 번호를 더해준다.
# 그러고 각 row를 탐색하며 날짜에 따라 업무가 있으면 작업을 완료해준다.
days = 0
while days < r:
    days += 1
    if boards[0][0]:
        answer += boards[0][0].pop()
    for row in range(H):
        alpha = days % 2
        for col in range(2 ** row):
            if boards[row + 1][col * 2 + alpha]:
                boards[row][col].append(boards[row + 1][col * 2 + alpha].popleft())
print(answer)

 

커피 한 잔의 기부는 더 나은 글을 쓰는데 도움이 됩니다.

반응형