๐ŸŒฑ → ๐ŸŒณ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ธฐ๋Šฅ๊ฐœ๋ฐœ - python ๋ณธ๋ฌธ

Algorithms

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ธฐ๋Šฅ๊ฐœ๋ฐœ - python

BAY 2023. 8. 2. 14:23
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

๋ฌธ์ œ ์ •๋ณด

๋ฌธ์ œ ์œ ํ˜• : stack/queue

์„ค๊ณ„ ๋ฐฉ๋ฒ•

์†Œ์š” ์‹œ๊ฐ„์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋‘๊ณ  q์— ์ €์žฅ (q๋Š” deque)

q.popleftํ•ด์„œ ์•ž์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ฐฐํฌ๋  ๋•Œ ํ•จ๊ป˜ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋Š” ๋’ท ๊ธฐ๋Šฅ ์ €์žฅ

์ฝ”๋“œ

์‹คํŒจ ์ฝ”๋“œ

from collections import deque
def solution(progresses, speeds):
    answer = []
    cnt = 1
    q = deque()
    for i in range(len(progresses)):
        if (100-progresses[i]) % speeds[i] == 0:
            q.append((100-progresses[i]) // speeds[i])
        else:
            q.append((100-progresses[i]) // speeds[i] + 1)
    while q:
        v = q.popleft()
        if len(q) > 0:
            if v >= q[0]:
                cnt += 1
            else:
                answer.append(cnt)
                cnt = 1
        else:
            answer.append(cnt)
    return answer

ํ…Œ์ŠคํŠธ 2,3,4,5,6,7,9,10์—์„œ ์‹คํŒจ ๋ฐœ์ƒ ์™œ์ง€ ?

 

์•„ ๋ฐ˜๋ก€ ์ฐพ์•˜์Œ

๐Ÿ—ฏ๏ธ ๋ฐ˜๋ก€) progresses : [40, 93, 30, 55, 60, 65], speeds : [60, 1, 30, 5 , 10, 7], return : [1,2,3]

 

์ด ๊ฒฝ์šฐ q = [1,7,3,9,4,5]

๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋Œ€๋กœํ•˜๋ฉด result = [1,2,2,1] ๋‚˜์˜ด

[9,4,5] ์—ฌ๊ธฐ์„œ 4๊ฐ€ 5๋ณด๋‹ค ์ž‘์œผ๋‹ˆ๊นŒ cnt = 1๋กœ ์ดˆ๊ธฐํ™” ํ•ด๋ฒ„๋ฆผ

 

์ฝ”๋“œ ์ˆ˜์ •

from collections import deque
def solution(progresses, speeds):
    answer = []
    cnt = 1
    q = deque()
    for i in range(len(progresses)):
        if (100-progresses[i]) % speeds[i] == 0:
            q.append((100-progresses[i]) // speeds[i])
        else:
            q.append((100-progresses[i]) // speeds[i] + 1)
    while q:
        v = q.popleft()
        lst = list(q)
        for i in lst:
            if v >= i:
                q.popleft()
                cnt += 1
            else:
                break
        answer.append(cnt)
        cnt = 1
    return answer

 

๋‹ค๋ฅธ ํ’€์ด

import math

def solution(progresses, speeds):
    progresses = [math.ceil((100 - a) / b) for a, b in zip(progresses, speeds)]
    answer = []
    front = 0, 0

    for idx in range(len(progresses)):
        if progresses[idx] > progresses[front]:  
            answer.append(idx - front)
            front = idx 
    answer.append(len(progresses) - front)  

    return answer
728x90