๐Ÿ“•Week1 day4(์ฝ”ํ…Œ ์—ฐ์Šต)

๋ฐ•์ค€ํฌยท2023๋…„ 8์›” 27์ผ

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

๋ชฉ๋ก ๋ณด๊ธฐ
7/28
post-thumbnail

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต๋ฌธ์ œ


ํž™(heap) - ๋” ๋งต๊ฒŒ

ํž™์€ ์ด์ง„ํŠธ๋ฆฌ์˜ ํ•œ ์ข…๋ฅ˜๋กœ ๋ฃจํŠธ๋…ธ๋“œ๊ฐ€ ์–ธ์ œ๋‚˜ ์ตœ๋Œ“๊ฐ’๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

day2์—์„œ ๋ฐฐ์šด ํž™์„ ์ด์šฉํ•œ ์ฝ”๋”ฉ๋ฌธ์ œ์—์š”!

๋งค์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Leo๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‘ ๊ฐœ์˜ ์Œ์‹์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ž์–ด ์ƒˆ๋กœ์šด ์Œ์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.(์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ‘์— ๋งํฌ์—!)
https://school.programmers.co.kr/learn/courses/30/lessons/42626

๋ฌธ์ œ ํ’€์ด

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ณต์žก๋„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ์„ ๋•Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ˆ˜ ๊ฐ€ ํ•˜๋‚˜ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ์„ž์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(n-1)
    ๊ฐ ๋‹จ๊ณ„(์„ž๋Š”์ผ)์—์„œ ์š”๊ตฌ๋˜๋Š” ๊ณ„์‚ฐ๋Ÿ‰์€ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์— ์ˆœ์„œ ๋งž์ถ”์–ด ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค. O(n)
    ์ด ๊ณ„์‚ฐ๋Ÿ‰ O(n^2)

๋ณด๋‹ค ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด ํž™ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

import heapq as hq

def solution(scoville, K):

    hq.heapify(scoville)#ํž™ ์ƒ์„ฑ
    answer = 0
    while True:
        first = hq.heappop(scoville)#ํž™์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ๊บผ๋ƒ„
        if first >= K:#K๋ณด๋‹ค ํฌ๋ฉด ๋ฐ˜๋ณต๋ฌธ ์ข…๋ฃŒ
            break
        if len(scoville) == 0:#ํž™ ์•ˆ์˜ ์›์†Œ ๋‹ค ์„ž์—ˆ์„ ๋•Œ๋„ ์•ˆ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉด -1๋ฐ˜ํ™˜
            return -1
        second = hq.heappop(scoville)
        hq.heappush(scoville, first + second*2)
        answer += 1#์„ž์„ ๋•Œ๋งˆ๋‹ค +1

    return answer

๋™์ ๊ณ„ํš๋ฒ•(Dynamic Programming) - N์œผ๋กœ ํ‘œํ˜„


๋™์ ๊ณ„ํš๋ฒ•์ด๋ž€ ์ฃผ์–ด์ง„ ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ ์šด ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ’€์–ด ์ด ํ•ด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์ด๋ฃจ๋Š” ๋ฐฉ์‹

๐Ÿ“’๋™์ ๊ณ„ํš๋ฒ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ง„ํ–‰์— ๋”ฐ๋ผ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๋ฒ”์œ„๋ฅผ ๋™์ ์œผ๋กœ ๊ฒฐ์ •ํ•จ์œผ๋กœ์จ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œํ’€์ด

์•„๋ž˜์™€ ๊ฐ™์ด 5์™€ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ์œผ๋กœ 12๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5๋ฅผ ์‚ฌ์šฉํ•œ ํšŸ์ˆ˜๋Š” ๊ฐ๊ฐ 6,5,4 ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ๋Š” 4์ž…๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ์ˆซ์ž N๊ณผ number๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, N๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ N ์‚ฌ์šฉํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ‘์— ๋งํฌ์—
https://school.programmers.co.kr/learn/courses/30/lessons/42895

