기능 개발

zzwwoonn·2022년 6월 17일
0

Algorithm

목록 보기
54/71

ceil

첫 번째 풀이

import math

progresses = [93, 30, 55]
# progresses = [95, 90, 99, 99, 80, 99]		
speeds = [1, 30, 5]
# speeds = [1, 1, 1, 1, 1, 1]
# 정답 : [2, 1], [1, 3, 2]
def solution(progresses, speeds):
    answer = []
    remainTime = []

    # 남은 시간 (걸리는 시간)
    for i in range(len(progresses)):
        # print("a = ", (100 - progresses[i]) / speeds[i])
        # print("b = ", float(100 - progresses[i]) / speeds[i])
        # print("c = ", math.ceil(float(100 - progresses[i]) / speeds[i]))
        remainTime.append(math.ceil((100 - progresses[i]) / speeds[i]))
        # 반올림 = round, 올림 = ceil, 
    # print(remainTime)

    
    visit = [0] * len(progresses)
    # print(visit)

    cnt = 1
    curVal = 0
    status = True

    for i in range(0, len(remainTime)):
        print( " i = ", i)
        if visit[i] == 1: 
            print(i, "이미 왔던 곳, continue")
            continue
        
        visit[i] = 1
        print(i, " 방문 체크")

        for j in range(i+1, len(remainTime)):
            if j == len(progresses)-1:
                answer.append(cnt+1)
                status = False
                break

            if remainTime[i] <= remainTime[j]: 
                answer.append(cnt)
                cnt = 1
                break
            else:
                visit[j] = 1 
                cnt+=1
                print("cnt = ", cnt)

        if status == False:
            break
    print(answer)
    
    return answer

solution(progresses, speeds)

ceil을 이용해서 올림을 시켜주면 그 작업이 마칠 때까지 남은 일자를 구할 수 있다는 것. 까지 생각해냈다.
그 다음이 출력이었는데 그걸 도저히 모르겠더라

언제나 그래왔듯 정답 코드는 그 어렵던 걸 이렇게나 쉽게 구한다.

def solution(progresses, speeds):
    answer = []
    remainTime = []

    # 남은 시간 (걸리는 시간)
    for i in range(len(progresses)):
        # print("a = ", (100 - progresses[i]) / speeds[i])
        # print("b = ", float(100 - progresses[i]) / speeds[i])
        # print("c = ", math.ceil(float(100 - progresses[i]) / speeds[i]))
        remainTime.append(math.ceil((100 - progresses[i]) / speeds[i]))
        # 반올림 = round, 올림 = ceil, 
    # print(remainTime)
   
    
    count = 0
    for a in remainTime:
        if a > count:
            answer.append(1)
            count = a
        else:
            answer[-1] += 1

    # print(answer)
    return answer

2중 for문에다가 상태를 나타내는 불리언 값까지 넣어가면서 생각했는데 그냥 for문 하나 if 하나 else 하나면 끝이었다.

스택/큐

문제의 의도대로 스택/큐 개념을 이용한 방식

def solution(progresses, speeds):
    answer = []

    # 작업이 없을 때까지 반복
    while progresses:
        for i in range(len(progresses)):
            progresses[i] += speeds[i]
            # 하루 작업 했다. speeds[i] => 작업량 하루치 작업
        
        # 하루 작업 하고 나면 => 94, 60, 60
        # 하루 작업 하고 나면 => 95, 90, 65
        # 하루 작업 하고 나면 => 100, 240, 90
        cnt = 0
        while progresses and progresses[0] >= 100:
            # 제일 첫 번째 작업이 작업 끝났어 => 100
            progresses.pop(0)
            # 첫 번째 작업 pop
            speeds.pop(0)
            # 첫 번째 작업에 해당하는 속도 pop
            cnt += 1
            # cnt = 1 -> 100 끝난거 한개

            # 다시 while문 돌았을 때 두 번째꺼도 100 넘었어
            # 그럼 그거 pop 하고 cnt = 2 돼
            # 이제 작업 끝난게 없어 => 세 번째꺼는 100이 안돼 => 다시 while 돌아

        if cnt > 0:
            answer.append(cnt)
        
    return answer

0개의 댓글