Algorithm Problem/Python

[python] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹จ์–ด ํผ์ฆ(2017 ํŒ์Šคํƒ€์šด)

deo2kim 2020. 9. 14. 09:36
๋ฐ˜์‘ํ˜•

๐Ÿค”๋ฌธ์ œ ํ•ด๊ฒฐ

Lv4 | ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

ํ’€์ด ๋ฐฉ๋ฒ•์€

  • ์•ž์—์„œ ๋ถ€ํ„ฐ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜ ์„ ํƒํ•œ๋‹ค. 'b', 'a', 'n', ...
  • ๊ทธ ๋ฌธ์ž๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด๊ฐ€ strs์— ๋“ค์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • ์žˆ์œผ๋ฉด ํ˜„์žฌ๊นŒ์ง€ ์ผ๋˜ ๋‹จ์–ด ๊ฐœ์ˆ˜(dp[i])์™€ ๊ทธ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋‹จ์–ด ๊ฐœ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ 
    (๋ง์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค...)
  • ["ba", "na", "n", "a"] ์™€ "banana"๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ฉด
  • ๋งจ์ฒ˜์Œ "b"๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด๋Š” ์—†์œผ๋ฏ€๋กœ pass
  • ๋‹ค์Œ "a"๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด๋Š” "a"์™€ "ba"๊ฐ€ ์žˆ๋‹ค. - "na"๋Š” ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์Œ
    "a"๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ๋Š” ์•„๋ฌด์ผ๋„ ์—†๋‹ค. why? ์ฒ˜์Œ์— b๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด๊ฐ€ ์—†์–ด์„œ ๊ฐ’์ด ๋ฌดํ•œ๋Œ€์ธ ์ƒํƒœ
    "ba"๋ฅผ ์„ ํƒํ•˜๋ฉด 1๋กœ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค. - (๋‹จ์–ด ํ•˜๋‚˜๋งŒ์œผ๋กœ "ba"๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๋œป)
  • ๋‹ค์Œ์€ "n"์œผ๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด "n"์ด ์žˆ๋‹ค. ๊ธฐ์กด์— "ba"๋ฅผ ๋งŒ๋“ค ๋•Œ ์ตœ์†Ÿ๊ฐ’(1๊ฐœ)๋กœ ๋งŒ๋“ค์—ˆ์œผ๋ฏ€๋กœ "n"์„ ์ถ”๊ฐ€ํ•ด์„œ 2๊ฐœ๋กœ "ban"์„ ๋งŒ๋“ ๋‹ค๋Š” ๋œป | ํ˜„์žฌ dp = [0, inf, 1, 2, ... | ๋งจ ์•ž์˜ 0์€ ๋ฌด์‹œ
  • ๋‹ค์Œ์€ "a"์œผ๋กœ ๋๋‚˜๋Š” ๋‹จ์–ด "a"์™€ "na"๊ฐ€ ์žˆ๋‹ค. - "ba"๋Š” ์กฐ๊ฑด์— ๋งž์ง€ ์•Š์Œ
    "a" ์„ ํƒ: ์•ž์—์„œ "ban"์„ ๋งŒ๋“ค ๋•Œ 2๊ฐœ(dp[3])๋ฅผ ์ผ๋‹ค. "a"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ์ด์ œ 3๊ฐœ dp = [0, inf, 1, 2, 3, ...
    "na" ์„ ํƒ: ์•ž์—์„œ "ba"๋ฅผ ๋งŒ๋“ค ๋•Œ 1๊ฐœ(dp[2])๋ฅผ ์ผ๋‹ค. "na"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ์ด์ œ 2๊ฐœ dp = [0, inf, 1, 2, 2, ...
  • ์ด๋ ‡๊ฒŒ ํ•˜๋‹ค๋ณด๋ฉด dp ๋งˆ์ง€๋ง‰์— ์ตœ์ข… ๊ฐœ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

 

๐Ÿ’จ DP๋Š” ์›๋ž˜ ์–ด๋ ค์šด๋ฐ Lv4๋ผ์„œ ๋” ์–ด๋ ค์šด๋“ฏํ•˜๋‹ค...

 

๐Ÿ’ป์†Œ์Šค ์ฝ”๋“œ

def solution(strs, t):
    n = len(t)
    dp = [0] * (n + 1)
    strs = set(strs)  # set์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ์ƒ‰ํ•  ๋•Œ ์‹œ๊ฐ„๋ณต์žก๋„ O(1)

    for i in range(1, n + 1):
        dp[i] = float('inf')  # i๋ฒˆ์งธ ์‹œ์ž‘์‹œ ์ตœ๋Œ“๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์คŒ(์ตœ์†Ÿ๊ฐ’ ๋น„๊ต๋ฅผ ์œ„ํ•ด)
        for k in range(1, 6):
            # ์ธ๋ฑ์Šค ๋ฒ”์œ„ ๋•Œ๋ฌธ์—..
            if i - k < 0:
                s = 0
            else:
                s = i - k
            if t[s:i] in strs:
                dp[i] = min(dp[i], dp[i - k] + 1)
    if dp[-1] == float('inf'):
        answer = -1
    else:
        answer = dp[-1]

    return answer

 

๐Ÿ“•๋ฌธ์ œ ํ™•์ธ

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

๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/12983

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋‹จ์–ด ํผ์ฆ

๋‹จ์–ด ํผ์ฆ์€ ์ฃผ์–ด์ง„ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์„ ์ด์šฉํ•ด์„œ ์ฃผ์–ด์ง„ ๋ฌธ์žฅ์„ ์™„์„ฑํ•˜๋Š” ํผ์ฆ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ, ์ฃผ์–ด์ง„ ๊ฐ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์€ ๊ฐ๊ฐ ๋ฌดํ•œ๊ฐœ์”ฉ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ๋‹จ์–ด ์กฐ๊ฐ์ด [โ€œbaโ€, โ€œna

programmers.co.kr


๋ฌธ์ œ ์„ค๋ช…

๋‹จ์–ด ํผ์ฆ์€ ์ฃผ์–ด์ง„ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์„ ์ด์šฉํ•ด์„œ ์ฃผ์–ด์ง„ ๋ฌธ์žฅ์„ ์™„์„ฑํ•˜๋Š” ํผ์ฆ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ, ์ฃผ์–ด์ง„ ๊ฐ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์€ ๊ฐ๊ฐ ๋ฌดํ•œ๊ฐœ์”ฉ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ๋‹จ์–ด ์กฐ๊ฐ์ด [โ€œbaโ€, โ€œnaโ€, โ€œnโ€, โ€œaโ€]์ธ ๊ฒฝ์šฐ ba, na, n, a ๋‹จ์–ด ์กฐ๊ฐ์ด ๊ฐ๊ฐ ๋ฌดํ•œ๊ฐœ์”ฉ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ, ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ๋ฌธ์žฅ์ด โ€œbananaโ€๋ผ๋ฉด โ€œbaโ€, โ€œnaโ€, โ€œnโ€, โ€œaโ€์˜ 4๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์žฅ์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, โ€œbaโ€, โ€œnaโ€, โ€œnaโ€์˜ 3๊ฐœ๋งŒ์„ ์‚ฌ์šฉํ•ด๋„ โ€œbananaโ€๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด strs์™€ ์™„์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์—ด t๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ฃผ์–ด์ง„ ๋ฌธ์žฅ์„ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋‹จ์–ด์กฐ๊ฐ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”. ๋งŒ์•ฝ ์ฃผ์–ด์ง„ ๋ฌธ์žฅ์„ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด -1์„ return ํ•˜์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • strs๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด๋กœ, ๊ธธ์ด๋Š” 1 ์ด์ƒ 100 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • strs์˜ ๊ฐ ์›์†Œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด์กฐ๊ฐ๋“ค์ด ์ค‘๋ณต ์—†์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์–ด ์กฐ๊ฐ๋“ค์€ ๋ฌธ์ž์—ด ํ˜•ํƒœ์ด๋ฉฐ, ๋ชจ๋“  ๋‹จ์–ด ์กฐ๊ฐ์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 5 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • t๋Š” ์™„์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์—ด์ด๋ฉฐ ๊ธธ์ด๋Š” 1 ์ด์ƒ 20,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ฌธ์ž์—ด์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

strs t result
[ba,na,n,a] banana 3
[app,ap,p,l,e,ple,pp] apple 2
[ba,an,nan,ban,n] banana -1

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1
๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2
ap 1๊ฐœ, ple 1๊ฐœ์˜ ์ด 2๊ฐœ๋กœ apple์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•„์š”ํ•œ ๋‹จ์–ด ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์€ 2๋ฅผ return ํ•ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #3
์ฃผ์–ด์ง„ ๋‹จ์–ด๋กœ๋Š” banana๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฏ€๋กœ -1์„ return ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€์ˆ˜0