def solution(N, number):
    s = [set() for x in range(8)]#์ˆซ์ž ์‚ฌ์šฉํšŸ์ˆ˜ ์ตœ๋Œ€ 8๋ฒˆ
    for i, x in enumerate(s, start=1):
        x.add(int(str(N)*i))
    for i in range(len(s)):#i=0์ผ ๋•Œ๋Š” N์„ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์น™์—ฐ์‚ฐ์„ ์ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
        for j in range(i):
            for op1 in s[j]:
                for op2 in s[i-j-1]:
                    s[i].add(op1+op2)
                    s[i].add(op1-op2)
                    s[i].add(op1*op2)
                    if op2!=0:
                        s[i].add(op1//op2)
        if number in s[i]:#๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•œ set์—์„œ number์ด ์กด์žฌํ•˜๋ฉด i+1
            answer = i+1
            break
    else:#์—†์œผ๋ฉด -1๋ฐ˜ํ™˜
        answer = -1
    return answer

ํ•œ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํ†ตํ•ด 2๋ฒˆ ๋ฐ˜๋ณตํ–ˆ์„ ๋•Œ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜, ์ด๊ฑธ ์ ์  ๋Š˜๋ ค๋‚˜๊ฐ€๋ฉฐ N๋ฒˆ ๋ฐ˜๋ณตํ–ˆ์„ ๋•Œ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ set์„ ํ†ตํ•ด ์ค‘๋ณต ์—†์ด ์ €์žฅํ•œ ํ›„์— number์ด ์กด์žฌํ•˜๋ฉด ๋ฐ˜ํ™˜์„ ํ•˜๊ณ  ์—†์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

DFS/BFS - ์—ฌํ–‰๊ฒฝ๋กœ


DFS ํ•œ ์ •์ ์—์„œ ์ธ์ ‘ํ•œ(์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€)์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๋˜, ๊ฐ ์ธ์ ‘ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์„ ๋๋‚ธ ํ›„ ๋‹ค์Œ ์ •์ ์„ ์ง„ํ–‰

BFS ํ•œ ์ •์ ์—์„œ ์ธ์ ‘ํ•œ(์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€)์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๊ณ , ๋ฐฉ๋ฌธํ•œ ๊ฐ ์ธ์ ‘ ์ •์ ์„ ๊ธฐ์ค€์œผ๋กœ(๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ_ ๋˜ ๋‹ค์‹œ ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์„ ํ–‰ํ•จ

๋ฌธ์ œํ’€์ด

์ฃผ์–ด์ง„ ํ•ญ๊ณต๊ถŒ์„ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์—ฌํ–‰๊ฒฝ๋กœ๋ฅผ ์งœ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ "ICN" ๊ณตํ•ญ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๊ณต๊ถŒ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด tickets๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณตํ•ญ ๊ฒฝ๋กœ๋ฅผ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ‘์— ๋งํฌ์—
https://school.programmers.co.kr/learn/courses/30/lessons/43164

def solution(tickets):
    routes = {}
    for t in tickets:
        routes[t[0]] = routes.get(t[0],[])+[t[1]]
    for r in routes:
        routes[r].sort(reverse = True)
    stack = ["ICN"]
    path = []
    while len(stack) >0:
        top =stack[-1]
        if top not in routes or len(routes[top])==0:#๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณตํ•ญ์ด ์—†๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๊ทธ ํ‘œ๋ฅผ ๋‹ค ์ผ์„ ๊ฒฝ์šฐ
            path.append(stack.pop())
        else:
            stack.append(routes[top][-1])
            routes[top] = routes[top][:-1]
    return path[::-1]#์—ญ์ˆœ์œผ๋กœ ์ถœ๋ ฅ

๐Ÿ’ก์ฒซ ๋ฒˆ์งธ ํž™์„ ์ด์šฉํ•œ "๋” ๋งต๊ฒŒ"๋ฌธ์ œ์—์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ์ž‘์„ฑํ–ˆ์„ ๋•Œ ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์—ฐ์‚ฐ์—์„œ O(n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ํž™์„ ์ด์šฉํ–ˆ์„ ๋•Œ ํž™์˜ push๋Š” O(logn)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ ธ ๋” ์‹œ๊ฐ„์ ์ธ ํšจ์œจ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

profile
๊ฒŒ์„๋ €๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณต๋ถ€

0๊ฐœ์˜ ๋Œ“๊ธ€