프로그램

[파이썬] 문제 : 짧은 프로젝트 A, 긴 프로젝트 B팀의 작업 할당

오디세이99 2023. 2. 15. 11:24
728x90
반응형

(문제)

온라인 접수 시스템을 도입한 이후 회사의 사업 규모는 급증했다. 상사는 고객 만족도 향상을 위해 A팀과 B팀을 편성했고, A팀은 예상 시간이 가장 짧은 프로젝트 수행을, B팀은 예상 시간이 가장 긴 프로젝트 수행을 우선시했다. 케이스를 받는 과정을 시뮬레이션하고 A,B 팀에 작업을 올바르게 할당하는 프로그램을 작성하십시오.
 
예를 들어, 회사는 현재 5개의 프로젝트를 접수하고 프로젝트 이름과 예상 일수는 
Job1, 10일, Job2, 5일, Job3, 7일, Job4, 3일, Job5, 6일입니다. 
A팀은 Job4를 먼저 계획하고 B팀은 Job1을 먼저 계획하고 3일 후 A팀은 Job4를 완료한 후 Job2를, 5일 후에 Job5를 받게 됩니다. 11일에 B팀은 Job1을 완료하여 Job3을 받습니다. 두 팀의 업무 배정 및 날짜는 다음과 같습니다.

다음 프로그램은 위에서 언급한 계획 할당을 완료합니다.이 기능이 호출될 때마다 A 또는 B 팀에 할당된 작업 항목을 배정할 수 있는 일정 기능 작성을 도와주세요.
 
입력 형식:
 
n : 첫 번째 줄에는 수신된 총 n개의 계획 작업 개수를 나타내는 정수 n 
 
p1 p2 ... pn : 두 번째 행의 n개의 정수로, n개의 프로젝트 각각을 완료하는 데 pi일이 소요됨을 나타냅니다.
 
출력 형식:
 
샘플 데이터와 같이 팀 A와 B의 작업 할당을 순서대로 나열하십시오.
 

샘플 데이터:

자료1
input
5
10 5 7 3 6
print
Team A run job4 need 3 day
Team B run job1 need 10 day
Team A run job2 need 5 day
Team A run job5 need 6 day
Team B run job3 need 7 day

자료2
input
8
13 7 4 10 6 9 6 8
print
Team A run job3 need 4 day
Team B run job1 need 13 day
Team A run job5 need 6 day
Team A run job7 need 6 day
Team B run job4 need 10 day
Team A run job2 need 7 day
Team A run job8 need 8 day
Team B run job6 need 9 day

자료3
input
4
1 2 3 4
print
Team A run job1 need 1 day
Team B run job4 need 4 day
Team A run job2 need 2 day
Team A run job3 need 3 day

자료4
input
8
4 6 13 9 6 10 7 8
print
Team A run job1 need 4 day
Team B run job3 need 13 day
Team A run job2 need 6 day
Team A run job5 need 6 day
Team B run job6 need 10 day
Team A run job7 need 7 day
Team A run job8 need 8 day
Team B run job4 need 9 day

자료5
input
7
4 3 2 12 15 8 10
print
Team A run job3 need 2 day
Team B run job5 need 15 day
Team A run job2 need 3 day
Team A run job1 need 4 day
Team A run job6 need 8 day
Team B run job4 need 12 day
Team A run job7 need 10 day

