코딩테스트/프로그래머스

[프로그래머스] [스택] 과제 진행하기

박소민 2024. 10. 22. 00:55
과제 진행하기
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

  • 첫 풀이- fail
    • 채점 결과: 런타임에러
    • -> wait이 비어있을때 pop을 요청했기 때문
      • while문을 돌면서 계속 바뀌기 때문에
      • remain, wait이 둘다 있는지를 확인해야함

def solution(plans):
    plans.sort(key=lambda x:x[1])
    answer = []
    wait=[]
    
    for idx, plan in enumerate(plans):
		...
        if start+time==next_start:
            answer.append(name)
        elif start+time>next_start:
            wait.append((name,(start+time)-next_start))
        else: #시간이 남으면
            answer.append(name)
            if not wait:
                continue
            remain=next_start-(start+time)
            while remain:
                wait_name, wait_time=wait.pop()
                if remain>=wait_time:
                    answer.append(wait_name)
                    remain-=wait_time
                else:
                    wait.append((wait_name, wait_time-remain))
                    remain=0
    
    while wait:
        name,time=wait.pop()
        answer.append(name)
    
    return answer

 

 

  • 풀이
def solution(plans):
    plans.sort(key=lambda x:x[1])
    answer = []
    wait=[]
    
    for idx, plan in enumerate(plans):
        name, start, time=plan
        hh,mm=map(int,start.split(":"))
        start=hh*60+mm
        time=int(time)
        
        if idx==len(plans)-1:
            answer.append(name)
            break
        hh2,mm2=map(int,plans[idx+1][1].split(":"))
        next_start=hh2*60+mm2
        
        if start+time==next_start:
            answer.append(name)
        elif start+time>next_start:
            wait.append((name,(start+time)-next_start))
        else: #시간이 남으면
            answer.append(name)
            if not wait:
                continue
            remain=next_start-(start+time)
            while remain and wait:
                wait_name, wait_time=wait.pop()
                if remain>=wait_time:
                    answer.append(wait_name)
                    remain-=wait_time
                else:
                    wait.append((wait_name, wait_time-remain))
                    remain=0
    
    while wait:
        name,time=wait.pop()
        answer.append(name)
    
    return answer