import codecs 
import sys 
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 
def Schedule(c, job, n, jid): 
????????????????????????????????????????? 
def bubble(n, job): 
for i in range(n): 
for j in range(n-1): 
if(int(job[j]) > int(job[j+1])): 
temp = job[j] 
job[j] = job[j+1] 
job[j+1] = temp 
temp = jid[j] 
jid[j] = jid[j+1] 
jid[j+1] = temp 
if __name__ == '__main__': 
n = int(input()) 
job = list(map(str, input().rstrip().split())) 
jid = [] 
for i in range(n): 
jid.append(i+1) 
bubble(n, job) 
AWork = 0 
BWork = 0 
for i in range(n): 
if AWork > BWork: 
day, name = Schedule('B', job, n, jid) 
BWork = BWork + int(day) 
print("Team B run job"+str(name)+" need "+str(day)+" day ") 
elif AWork < BWork: 
day, name = Schedule('A', job, n, jid) 
AWork = AWork + int(day) 
print("Team A run job"+str(name)+" need "+str(day)+" day ") 
else: 
day, name = Schedule('A', job, n, jid) 
AWork = AWork + int(day) 
print("Team A run job"+str(name)+" need "+str(day)+" day "

 

 

(방법)

프로그램의 기본 전략을 작업을 오름차순으로 정렬해서 A는 앞에서부터(작업작업일) 하고,

B는 뒤에서부터(오래걸리는 작업일) 하는 겁니다.

Schedule 함수만 수정하면 문제가 됩니다. 아래 for 문제 2개가 있는데 모두 i를 사용합니다. 등등

올려주신 코드가 문제가 있어서 아래와 같이 수정 했습니다.

모든 입력 예시에 대해서 정확하게 결과가 나오는 것은 확인 했습니다.

import codecs 
import sys 

# sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 

def Schedule(c, job, idx, jid): 
    rtnDay = 0
    rtnName = ''
    
    if c == 'A':
        idx = idx
        rtnName = c             # rtnName은 그냥 c 로 해서 return해도 됩니다. 하가보니 특별한 것은 없는 것 같습니다.
        rtnDay = job[idx]       # A는 정렬된 작업의 앞에서부터 순차적으로 작업합니다.
    elif c == 'B':
        idx = idx
        rtnName = c 
        rtnDay = job[-(idx+1)]  # B는 정렬된 작업의 뒤에서부터 앞으로 순차적으로 작업 합니다.. 인덱스를 - 로 하면 뒤에서 번호 임.
        
    
    return rtnDay, rtnName


def bubble(n, job): 
    for i in range(n): 
        for j in range(n-1): 
            if(int(job[j]) > int(job[j+1])): 
                temp = job[j] 
                job[j] = job[j+1] 
                job[j+1] = temp 
#             temp = jid[j] 
#             jid[j] = jid[j+1] 
#             jid[j+1] = temp 

                
if __name__ == '__main__': 
    n = int(input()) 
    job = list(map(str, input().rstrip().split())) 
    # n = 5                             # 입력 예제들 입니다. 위의 입력 코드 라인을 주석처리 하고 테스트 하면 됩니다.
    # job = [10, 5, 7, 3, 6]
    # n = 8
    # job = [13, 7, 4, 10, 6, 9, 6, 8]
    # n = 4
    # job = [1, 2, 3, 4]
    # n = 8
    # job = [4, 6, 13, 9, 6, 10, 7, 8]
    # n = 7
    # job = [4, 3, 2, 12, 15, 8, 10]
    jid = [] 
    bubble(n, job)
    AWork = 0
    BWork = 0
    A_idx = 0
    B_idx = 0
    for i in range(n): 
        # jid.append(i+1)
        # for i in range(n):
        if AWork > BWork:
            day, name = Schedule('B', job, B_idx, jid)    # n 대신에 몇번째 작업인지(B_idx) 추가
            B_idx += 1                                    # 몇 번째 작업인지 추가
            BWork = BWork + int(day)
            print("Team B run job"+str(name)+" need "+str(day)+" day ")
        elif AWork < BWork:
            day, name = Schedule('A', job, A_idx, jid)
            A_idx += 1                                    # 몇 번째 작업인지 추가
            AWork = AWork + int(day)
            print("Team A run job"+str(name)+" need "+str(day)+" day ")
        else:
            day, name = Schedule('A', job, A_idx, jid)
            A_idx += 1                                    # 몇 번째 작업인지 추가
            AWork = AWork + int(day)
            print("Team A run job"+str(name)+" need "+str(day)+" day ")

728x90
반응형