Skip to content

jonghoonok/Algorithm_Study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

127 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Algorithm

๊ธฐ์ดˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ถ€ํ„ฐ ์‹ฌํ™”๊นŒ์ง€ ์ด๋ก  ์ •๋ฆฌ ๋ฐ ๋ฌธ์ œ ํ’€์ด๋ฅผ ์—…๋กœ๋“œํ•˜๋Š” ์ €์žฅ์†Œ

์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋Š” Leet Code๋ฌธ์ œ

๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋ฐฑ์ค€ ๋ฌธ์ œ์ด๋‹ค. (G4_5052_์ „ํ™”๋ฒˆํ˜ธ๋ชฉ๋ก์€ Gold4 ๋ ˆ๋ฒจ์˜ 5052๋ฒˆ ๋ฌธ์ œ๋ผ๋Š” ๋œป)

์ฐธ๊ณ ์ž๋ฃŒ

  • ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ - ๋‚˜๋™๋นˆ
  • ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ - ๋ฐ•์ƒ๊ธธ
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ ์ „๋žต - ๊ตฌ์ข…๋งŒ

[TOC]

0. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ํŽธ๋ฆฌํ•œ ๋ฌธ๋ฒ•

1. Python

์ž…์ถœ๋ ฅ

  • ์ž…๋ ฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ sys.stdin.readline() ์ด์šฉ
    • input() ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ
    • split() ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ค๋ฅธ์ชฝ์— ์ค„ ๋ฐ”๊ฟˆ ๊ธฐํ˜ธ๊ฐ€ ๋‚จ์œผ๋‹ˆ sys.stdin.readline().rstrip() ํ•„์š”

ํŒŒ์ด์ฌ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๊ด€๋ จ ํ•จ์ˆ˜

  • ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์ž
    • string.upper() : ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
    • string.lower() : ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
  • ๋ฌธ์ž ํŒ๋…
    • char.isalnum() : char๊ฐ€ ์˜๋ฌธ์ž ํ˜น์€ ์ˆซ์ž์ผ ๊ฒฝ์šฐ True, ์•„๋‹ˆ๋ฉด False ๋ฐ˜ํ™˜
    • char.isdigit() : ์ˆซ์ž๋ฉด True
  • ๋ฌธ์ž์—ด ๋ฐ”๊พธ๊ธฐ
    • string.replace(string1, string2) : ๋ฌธ์ž์—ด ๋‚ด์˜ ๋ฌธ์ž์—ด1์„ ๋ฌธ์ž์—ด2๋กœ ๋ณ€ํ™˜
    • ์ผ๋ถ€ ๊ธ€์ž๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ , ๊ณต๋ฐฑ์„ ์—†์• ๋Š” ๋ฐ ํŽธ๋ฆฌํ•จ
    • ๋ณ€ํ™˜ํ•˜๋ฉด string์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ๋ฆฌํ„ดํ•จ
  • ๋ฌธ์ž์—ด ์ฐพ๊ธฐ
    • string.find(word) : ์ฐพ๋Š” ๋ฌธ์ž์—ด์ด ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ์œ„์น˜ ๋ฆฌํ„ด, ์—†์œผ๋ฉด -1 ๋ฆฌํ„ด
    • string.count(word) : ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ฆฌํ„ด
  • ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ
    • string[start:end] : start์—์„œ end-1๋ฒˆ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ถ”์ถœ
    • string[::2] (2๊ฐœ์”ฉ ๊ฑด๋„ˆ๋›ฐ๋ฉฐ ์ถ”์ถœ), string[::-1] (๋’ค์—์„œ๋ถ€ํ„ฐ ์ถœ๋ ฅ)
  • ๋ฌธ์ž์—ด ๋ถ„๋ฆฌ, ๊ฒฐํ•ฉ
    • string.split(word) : word๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌ
    • "word".join(string) : string์˜ ๊ฐ ์›์†Œ ์‚ฌ์ด์— word๋ฅผ ์‚ฝ์ž…
  • ๋ฌธ์ž์—ด ๊ณต๋ฐฑ ์ œ๊ฑฐ
    • string.strip() : ์–‘์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ
    • string.lstrip() : ์™ผ์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ
    • string.rstrip() : ์˜ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ œ๊ฑฐ
    • string.strip(letter) : ์–‘์ชฝ์—์„œ letter๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ œ๊ฑฐ
    • string.lstrip(letter) : ์™ผ์ชฝ์—์„œ letter๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ œ๊ฑฐ
    • string.rstrip(letter) : ์˜ค๋ฅธ์ชฝ์—์„œ letter๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ œ๊ฑฐ
    • string.strip(ab) : ์–‘์ชฝ์—์„œ a ๋˜๋Š” b๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ์ œ๊ฑฐ
  • ์•„์Šคํ‚ค ์ฝ”๋“œ ๊ด€๋ จ
    • chr(num) : ์•„์Šคํ‚ค ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅ
    • ord(letter) : ๋ฌธ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์•„์Šคํ‚ค ์ฝ”๋“œ๋ฅผ ์ถœ๋ ฅ

๋ฆฌ์ŠคํŠธ ๊ด€๋ จ ํ•จ์ˆ˜

  • list.reverse() : ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘์–ด์คŒ
    • ๋ฆฌํ„ด ๊ฐ’ ์—†์ด ๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๊ณ , ์›์†Œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ
    • list[::-1] ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”๋ฐ, ์ด ์ชฝ์ด ๋น ๋ฅด๋‹ค๊ณ  ํ•จ
  • list.insert(index, x) : list ๋ฆฌ์ŠคํŠธ์˜ index์— x๋ฅผ ์‚ฝ์ž…ํ•จ
  • del list[index] : list ๋ฆฌ์ŠคํŠธ์˜ index๋ฒˆ ์งธ ์›์†Œ๋ฅผ ์‚ญ์ œํ•จ
  • ๋ฆฌ์ŠคํŠธ๋„ enumerate๋ฅผ ์ง€์›ํ•จ
    • for i, n in enumerate(list) ํ•˜๋ฉด ์•ž์€ ์ธ๋ฑ์Šค, ๋’ค๋Š” ๊ฐ’์ด ๋จ

๋”•์…”๋„ˆ๋ฆฌ ๊ด€๋ จ

  • defaultdict

    • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ ๋”•์…”๋„ˆ๋ฆฌ ์•„์ดํ…œ์„ "๊ธฐ๋ณธ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ " ์ƒ์„ฑํ•จ
      • ์ผ๋ฐ˜ ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ˜ํ™˜

      • ๊ธฐ๋ณธ๊ฐ’์€ int ๊ธฐ์ค€ 0์ž„

      • counts = collections.defaultdict(int)
        for word in words:
            counts[word] += 1
  • Counter

    • ์•„์ดํ…œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด ๋”•์…”๋„ˆ๋ฆฌ๋กœ ๋ฆฌํ„ดํ•จ

    • a = [1, 2, 3, 4, 5, 5, 5, 6, 6]
      b = collections.Counter(a)
      # b๋Š” {5: 3, 6: 2, 1: 1, 2: 1, 3: 1, 4: 1}
    • b.most_common(2)๋ฅผ ํ•˜๋ฉด b์—์„œ ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ 2๊ฐœ์˜ ์š”์†Œ (5, 3), (6, 2)๋ฅผ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•จ

  • get()

    • key๋ฅผ ์ด์šฉํ•˜์—ฌ value๋ฅผ ์–ป์Œ
    • key๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ None์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Œ
  • values()

    • ๋”•์…”๋„ˆ๋ฆฌ์˜ ๊ฐ’๋“ค์„ ๋ฌถ์–ด์„œ ๋ฐ˜ํ™˜
    • list() ์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ํ•จ์ˆ˜

  • max()

    • key์— ๋“ค์–ด๊ฐ€๋Š” ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
    • ์˜ˆ) max([1, 0, -2, 3, -5], key=abs) : ์ ˆ๋Œ“๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— -5๊ฐ€ ๋‚˜์˜ด
    • ์˜ˆ2) max(counts, key=counts.get) : ๋”•์…”๋„ˆ๋ฆฌ counts ์ค‘ value๊ฐ€ ๊ฐ€์žฅ ํฐ ๊ฒƒ์˜ ํ‚ค๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
  • zip()

    • 2๊ฐœ ์ด์ƒ์˜ ์‹œํ€€์Šค๋ฅผ ์งง์€ ๊ธธ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ 1๋Œ€1 ๋Œ€์‘ํ•˜๋Š” ํŠœํ”Œ ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค์–ด์คŒ

    • ์˜ˆ์‹œ

      • a = [1, 2, 3, 4, 5]
        b = [2, 3, 4, 5]
        c = [3, 4, 5]
        
        # [(1, 2), (2, 3), (3, 4), (4, 5)]
        list(zip(a, b))
        
        # [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
        list(zip(a, b, c))
  • sort()

    • key ์ธ์ž์— ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•จ
    • ์˜ˆ์‹œ1) ๋‘๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ–๋Š” ํŠœํ”Œ๋“ค์„ 2๋ฒˆ์งธ ์›์†Œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
      • list.sort(key = lambda x : x[1])
    • ์˜ˆ์‹œ2) 2๋ฒˆ์งธ ์ดํ›„์˜ ์›์†Œ๋“ค๋งŒ ์ •๋ ฌํ•˜๋˜ ์ˆœ์„œ๊ฐ€ ๊ฐ™์œผ๋ฉด 1๋ฒˆ์งธ ์›์†Œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ
      • letters.sort(key = lambda x : (x.split()[1:], x.split()[0]))
      • ์œ„์™€ ๊ฐ™์ด ์ •๋ ฌ์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ•„์š”ํ•˜๋ฉด ํŠœํ”Œ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • Asterisk

    • Unpack์„ ํ•ด ์ฃผ๋Š” ์—ฐ์‚ฐ์ž
    • ์˜ˆ์‹œ
      • print(*fruits) ๋ฅผ ํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ fruits์— ์žˆ๋Š” ์›์†Œ๋“ค์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•œ ๋ฒˆ์— ์ถœ๋ ฅ
      • list(zip(*collections.Counter(nums).most_common(k))) : ํŠœํ”Œ์ด ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” most_common ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์„ zip์œผ๋กœ ๋ฌถ์œผ๋ฉด ํŠœํ”Œ ๋‚ด๋ถ€์˜ ๊ฐ’๋ผ๋ฆฌ ๋ฌถ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠœํ”Œ์ด ํ†ต์œผ๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์–ด unpack์„ ํ•ด์ค€ ํ›„์— ๋ฌถ์Œ

1. ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

  • ๊ฐ ๋‹จ๊ณ„์—์„œ ๋กœ์ปฌ ์ตœ์ ์˜ ์„ ํƒ์„ ํ•˜์—ฌ ๊ธ€๋กœ๋ฒŒ ์ตœ์ ์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํ•ด๊ฒฐ๋ฒ•
  • ์ตœ์ ํ•ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ์–ด๋А ์ •๋„ ๊ดœ์ฐฎ์€ ํ•ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

  • ํƒ์š• ์„ ํƒ ์†์„ฑ์„ ๊ฐ€์ง
    • ์•ž์˜ ์„ ํƒ์ด ์ดํ›„ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ
  • ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ
    • ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋ถ€๋ถ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ
    • DP๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋„ ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง

DP์™€์˜ ๋น„๊ต

  • DP๋Š” ํ•˜์œ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด๋ฅผ ์ฐพ์•„ ์ด๋ฅผ ๊ฒฐํ•ฉํ•ด Globally Optimum Solution์„ ์ฐพ์Œ
  • ๊ทธ๋ฆฌ๋””๋Š” ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๋กœ์ปฌ ์ตœ์ ํ•ด๋ฅผ ์ฐพ์•„ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ์ค„์—ฌ๋‚˜๊ฐ

1.1. ๋ฐฐ๋‚ญ ๋ฌธ์ œ

๋ฐฐ๋‚ญ์— ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ •ํ•ด์ ธ ์žˆ๊ณ , ์ง์˜ ๊ฐ€์น˜์™€ ๋ฌด๊ฒŒ๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ๋ฐฐ๋‚ญ์— ๋‹ด๊ธด ์ง์˜ ๊ฐ€์น˜๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๋ ค๋ฉด?

๋ฐฐ๋‚ญ ๋ฌธ์ œ๋Š” ์ง์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฆฌ๋””๋กœ, ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ DP๋กœ ํ•ด๊ฒฐํ•œ๋‹ค

  • ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
    • ๋‹จ์œ„ ๋ฌด๊ฒŒ ๋‹น ๊ฐ€์น˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ง๋ถ€ํ„ฐ ๋ฐฐ๋‚ญ์— ๋„ฃ์Œ
  • ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

1.2. ๋™์ „ ๋ฐ”๊พธ๊ธฐ ๋ฌธ์ œ

๋™์ „์„ ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ์•ก์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

๋ฐฑ์ค€ 11047๋ฒˆ

2. ํƒ์ƒ‰

2.1. ์ˆœ์ฐจ ํƒ์ƒ‰

๋ณด์ดˆ๋ฒ•

ํˆฌ ํฌ์ธํ„ฐ

์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฐพ์Œ

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

๊ณ ์ • ์‚ฌ์ด์ฆˆ ์œˆ๋„์šฐ๋ฅผ ์ด๋™์‹œํ‚ค๋ฉฐ ํƒ์ƒ‰

์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

2.2. DFS

๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰

DFS๋ž€?

  • ์Šคํƒ์„ ์ด์šฉํ•˜์—ฌ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰
    • ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐฉ๋ฌธํ•จ
    • ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด(์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์ด๋ฉด), ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋…ธ๋“œ๋กœ ๋Œ์•„๊ฐ
    • ์ฒ˜์Œ ์ถœ๋ฐœํ•œ ์œ„์น˜์—์„œ ํƒ์ƒ‰ ์ข…๋ฃŒ
  • ๋ฐฉ๋ฌธ์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ ์Šคํƒ์— ๋…ธ๋“œ๋ฅผ ์‚ฝ์ž…-์‚ญ์ œํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•จ์œผ๋กœ์จ ๊ตฌํ˜„

๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ†ตํ•ด ๋›ฐ์–ด๋‚œ ํšจ์šฉ์„ ๋ณด์ž„

์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•œ DFS

def recursive_dfs(v, visited):
    visited.append(v)
    for w in graph[v]:
        if w not in visited:
            recursive_dfs(w, visited)
    return visited

๋ฐ˜๋ณต์œผ๋กœ ๊ตฌํ˜„ํ•œ DFS

def iterative_dfs(v):
    visited = []
    stack = [v]
    while stack:
        t = stack.pop()
        if t not in visited:
            visited.append(t)
            for w in graph[t]:
                stack.append(w)
    return visited

Backtracking

ํ•ด๊ฒฐ์ฑ…์— ๋Œ€ํ•œ ํ›„๋ณด๋ฅผ ์Œ“์•„๊ฐ€๋‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ์ฆ‰์‹œ ํ›„๋ณด๋ฅผ ํฌ๊ธฐ(backtrack)

ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๊ฐ€์ง€์น˜๊ธฐ(pruning)๋ผ ํ•จ

2.3. BFS

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰

BFS๋ž€?

  • ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถœ๋ฐœ์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€๊นŒ์šด ์ˆœ์„œ๋Œ€๋กœ ํƒ์ƒ‰
    • ์ž์‹ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ํ์— ์‚ฝ์ž…ํ•จ
    • ํ์—์„œ ์ถ”์ถœํ•œ ๋…ธ๋“œ๋ฅผ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐฉ๋ฌธํ•จ
    • ๋” ์ด์ƒ ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด(ํ๊ฐ€ ๋น„๋ฉด) ํƒ์ƒ‰ ์ข…๋ฃŒ

์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋จ

ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

def iterative_bfs(v):
    visited = [v]
    queue = [v]
    while queue:
        # ํŒŒ์ด์ฌ์œผ๋กœ ํ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋‹ˆ ๋ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ ์ด์šฉ
        t = queue.pop(0)
        for w in graph[t]:
            if w not in visited:
	            visited.append(w)
    	        queue.append(w)
    return visited

2.4. ์ด์ง„ ํƒ์ƒ‰

์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ˆ๋ฐ˜์”ฉ ์ขํ˜€๊ฐ€๋ฉฐ ํƒ์ƒ‰

O(logN)

์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

def binary_search(arr, target):
    def search(left, right):
        if left > right:
            return -1
        
        mid = (left+right)//2
        if target < arr[mid]:
            return search(left. mid-1)
        elif target > arr[mid]:
            return search(mid+1, right)
        else:
            return mid
    
    return search(0, len(arr)-1)

๋ฐ˜๋ณต์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„

def binary_search(arr, target):
    n = len(arr)
    l, r = 0, n-1
    while l <= r:
        mid = (l + r) // 2
        if target < arr[mid]:
            r = mid-1
        elif target > arr[mid]:
            l = mid+1
        else:
            return mid
    return -1

ํŒŒ์ด์ฌ์—์„œ๋Š” ๊ทธ๋ƒฅ ๋ชจ๋“ˆ์„ ์“ฐ์ž

2.5. ๋ณด๊ฐ„ ํƒ์ƒ‰

๋ณด๊ฐ„ ํƒ์ƒ‰์ด๋ž€?

  • ํƒ์ƒ‰ ๋Œ€์ƒ์˜ ์‹œ์ž‘๊ณผ ๋ ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋น„๋ก€์‹์„ ๊ตฌ์„ฑํ•ด ํƒ์ƒ‰ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹

    • ์ด์ง„ ํƒ์ƒ‰์€ ๋ฌด์กฐ๊ฑด ์ค‘์•™์— ์œ„์น˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ : ๋ ์ชฝ์— ์น˜์šฐ์นœ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰์— ๋น„ํšจ์œจ ๋ฐœ์ƒ
  • ๋ณด๊ฐ„ ํƒ์ƒ‰ํ•  ์ธ๋ฑ์Šค์˜ ๊ณ„์‚ฐ

    • target๊ฐ’-์‹œ์ž‘ ๊ฐ’ ์ฐจ์ด vs ์‹œ์ž‘ ๊ฐ’-๋ ๊ฐ’ ์ฐจ์ด์˜ ๋น„์œจ์ด ์ „์ฒด ๊ธธ์ด์—์„œ target ์ธ๋ฑ์Šค ๊ธธ์ด๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ

    • $$ s = {target - arr[low] \over arr[high] - arr[low]}(high - low) + low $$

๋ณด๊ฐ„ ํƒ์ƒ‰์˜ ๊ตฌํ˜„

  • ์ด์ง„ ํƒ์ƒ‰๊ณผ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋˜ ํƒ์ƒ‰ํ•  ์ธ๋ฑ์Šค mid๋ฅผ ์œ„ ์ˆ˜์‹์„ ์ด์šฉํ•˜์—ฌ ์„ค์ •ํ•˜๋ฉด ๋จ
  • ํƒˆ์ถœ ์กฐ๊ฑด์˜ ์„ค์ •
    • ์ด์ง„ ํƒ์ƒ‰์ฒ˜๋Ÿผ if(left > right)๋ฅผ ์ด์šฉํ•ด์„œ๋Š” ์•ˆ ๋จ
      • mid๊ฐ’์ด left~right๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚จ์— ๋”ฐ๋ผ ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ์Œ
    • if(arr[left] > target || arr[right] < target)๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ
      • ์กฐ๊ธˆ ๋” ๋„“์€ ์กฐ๊ฑด์„ ์„ค์ •
      • "ํƒ์ƒ‰ ๋Œ€์ƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํƒ์ƒ‰ ๋Œ€์ƒ์˜ ๊ฐ’์€ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค"

3. ์ •๋ ฌ

3.1. O(N^2)

์‹ค๋ฌด์—์„œ ์“ธ ์ผ์€ ์—†์ง€๋งŒ...

3.1.1. Bubble Sort

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ž„ ๊ฒƒ๋„ ์—†๋‹ค. ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•ด์„œ ํฌ๋ฉด ๋’ค๋กœ ๋„˜๊ธด๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

for i in range(n):					# ๋ฐ˜๋ณต ํšŸ์ˆ˜
    for j in range(n-i-1):			# i๋ฒˆ์งธ ๋ฐ˜๋ณต์ผ ๋•Œ ๋’ค์—์„œ i๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€๋Š” ์ •๋ ฌ๋˜์–ด ์žˆ์Œ
        if arr[j] > arr[j+1]:
            arr[j], arr[j+1] = arr[j+1], arr[j]

์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ์—๋„(์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ) n*(n-1)/2๋ฒˆ ์—ฐ์‚ฐํ•ด์•ผ ํ•จ
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ(์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ) ๋งจ ์•„๋ž˜ swap์—ฐ์‚ฐ์„ ๋ชจ๋‘ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ตœ์„ ์˜ ๊ฒฝ์šฐ์˜ ์ƒ์ˆ˜๋ฐฐ์ด๊ธฐ ๋•Œ๋ฌธ์— O(n^2)

3.1.2. Selection Sort

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๋ฐฐ์—ด ๋‚ด ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ๊ณ 
  2. ํ•ด๋‹น ์›์†Œ๋ฅผ ์ œ์ผ ์•ž์— ์žˆ๋Š” ์›์†Œ์™€ swapํ•œ ํ›„ ๋‹ค์‹œ ๋ฐ˜๋ณต

์ œ์ผ ํฐ ์›์†Œ๋ฅผ ๋งจ ๋’ค๋กœ ์ด๋™์‹œํ‚ค๋Š” bubble sort์™€ ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

for i in range(len(arr)-1):
    # ๋ฐฐ์—ด ๋‚ด์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ์ฐพ์•„์„œ ์ธ๋ฑ์Šค i์— ์ €์žฅ
    minId = i
    for j in range(i+1, len(arr)):
        if arr[j] < arr[minId]:
            minId = j
    # ์ฐพ์•˜์œผ๋ฉด (for๋ฌธ์ด ๋๋‚ฌ์œผ๋ฉด) ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ˆ˜ ์ค‘์— ์ œ์ผ ์•ž์˜ ์ˆ˜์™€ swap
    arr[minId], arr[i] = arr[i], arr[minId]

3.1.3. Insertion Sort

์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋Š” O(N)์— ๋๋‚˜๋Š” ์ •๋ ฌ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ •๋ ฌ ์•ˆ ๋œ ๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ๋œ ๋ถ€๋ถ„์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ

  1. ๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ๋‹ค์Œ์„ ๋ฐ˜๋ณต
  2. ์ž์‹ ์˜ ์•ž์— ์žˆ๋Š” ์›์†Œ๋“ค๊ณผ ํ•˜๋‚˜์”ฉ ๋น„๊ตํ•˜์—ฌ, ์ž์‹ ์ด ์ž‘์œผ๋ฉด ์•ž์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฉˆ์ถค
    • ์ œ์ผ ์ž‘์€ ์ˆ˜๋Š” ๋งจ ์•ž์œผ๋กœ ์ด๋™ํ•˜๋Š” ์‹์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

# ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋Š” ๋†”๋‘๊ณ  ๋‘ ๋ฒˆ์งธ ์›์†Œ๋ถ€ํ„ฐ ์‹œ์ž‘
for i in range(1, len(arr)):
    # ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ์›์†Œ arr[i]๋ฅผ ์•ž์— ์žˆ๋Š” ์ˆ˜๋“ค๊ณผ ๋น„๊ต
    for j in range(i, 0, -1):
        # ์•ž์˜ ์ˆ˜๊ฐ€ ๋” ์ž‘๋‹ค๋ฉด swapํ•˜์—ฌ ์•ž์œผ๋กœ ์ด๋™, ์•„๋‹ˆ๋ฉด stop
        if arr[j] < arr[j-1]:
            arr[j], arr[j-1] = arr[j-1], arr[j]
        else:
            break

์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ(์ด๋ฏธ ์ •๋ ฌ๋จ) ์•ˆ์ชฝ์˜ for๋ฌธ์—์„œ ํ•ญ์ƒ break๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์œผ๋กœ ๋๋‚จ
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ •๋ ฌ๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ O(n^2)๋ฅผ ์†Œ๋ชจํ•จ

3.2. O(NlogN)

3.2.1. Quick Sort

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ‰๊ท ์ ์œผ๋กœ O(NlogN)์ด์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2)

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟˆ
    • ๊ธฐ์ค€์„ ์ •ํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ Hoare Partition, Lumoto Partition์ด ์กด์žฌ
    • Hoare๋Š” ๋งจ ์•ž์„, Lumoto๋Š” ๋งจ ๋’ค๋ฅผ pivot์œผ๋กœ ์„ค์ •
    • ํ”ผ๋ฒ—์ด ์ œ์ผ ์ž‘์€ ๊ฐ’ or ์ œ์ผ ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„์œผ๋กœ ์„ค์ •ํ•ด์ค˜์•ผ ํ•จ
      • ๋‚œ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์„ค์ •ํ•˜๊ฑฐ๋‚˜(๋ถˆ์•ˆ์ •) ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ๊ฐ€์šด๋ฐ ์ค‘ ์ค‘์•™๊ฐ’์„ ์ด์šฉํ•ด์„œ ์„ค์ • ๊ฐ€๋Šฅ(์•ˆ์ •)
  • Hoare๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ ฌํ•จ
  1. i=1, j=len(n)-1๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐ๊ฐ ์˜ค๋ฅธ์ชฝ๊ณผ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด์„œ pivot๊ณผ ๋น„๊ต
    • pivot๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์™ผ์ชฝ์—, ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜์‹œํ‚ด
  2. i์™€ j๊ฐ€ ๊ต์ฐจ๋˜๋ฉด pivot๊ณผ j๋ฅผ swap
  3. ๋‹ค์Œ pivot์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ˜๋ณต

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

def quick_sort(arr, start, end):
    if start >= end:
        return
    
    pivot = start
    left = start + 1
    right = end

    while left <= right:
        # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„๋•Œ๊นŒ์ง€
        while left <= end and arr[left] <= arr[pivot]: left += 1
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„๋•Œ๊นŒ์ง€
        while right > start and arr[right] > arr[pivot]: right -= 1
        # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
        # left ์™ผ์ชฝ์œผ๋กœ๋Š” ์ „๋ถ€ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์Œ์ด ๋ณด์žฅ๋˜์ง€๋งŒ left๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์œผ๋ฏ€๋กœ
        if left > right:
            arr[pivot], arr[right] = arr[right], arr[pivot]
        # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
        else:
            arr[left], arr[right] = arr[right], arr[left]
    
    quick_sort(arr, start, right-1)
    quick_sort(arr, right+1, end)

3.2.2. Merge Sort

Stable sort๋กœ ์ตœ์„ ๊ณผ ์ตœ์•… ๋ชจ๋‘ O(nlogn)์˜ ์„ฑ๋Šฅ์„ ๋ณด์ž„

๋ถ„ํ•  ์ •๋ณต์˜ ์ง„์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๋ฐฐ์—ด์„ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„(1๊ฐœ์”ฉ)๊นŒ์ง€ ์ชผ๊ฐ ๋‹ค
  2. ์ž‘์€ ๋ฐฐ์—ด์€ ์ •๋ ฌํ•œ ํ›„ 2๊ฐœ์”ฉ ๋ณ‘ํ•ฉํ•˜๋ฉด์„œ ๋‹ค์‹œ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•œ๋‹ค
  3. ์›๋ž˜ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์›๋ž˜ ๋ฐฐ์—ด์„ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

def merge_sort(list):
    if len(list) <= 1:
        return list
    
    mid = len(list) // 2
    leftList = list[:mid]
    rightList = list[mid:]
    
    # ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์„ ๊ฐ๊ฐ ์ •๋ ฌํ•œ ํ›„ ๋ณ‘ํ•ฉ
    leftList = merge_sort(leftList)
    rightList = merge_sort(rightList)
    return merge(leftList, rightList)

def merge(left, right):
    result = []
    while len(left) > 0 or len(right) > 0:
        if len(left) > 0 and len(right) > 0:
            if left[0] <= right[0]:
                result.append(left[0])
                left = left[1:]
            else:
                result.append(right[0])
                right = right[1:]
        elif len(left) > 0:
            result.append(left[0])
            left = left[1:]
        elif len(right) > 0:
            result.append(right[0])
            right = right[1:]
    return result

3.3. ๊ธฐํƒ€ ์ •๋ ฌ

์ƒํ™ฉ์— ๋”ฐ๋ผ O(NlogN)๋ณด๋‹ค ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์ƒํ™ฉ์„ ๊ธฐ์–ตํ•ด๋’€๋‹ค ํ™œ์šฉํ•˜์ž

3.3.1. Count Sort

O(N+K)์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ€๊ฐ’์ด ๋„ˆ๋ฌด ํฌ์ง€๋งŒ ์•Š์œผ๋ฉด ๋Œ€๊ฐœ์˜ ๊ฒฝ์šฐ ์•„์ฃผ ๋น ๋ฆ„

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

๋ฐ์ดํ„ฐ์˜ ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ ์”ฉ๋งŒ ์ฑ„์›€

๋ฐฐ์—ด์„ ์„ ์–ธ โ†’ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•ด๋‹น ์ˆซ์ž์™€ ๊ฐ™์€ ์ธ๋ฑ์Šค์˜ ๋ฐฐ์—ด์˜ ๊ฐ’์„ 1์”ฉ ์ถ”๊ฐ€ํ•œ๋‹ค โ†’ ๋

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

# ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€ ๋ฒ”์œ„๋งŒํผ์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ๋ฐฐ์—ด ์„ ์–ธ
count = [0]*n

for i in range(len(arr)):
    count[arr[i]] += 1

for i in range(len(count)):
    for j in range(count[i]):
        print(i, end=' ')

3.3.2. Radix Sort

๋น„๊ต์—ฐ์‚ฐ ์—†์ด ์ •๋ ฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์ˆ˜ ์ •๋ ฌ์ด๋ž€?

  • ์ž๋ฆฟ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด
  • ์ž๋ฆฟ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ ํšจ์œจ์ด ์ข‹์Œ
    • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(kn), k๋Š” ๋ฐ์ดํ„ฐ์˜ ์ž๋ฆฟ์ˆ˜
    • ๋ฌธ์ž์—ด ์ •๋ ฌ ๋“ฑ์— ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ด ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ 
  • ์ข…๋ฅ˜
    • Least Significant Digit : ๋‚ฎ์€ ์ž๋ฆฟ์ˆ˜๋ถ€ํ„ฐ ์ •๋ ฌ
    • Most Significant Digit : ๋†’์€ ์ž๋ฆฟ์ˆ˜๋ถ€ํ„ฐ ์ •๋ ฌ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด(LSD ๊ธฐ์ค€)

  1. Radix(๊ธฐ์ˆ˜)์˜ ๊ฐฏ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ธธ์ด์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค
    • 10์ง„๋ฒ•์ด๋ฉด ๊ธธ์ด 10
  2. ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ˜„์žฌ ์ž๋ฆฟ์ˆ˜์˜ ์ˆซ์ž๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜์—ฌ ๋ฐฐ์—ด์— ์ €์žฅ
    • ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” Queue์—ฌ์•ผ ํ•จ : 14, 34๋ฉด ์ธ๋ฑ์Šค 4์— ๋‘ ์ˆซ์ž๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  3. ๋‹ค์Œ ์ž๋ฆฟ์ˆ˜๋กœ ์ด๋™ํ•˜์—ฌ ๋ฐฐ์—ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ธ ํ›„ 2๋ฅผ ๋ฐ˜๋ณต

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

buckets = [[] for _ in range(m)]			# m์ง„๋ฒ•

div = 1

for i in range(k):							# ๊ฐ€์žฅ ํฐ ์ˆ˜์˜ ๊ธธ์ด๊ฐ€ k์ผ ๋•Œ
    for j in range(n):						# ์ •๋ ฌํ•  ์ˆ˜์˜ ๊ฐฏ์ˆ˜
        radix = (arr[j]//div) % m			# j๋ฒˆ์งธ ์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ์ถ”์ถœ
    	buckets[radix].append(arr[j])		# ์ถ”์ถœํ•œ ์ˆซ์ž๋ฅผ ๊ทผ๊ฑฐ๋กœ ๋ฒ„ํ‚ท์— ๋ฐ์ดํ„ฐ ์ €์žฅ
    
    j = 0
    for k in range(m):
        while buckets[k]:					# ๋ฒ„ํ‚ท์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ arr๋กœ ์˜ฎ๊น€
            arr[j] = buckets[k].pop()
            j += 1
    
    div *= m								# ๋‹ค์Œ ์ž๋ฆฌ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜๋ˆ„๋Š” ์ˆ˜ ์ฆ๊ฐ€

4. DP

๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ๋‚˜์ค‘์— ํฐ ๋ฌธ์ œ์˜ ๊ฒฐ๊ณผ์™€ ํ•ฉํ•˜์—ฌ ํ’€์ด

์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ž€

  • ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๊ฐ€ ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด์˜ ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ
  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ๋Š” ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ค‘๋ณต๋œ ํ•˜์œ„ ๋ฌธ์ œ๋“ค๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค
    • ๋ถ„ํ•  ์ •๋ณต์œผ๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜์ง€๋Š” ์•Š์Œ
    • ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ์žˆ์Œ

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

  • ํ•˜ํ–ฅ์‹: ๋ฉ”๋ชจ์ด์ œ์ด์…˜

    • ํ•˜์œ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋‹ต์„ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด๊ฐ€๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

    • def fib(n):
          if n <= 1:
              return n
          if dp[n]:		# ํ•˜์œ„ ๋ฌธ์ œ ์ •๋‹ต์„ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ™•์ธ
              return dp[n]
          dp[n] = fib(n-1) + fib(n-2)
          return dp[n]
  • ์ƒํ–ฅ์‹: ํƒ€๋ทธ๋ ˆ์ด์…˜

    • ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๋จผ์ € ํ•ด๊ฒฐํ•˜๊ณ  ํฐ ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ๊ตฌํ•จ

    • ๋ฐ์ดํ„ฐ๋ฅผ ํ…Œ์ด๋ธ” ํ˜•ํƒœ๋กœ ๋งŒ๋“ ๋‹ค๋Š” ๋œป Tabulate

    • def fib(n):
          dp[0] = 0
          dp[1] = 1
          
          for i in range(2, n+1):
              # ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ •๋‹ต์„ ํ’€์–ด ๋‚˜๊ฐ
              dp[i] = dp[i-1] + dp[i-2]
          return dp[n]

4.1. LIS(Longest Increasing Subsequence)

์ˆ˜์—ด nums ๋‚ด ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด๋Š” ์–ผ๋งˆ์ธ๊ฐ€?

๋ฐฑ์ค€ 11053๋ฒˆ

๋‚˜๋ฌด์œ„ํ‚ค

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ์ˆ˜์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋Œ๋ฉด์„œ
  2. ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” nums[i]๋ณด๋‹ค ์ž‘์€ ๋™์‹œ์— LIS์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ์ธ ์ˆ˜๋ฅผ ์ฐพ์Œ
    • ์ˆœ์ฐจ์ ์œผ๋กœ ์ฐพ์œผ๋ฉด O(N^2), ์ด์ง„ ํƒ์ƒ‰ํ•˜๋ฉด O(NlogN)
    • ์ฐพ์•˜๋‹ค: ํ˜„์žฌ ๋ณด๊ณ  ์žˆ๋Š” ์ˆ˜๊ฐ€ LIS์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ๊ฐ€ ๋จ, LIS์˜ ๊ธธ์ด += 1
    • ๋ชป ์ฐพ์•˜๋‹ค
      • O(N^2): ์—…๋ฐ์ดํŠธ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฌด์‹œ
      • O(NlogN): ์—…๋ฐ์ดํŠธ ํ•„์š”(์ด์ง„ ํƒ์ƒ‰ ์œ„ํ•ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ ํ•ด์ค˜์•ผ)

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • O(N^2)์ธ ๋ฐฉ๋ฒ•

    • # nums[i]๋ฅผ ๋งˆ์ง€๋ง‰ ์›์†Œ๋กœ ํ•˜๋Š” '์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์—ด'์˜ ๊ธธ์ด๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด
      LIS = [0]*n
      for i in range(n):
          # nums[i]๋ณด๋‹ค ์ž‘์€ ์ˆ˜ ์ค‘์—, ์ฆ๊ฐ€ํ•˜๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ์ตœ๋Œ€๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” ์ธ๋ฑ์Šคj๋ฅผ ์ฐพ์Œ
          temp = 0
          for j in range(i):
              if nums[j] < nums[i] and LIS[j] > temp:
                  temp = LIS[j]
          LIS[i] = temp + 1
      
      # LIS๋ฐฐ์—ด ๋‚ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ์ข…๋ฃŒ
      print(max(LIS))
  • O(NlogN)์ธ ๋ฐฉ๋ฒ•

    • nums ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด๋“ค์„ ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•จ

      • ๋จผ์ € ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ธธ์ด ๋ณ„๋กœ, ํ•ด๋‹น ๊ธธ์ด์˜ ์ˆ˜์—ด ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด์„ ์ž‘์„ฑ
      • ๋ถ€๋ถ„์ˆ˜์—ด๋“ค์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ์ค‘ nums[i] ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ ์ˆ˜๋ฅผ ์ฐพ์Œ
      • ํ•ด๋‹น ์›์†Œ๋ฅผ nums[i]๋กœ ๊ฐฑ์‹ ํ•ด ์คŒ: ํ•ด๋‹น ๋ถ€๋ถ„์ˆ˜์—ด์ด ๋” ์ž‘์€ ์ˆ˜๋ฅผ ๋งˆ์ง€๋ง‰ ์›์†Œ๋กœ ๊ฐ€์ ธ์•ผ ๋” ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
      • ๋ถ€๋ถ„์ˆ˜์—ด๋“ค์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ํฌ๊ธฐ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋จ
    • # ์ด์ง„ํƒ์ƒ‰์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด LIS
      # ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋Š” ๋ถ€๋ถ„์ˆœ์—ด์˜ ๊ธธ์ด, ๋‘ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋Š” ํ•ด๋‹น ๋ถ€๋ถ„์ˆœ์—ด์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ
      LIS = [[1, nums[0]]]
      for i in range(1, n):
          # nums[i]๊ฐ€ LIS์—์„œ ๋ช‡ ๋ฒˆ ์งธ ์œ„์น˜๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ์ƒ‰  
          index = binary(LIS, 0, len(LIS)-1, nums[i])
          if index > len(LIS)-1:
              LIS.append([LIS[-1][0]+1, nums[i]])
          else:
              LIS[index] = [LIS[index][0], nums[i]]
      
      # LIS๋ฐฐ์—ด ๋‚ด์—์„œ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ์ข…๋ฃŒ
      print(LIS[-1][0])

4.2. LCS(Longest Common Subsequence)

๋‘ ์ˆ˜์—ด์˜ ๋ถ€๋ถ„์ˆ˜์—ด๋“ค์„ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ณตํ†ต์˜ ๋ถ€๋ถ„์ˆ˜์—ด์ด ๋˜๋Š” ๊ฒƒ ์ค‘์— ๊ฐ€์žฅ ๊ธด ๊ฒƒ์€?

๋ฐฑ์ค€ 9251๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

LCS

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

4.3. Palindrome

์•ž๋’ค๊ฐ€ ๋˜‘๊ฐ™์€ ์ „ํ™”๋ฒˆํ˜ธ

๋ฐฑ์ค€ 10942๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃจ๋ ค๋ฉด, ํ•ด๋‹น ์ˆ˜์—ด์˜ ์„ ๋‘์™€ ํ›„๋ฏธ๋Š” ๊ฐ™์€ ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค
  2. ์„ ๋‘์™€ ํ›„๋ฏธ๋ฅผ ์ œ์™ธํ•œ ๋‚ด๋ถ€์˜ ์ˆ˜์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃฌ๋‹ค๋ฉด ํ•ด๋‹น ์ˆ˜์—ด์€ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋‹ค

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. s๋ฒˆ์งธ ์ˆ˜์—์„œ e๋ฒˆ์งธ ์ˆ˜๊นŒ์ง€์˜ ์ˆ˜์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” N x N ๋ฐฐ์—ด์„ ์ž‘์„ฑ

  2. ๋จผ์ € ๊ธธ์ด 1์ธ ์ˆ˜์—ด์€ ๋ฌด์กฐ๊ฑด ํŒฐ๋ฆฐ๋“œ๋กฌ์ด๋ฏ€๋กœ, ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ดarr[i][i] = 1 ์ž…๋ ฅ

  3. ๊ธธ์ด 2๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆ˜์—ด์ด ํŒฐ๋ฆฐ๋“œ๋กฌ์ธ์ง€ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ฅผ ์ด์šฉ

    # ๋จผ์ € ๊ธธ์ด1 ํŒฐ๋ฆฐ๋“œ๋กฌ๊ณผ ๊ธธ์ด2 ํŒฐ๋ฆฐ๋“œ๋กฌ(์—ฐ์†ํ•œ ๋‘ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด)์— ๋Œ€ํ•ด dp์— True๋ฅผ ๊ธฐ๋ก
    for i in range(1, n+1):
        dp[i][i] = 1
        if nums[i-1] == nums[i]:
            dp[i-1][i] = 1
    
    # ๊ธธ์ด 3๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ๊ธฐ๋ก        
    for i in range(3, n+1):
        for j in range(1, n-i+2):
            # ์‹œ์ž‘๊ณผ ๋์ด ๊ฐ™๊ณ  ๊ทธ ๋‚ด๋ถ€๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์„ ์ด๋ฃฌ๋‹ค๋ฉด ํŒฐ๋ฆฐ๋“œ๋กฌ
            if nums[j] == nums[j+i-1] and dp[j+1][j+i-2]:
                dp[j][j+i-1] = 1

4.4. Traveling Sales Person

์™ธํŒ์› ์ˆœํšŒ ๋ฌธ์ œ

๋ฐฑ์ค€ 2098๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๋จผ์ € "์ˆœํšŒ"์ด๋ฏ€๋กœ ์–ด๋А ์ง€์ ์—์„œ ์ถœ๋ฐœํ•ด๋„ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์Œ: 0๋ฒˆ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•œ๋‹ค ๊ฐ€์ •
  2. ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋„์‹œ์˜ ๋ชฉ๋ก์œผ๋กœ ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ ๋น„ํŠธ๋งˆ์Šคํ‚น์„ ์ด์šฉ
  3. ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชฉ๋ก์œผ๋กœ๋ถ€ํ„ฐ, ์•ž์œผ๋กœ ๋ชจ๋“  ๋„์‹œ๋ฅผ ์ˆœํšŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋น„์šฉ ์ค‘ ์ตœ์†Ÿ๊ฐ’์„ ์ทจํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๊ณ„์‚ฐ์„ ์ง„ํ–‰(๋™์  ๊ณ„ํš๋ฒ•)

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. n๋ฒˆ ๋„์‹œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ณ  ์žˆ์„ ๋•Œ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•ด ์•ž์œผ๋กœ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋น„์šฉ์„ ๋‹ด์„ ๋ฐฐ์—ด DP๋ฅผ dp = [[ING]*(1<<n) for _ in range(n)]๊ณผ ๊ฐ™์ด ๋งŒ๋“ ๋‹ค

  2. ๋‚˜๋จธ์ง€๋Š” ์žฌ๊ท€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋˜ dp์˜ ๊ฐ’์ด None์ด ์•„๋‹ˆ๋ผ๋ฉด(์ด๋ฏธ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค๋ฉด) ๋ฆฌํ„ดํ•˜์—ฌ ์ค‘๋ณต ์ œ๊ฑฐ

    # ํ˜„์žฌ ์œ„์น˜, ๋ฐฉ๋ฌธํ•œ ๊ธฐ๋ก
    def travel(start, visit):
        # ๋ชจ๋“  ๋„์‹œ๋ฅผ ๋‹ค ์ˆœํšŒํ–ˆ๋‹ค๋ฉด
        if visit == check:
            # ๋งˆ์ง€๋ง‰ ๋„์‹œ์—์„œ ์ถœ๋ฐœ ๋„์‹œ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ธธ์ด ์žˆ๋‹ค๋ฉด ๊ฐ’์„, ์•„๋‹ˆ๋ฉด INF ๋ฆฌํ„ด
            return cost[start][0] or INF
    
        # ์ด๋ฏธ ํ•ด๋‹น ์ถœ๋ฐœ์ ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด์กŒ๋‹ค๋ฉด ๋ฐ”๋กœ ๋ฆฌํ„ด: ์ค‘๋ณต ์ œ๊ฑฐ
        if dp[start][visit] is not None:
            return dp[start][visit]
    
        temp = INF
        for i in range(n):
            # i๋กœ ๊ฐ€๋Š” ๊ธธ์ด ์กด์žฌํ•˜๊ณ , ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
            if cost[start][i] and visit & (1<<i) == 0:
                temp = min(temp, travel(i, visit|(1<<i))+cost[start][i])
        # ํ˜„์žฌ ์œ„์น˜์™€ ํ˜„์žฌ๊นŒ์ง€ ๋ฐฉ๋ฌธํ•œ ๋ชฉ๋ก์— ๋Œ€์‘๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ 
        dp[start][visit] = temp
    
        return temp

4.5. Kadane's Algorithm

์–ด๋–ค ๋ฐฐ์—ด์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ•  ๊ฒƒ์ธ๊ฐ€?

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๋ฐฐ์—ด arr์— ๋Œ€ํ•ด i๋ฒˆ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ์ตœ๋Œ€ ๋ถ€๋ถ„ํ•ฉ์„ dp[i]๋ผ๊ณ  ํ•˜์ž
  2. dp[i] = max(dp[i-1], dp[i-1]+arr[i])

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ƒ๋žต^^

5. ์ตœ๋‹จ ๊ฒฝ๋กœ

5.1. Dijkstra

์Œ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์˜ ํ•œ ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‚˜๋ฌด์œ„ํ‚ค

๋ฐฑ์ค€ 1753๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ์ถœ๋ฐœ์ ์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ ๋…ธ๋“œ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ด์„ ๋ฐฐ์—ด D[V]๋ฅผ ์„ ์–ธ
    • ๊ฐ’์€ INF๋กœ ์„ค์ •
  2. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•จ
    • ํ˜„์žฌ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด D[A] + dist[A][B]์™€ D[B]๋ฅผ ๋น„๊ต
    • ๋‘˜ ์ค‘ ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ D[B]๋ฅผ ์—…๋ฐ์ดํŠธ
    • ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ฃผ๋ณ€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ฐ™์€ ์ž‘์—…์„ ์‹ค์‹œ
    • ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ฐฉ๋ฌธ ์™„๋ฃŒ๋กœ ๋ฐ”๊พธ๊ณ , ๋ฏธ๋ฐฉ๋ฌธ ๋…ธ๋“œ์ค‘ D[V]๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ๊ณณ์„ ๋ฐฉ๋ฌธํ•ด์„œ ๋ฐ˜๋ณตํ•จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • O(V^2)

    • ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ์›๋ž˜ ๊ณ ์•ˆํ•œ ๋ฐฉ๋ฒ•

    • visit[start] = 1
      distance[start] = 0
      for i in graph[start]:
          distance[i[0]] = i[1]
      
      # ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉฐ ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ
      for i in range(v-1):
          # ๋ฏธ๋ฐฉ๋ฌธ ๋…ธ๋“œ ์ค‘ ์ถœ๋ฐœ์ ๊ณผ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ๋‹จ์ธ ๊ณณ์„ ํƒ์ƒ‰: O(V^2)
          now = get_smallest_node()
          visit[now] = 1
          for edge in graph[now]:
              cost = distance[now] + edge[1]
              # ๋‹ค์ต์ŠคํŠธ๋ผ์˜ ํ•ต์‹ฌ: ์ถœ๋ฐœ์ -now + now-์ฃผ๋ณ€๋…ธ๋“œ vs ์ถœ๋ฐœ์ -์ฃผ๋ณ€๋…ธ๋“œ ๊ฑฐ๋ฆฌ ๋น„๊ต
              if cost < distance[edge[0]]:
  • O((V+E)logV)

    • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

    • E๋Š” ํ•œ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ์ฃผ๋ณ€ ๋…ธ๋“œ์˜ ์ˆ˜

    • ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ์ถœ๋ฐœ์ ์œผ๋กœ๋ถ€ํ„ฐ ํ˜„์žฌ๊นŒ์ง€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์— VlogV, ์ด์›ƒ๋…ธ๋“œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ ์— ElogV ํ•„์š”

    • # ๊ฐ ๋…ธ๋“œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ "์—…๋ฐ์ดํŠธ"ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ํ
      q = []
      heapq.heappush(q, (0, start))
      # ์ถœ๋ฐœ์ ์œผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด: ์ตœ์ข… ๊ฒฐ๊ณผ
      distance[start] = 0
      while q:
          dist, now = heapq.heappop(q)
          # ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๊ฒƒ๋ถ€ํ„ฐ ๋จผ์ € ์ฒ˜๋ฆฌํ•จ
          # ๊ฐ™์€ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋‹ค๋ฉด ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์Œ
          # dist๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์ •๋ณด(ํ์— ์ €์žฅ๋œ ๊ฑฐ๋ฆฌ)์™€ distance(์ฒ˜๋ฆฌ๋œ ๊ฑฐ๋ฆฌ)๋ฅผ ๋น„๊ต
          if distance[now] < dist:
              continue
          # now์˜ ์ฃผ๋ณ€ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰
          for edge in graph[now]:
              cost = dist + edge[1]
              if cost < distance[edge[0]]:
                  distance[edge[0]] = cost
                  heapq.heappush(q, (cost, i[0]))

์ˆ˜ํ•™์  ์ฆ๋ช…

๊ท€๋ฅ˜๋ฒ•์œผ๋กœ ์ฆ๋ช… ๊ฐ€๋Šฅ ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ

๊ทธ๋ž˜ํ”„ ๋‚ด ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๋ชจ๋‘ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜๊ฑฐํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค ๋Š” ๊ฐ€์ •์„ ์„ธ์šฐ๊ณ  ์ด๋ฅผ ๋ฐ˜๋ฐ•ํ•ด๋ณด์ž.

  • ์ž„์˜์˜ ๊ผญ์ง“์  u์—์„œ๋ถ€ํ„ฐ v๊นŒ์ง€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•œ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ƒ์ •ํ•˜๊ณ , ๊ทธ ์œ„์— ๋…ธ๋“œ w๊ฐ€ ์žˆ์Œ

  • ์ด ๋•Œ w์™€ u์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๊ฐ€ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ฅธ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด

  • u-w์™€ w-v์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ์ด u-v์˜ ๊ฑฐ๋ฆฌ์˜ ํ•ฉ๋ณด๋‹ค ์งง์•„์ ธ์•ผ ํ•จ

    • u-v๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์—, ์ด๊ฒƒ์€ u-w๊ฑฐ๋ฆฌ + w-v๊ฑฐ๋ฆฌ์™€ ๊ฐ™์•„์•ผ ํ•จ
  • ๊ทธ๋Ÿผ u-v์‚ฌ์ด์— ์ตœ๋‹จ๊ฒฝ๋กœ๋ณด๋‹ค ๋” ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ชจ์ˆœ

    • ๋”ฐ๋ผ์„œ u-w ์‚ฌ์ด์—๋„ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ฅธ ์ตœ๋‹จ๊ฒฝ๋กœ๋ณด๋‹ค ๋” ์งง์€ ๊ฒฝ๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Œ
    • ์ด๋ฅผ ๊ทธ๋ž˜ํ”„ ๋‚ด ๋ชจ๋“  ๋…ธ๋“œ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

5.2. Floyd-Warshall

๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ ๊ฐ„์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง€๋Š” ๊ทธ๋ž˜ํ”„์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

๋ฐฑ์ค€ 11404๋ฒˆ

2021 ์นด์นด์˜ค ์‹ ์ž…๊ณต์ฑ„ 1์ฐจ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ 4๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๊ฐ™์€ ์›๋ฆฌ: ์ถœ๋ฐœ์  - ๋…ธ๋“œ ๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ํ™•์žฅ
  2. i-j ๊ฑฐ๋ฆฌ์™€ i์—์„œ ์ž„์˜์˜ ๋…ธ๋“œ k + k-j ๊ฑฐ๋ฆฌ๋ฅผ ๋น„๊ตํ•ด ๋” ์งง์€ ์ชฝ์œผ๋กœ i-j ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ
    • ์ด๊ฑธ ๋ชจ๋“  ๋…ธ๋“œ k์— ๋Œ€ํ•ด์„œ ๋ฐ˜๋ณตํ•˜์—ฌ i-j์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ์–ป๋Š”๋‹ค
  3. ๊ฐ™์€ ๊ฒƒ์„ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ๋‹ค

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฐ˜๋ณต๋ฌธ 3๊ฐœ๋ฅผ ์ค‘์ฒฉํ•˜๋˜, ๊ฐ€์šด๋ฐ ๋…ธ๋“œ k๊ฐ€ ์ œ์ผ ์œ„์— ์™€์•ผ ํ•จ

    • ์ด๊ฑด ์œ„ํ‚ค๋ฐฑ๊ณผ์— ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ๋Š”๋ฐ, ์š”์•ฝํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Œ
    • i์—์„œ j๋กœ ๊ฐ€๋Š”๋ฐ, 1~k๋ฒˆ ์‚ฌ์ด์˜ ๋…ธ๋“œ๋งŒ ๊ฒฝ์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ path(i, j, k)๋ผ๊ณ  ํ•˜์ž
    • ์œ„ ์ƒํ™ฉ์—์„œ i์—์„œ j๋กœ ๊ฐ€๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ๋Š” k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š”๊ฐ€ or ๊ฒฝ์œ ํ•˜์ง€ ์•Š๋Š”๊ฐ€ ๋กœ ๋ถ„๋ฆฌ๋จ(DP)
    • ๋”ฐ๋ผ์„œ path(i, j, k)๋Š” min(k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ๋กœ, k๋ฅผ ์•ˆ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ๋กœ)๊ฐ€ ๋จ
      • k๋ฅผ ์•ˆ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ๋กœ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” path(i, j, k-1)์ž„
      • k๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒฝ๋กœ ์ค‘ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” path(i, k, k-1) + path(k, j, k-1)์ž„
    • ๊ทธ๋Ÿฌ๋ฏ€๋กœ k=1์—์„œ ๋ชจ๋“  i, j์— ๋Œ€ํ•ด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , k=N์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชจ๋“  ์Œ์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
  • graph = [[INF]*(V+1) for _ in range(V+1)]
    
    # ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    for a in range(1, V+1):
        graph[a][a] = 0
    
    # ๋…ธ๋“œ a์—์„œ b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ c๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ๋ž˜ํ”„ ์ž‘์„ฑ
    for _ in range(E):
        a, b, c = map(int, input().split())
        graph[a][b] = c
    
    # ์ ํ™”์‹์— ๋”ฐ๋ผ ๊ฐ ๋…ธ๋“œ k์— ๋Œ€ํ•ด a์—์„œ b๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
    # a-b๋กœ ์ง์ ‘๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค a-k-b๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์œผ๋ฉด ๊ฐฑ์‹ 
    for k in range(1, V+1):
        for a in range(1, V+1):
            for b in range(1, V+1):
                graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])

6. ๊ทธ๋ž˜ํ”„ ์ด๋ก 

6.1. Disjoint Sets

๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ๋‘ ์ง‘ํ•ฉ

๋‘ ํŠธ๋ฆฌ๊ฐ€ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด UNION์—ฐ์‚ฐ์„ ํ†ตํ•ด root๊ฐ€ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค

parent = [0] * V

# ๋จผ์ € ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ž๊ธฐ ์ž์‹ ์„ ๋ถ€๋ชจ๋กœ ๊ฐ–๋„๋ก ์„ค์ •ํ•จ
for i in range(V):
    parent[x] = x

# ์žฌ๊ท€์ ์œผ๋กœ ์ž์‹ ์˜ root๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜
def find_parent(x):
    if parent[x] != x:
        # ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ root๋กœ ๊ฐฑ์‹ ํ•˜์—ฌ root์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ(๊ฒฝ๋กœ ์••์ถ•)
        parent[x] = find_parent(parent[x])
    return parent[x]

# ๋…ธ๋“œ x์™€ ๋…ธ๋“œ y์˜ root๋ฅผ ๊ฐ™๋„๋ก ํ•จ: UNION
# ์—ฌ๊ธฐ์„  ๋ฒˆํ˜ธ๊ฐ€ ๋” ์ž‘์€ ๋…ธ๋“œ๋ฅผ ๋ถ€๋ชจ๋กœ ๊ฐ€๊ฒŒ ํ•ฉ์นจ
def union(x, y):
    x = find_parent(x)
    y = find_parent(y)
    if x < y:
	    parent[y] = x
    else:
        parent[x] = y

root๋ณ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ

์‚ฌ์ดํด ํŒ๋ณ„ํ•˜๊ธฐ

  1. ๊ฐ ๊ฐ„์„ ์„ ํ™•์ธํ•˜๋ฉฐ ๊ฐ„์„ ์— ์—ฐ๊ฒฐ๋œ ๋‘ ๋…ธ๋“œ์˜ root๋ฅผ ํ™•์ธ
    • root๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด union์„ ์ˆ˜ํ–‰
    • root๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์‚ฌ์ดํด์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ
  2. ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•ด 1์„ ๋ฐ˜๋ณต

6.2. Spanning Tree

spanning tree

์‹ ์žฅ ํŠธ๋ฆฌ๋ž€?

  • ํ•˜๋‚˜์˜ ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์„ ๋•Œ, ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌํ•จํ•˜๋ฉด์„œ ์‚ฌ์ดํด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„
    • ์ŠคํŒจ๋‹(์‹ ์žฅ) ํŠธ๋ฆฌ๋Š” DFS/BFS๋ฅผ ์ด์šฉํ•ด ์„ ํ˜• ์‹œ๊ฐ„์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
  • ์‚ฌ์ดํด์ด๋ž€?
    • ๋‹จ์ˆœ ๊ฒฝ๋กœ(simple path)์ด๋ฉด์„œ ์ฒ˜์Œ๊ณผ ๋์ด ๊ฐ™์€ ๊ฒฝ๋กœ
    • ๋™์ผํ•œ ๊ฐ„์„ ์„ ์ค‘๋ณตํ•˜์—ฌ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ
  • Minimum Spanning Tree(์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ)๋ž€?
    • ์‹ ์žฅ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ๊ทธ๋ž˜ํ”„
    • ๊ฐ„์„ ์˜ ์ˆ˜ + 1 = ์ •์ ์˜ ์ˆ˜ ๋ฅผ ๋งŒ์กฑํ•จ
    • MST๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
      • Boruvka's algorithm O(m log n)
      • Prim's algorithm O(m log n) or O(m + n log n)
      • Kruskal's algorithm O(m log n)

6.2.1. Prim's Algorithm

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ํ•˜๋‚˜์˜ ์ •์ ์„ ์‹œ์ž‘์œผ๋กœ MST๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ํŠธ๋ฆฌ๋ฅผ ํ™•์žฅํ•ด ๋‚˜๊ฐ

6.2.2. Kruskal's Algorithm

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ๋ชจ๋“  ๊ฐ„์„ ์— ๋Œ€ํ•ด ๋น„์šฉ์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
  2. ๊ฐ„์„ ์„ ๋น„์šฉ์ˆœ์„œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์‚ฌ์ดํด์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ
    • ๋น„์šฉ์ด ์ ์€ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์ดํด ์—†์ด ์ถ”๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ง ๊ทธ๋Œ€๋กœ ์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ํŠธ๋ฆฌ๊ฐ€ ๋จ
    • ๊ฐ„์„ ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉด ๊ฐ„์„ ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ ๋นผ๋Š” ๋ฐฉ์‹์ด ๋จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์‚ฌ์ดํด์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€ UNION์„ ์ด์šฉํ•˜์—ฌ ํŒ๋ณ„ํ•˜๋ฉด์„œ ๊ตฌํ˜„

    • ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ํŒ๋ณ„ํ•˜๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•จ
  • cnt = 0
    
    for i in range(E):
        px = find_root(edge[i][0])
        py = find_root(edge[i][1])
    
        # cycle check
        if px != py:
            cnt += 1
            union(px, py)
        
        # MST์˜ ๊ฐ„์„ ์˜ ์ˆ˜๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ -1 ์ด๋‹ค
        if cnt == V-1:
            break

6.3. Topology Sort

๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉํ–ฅ์„ฑ์— ๊ฑฐ์Šค๋ฅด์ง€ ์•Š๋„๋ก ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ

์„ ์ˆ˜๊ณผ๋ชฉ์„ ๊ณ ๋ คํ•œ ํ•™์Šต ์ˆœ์„œ ์„ค์ •์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ์Œ

๋ฐฑ์ค€ 2252๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค
    • ์ง„์ž…์ฐจ์ˆ˜: ํŠน์ •ํ•œ ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
    • ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๊ณผ๋ชฉ์€ ์„ ์ˆ˜๊ณผ๋ชฉ์ด ์—†๋Š” 1ํ•™๋…„ ๊ณผ๋ชฉ์ด๋ผ ํ•  ์ˆ˜ ์žˆ์Œ
  2. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค
    • ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์„ ์ œ๊ฑฐํ•œ๋‹ค
    • ์ƒˆ๋กญ๊ฒŒ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋œ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค
    • ์ฃผ์˜) ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•˜๊ธฐ ์ „์— ํ๊ฐ€ ๋น”
      • ์‚ฌ์ดํด ๋‚ด ๋…ธ๋“œ๋“ค์€ ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ชจ๋“  ๋…ธ๋“œ์™€ ๊ฐ„์„ ๋“ค์„ ํ•œ ๋ฒˆ์”ฉ ํ™•์ธํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(V+E)

# ์ง„์ž…์ฐจ์ˆ˜: ํ•ด๋‹น ๋…ธ๋“œ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜
indegree = [0]*(v+1)
graph = [[] for _ in range(v+1)]

for _ in range(e):
    a, b = map(int, input().split())
    graph[a].append(b)
    indegree[b] += 1

q = deque()

for i in range(1, v+1):
    # ์ง„์ž…์ฐจ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค
    if indegree[i] == 0:
        q.append(i)

while q:
    # ํ˜„์žฌ ๋ฐฉ๋ฌธ์ค‘์ธ ๋…ธ๋“œ now
    now = q.popleft()
    for node in graph[now]:
        # now์—์„œ ์ถœ๋ฐœํ•˜๋Š” ๊ฐ„์„ ์„ ์ œ๊ฑฐ: ๋„์ฐฉ ๋…ธ๋“œ๋“ค์˜ ์ง„์ž…์ฐจ์ˆ˜ -=1
        indegree[node] -= 1
        if indegree[node] == 0:
            q.append(now)

7. ๋ฌธ์ž์—ด

ํŒŒ์ด์ฌ์˜ ๋ฌธ์ž์—ด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋ณ€์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ž„์— ์œ ๋…ํ•˜์ž

๊ธฐ๋ณธ์ ์œผ๋กœ ์Šฌ๋ผ์ด์‹ฑ์ด ๊ฐ€์žฅ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์—ฐ์‚ฐ๋ณด๋‹ค ์ด๋ฅผ ์šฐ์„ ์œผ๋กœ ํ•  ๊ฒƒ

KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜

์–ด๋–ค ๋ฌธ์ž์—ด ์•ˆ์— ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์ด ๋“ค์–ด์žˆ๋Š”์ง€๋ฅผ O(n+m)์œผ๋กœ ์ฐพ์•„๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด์„œ ์ฐพ๋Š”๋‹ค

๋ฐฑ์ค€ 1786๋ฒˆ

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ธฐ๋ณธ ์•„์ด๋””์–ด

  1. ์ˆœ์ฐจ์ ์œผ๋กœ ๋‘ ๋ฌธ์ž์—ด T, P๋ฅผ ๋น„๊ตํ•˜๋‹ค ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด "์ผ์น˜ํ–ˆ๋˜ ๋ถ€๋ถ„์„ ๊ฑด๋„ˆ๋›ฐ๊ณ " ๋‹ค์‹œ ๋น„๊ต
  2. ๋‹จ, ์ผ์น˜ํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ „๋ถ€ ๊ฑด๋„ˆ๋›ฐ์ง€๋Š” ์•Š์Œ
    • ์ผ์น˜ํ–ˆ๋˜ ๋ถ€๋ถ„ ๋‚ด์— ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•˜๋ฉด ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•จ
    • ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋น„๊ตํ•  ๋ฌธ์ž์—ด์ธ P์˜ ๊ฐ ์œ„์น˜๋งˆ๋‹ค ์‹คํŒจ ํ•จ์ˆ˜ ๊ฐ’์„ ์„ค์ •
    • ์‹คํŒจ ํ•จ์ˆ˜๋ž€?
      • ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ผ๋งˆ๋งŒํผ ๊ฑด๋„ˆ๋›ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’
      • P์˜ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฌธ์ž์—ด ๋‚ด์—์„œ prefix์™€ suffix๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ตœ๋Œ€ ๊ธธ์ด
      • ์ด๊ฑธ LPS(Longest proper Prefix which is Suffix)๋ผ๊ณ  ํ•จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ์‹คํŒจํ•จ์ˆ˜ fail[] ์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, KMP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ ๊ฐ€๋Šฅ

  • # T์™€ P๋ฅผ ๋น„๊ต
    j = 0
    # T์™€ P๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ง€์ ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅ
    result = []
    for i in range(n):
        # ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด fail๊ฐ’์„ "๋”ฐ๋ผ๊ฐ"
        while j > 0 and T[i] != P[j]:
            j = fail[j-1]
        if T[i] == P[j]:
            # ๋ฌธ์ž์—ด ๋งค์นญ ์„ฑ๊ณต
            if j == m-1:
                result.append(i-m+2)
                # ๊ณ„์† ํƒ์ƒ‰: fail๊ฐ’์„ ๋”ฐ๋ผ๊ฐ
                j = fail[j]
            else:
                j += 1
    • ์‹คํŒจ ํ•จ์ˆ˜ ๊ฐ’์„ ๋”ฐ๋ผ๊ฐ„๋‹ค๋Š” ๊ฒƒ์€ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ P๋ฅผ ์–ผ๋งˆ๋‚˜ "๋ฐ€์–ด์ฃผ๋Š”๊ฐ€"๋ฅผ ๋œปํ•จ
      • ์‹คํŒจํ•จ์ˆ˜ ๊ฐ’์ด 2๋ผ๋ฉด ๋งจ ์•ž 2๊ธ€์ž==๋งจ ๋’ค 2๊ธ€์ž์ด๋ฏ€๋กœ P์˜ 3๋ฒˆ์งธ ๊ธ€์ž๋ถ€ํ„ฐ ๋น„๊ต๋ฅผ ์‹œ์ž‘
      • j=2๊ฐ€ ๋จ: ์—ฌ๊ธฐ์„œ 2๋Š” ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•œ ์ง€์  ์ง์ „์˜ ์‹คํŒจํ•จ์ˆ˜ ๊ฐ’์ด๋ฏ€๋กœ j=fail[j-1]์ด ๋œ๋‹ค
    • if๊ฐ€ ์•„๋‹ˆ๋ผ while๋ฌธ์ธ ์ด์œ ๋Š” ์‹คํŒจํ•จ์ˆ˜์˜ ๊ฐ’์ด ํด ๋•Œ "๋ฐ€์–ด์ค€" ์งํ›„์— ๋ฐ”๋กœ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
  • ์‹คํŒจํ•จ์ˆ˜๋Š” P์™€ P๋ฅผ ๋น„๊ตํ•˜๋Š” KMP๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

  • fail = [0]*(m)
    j = 0
    # i = 0์ผ ๋•Œ๋Š” ์‹คํŒจํ•จ์ˆ˜๊ฐ€ 0์ž„์ด ์ž๋ช…ํ•˜๋ฏ€๋กœ pass
    for i in range(1, m):
        while j > 0 and P[i] != P[j]:
            j = fail[j-1]
        # i๋ฒˆ์งธ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์—์„œ ํ˜„์žฌ j๊ฐ€ ์œ„์น˜ํ•œ ์ž๋ฆฌ์˜ ๊ธธ์ด(j+1)๊ฐ€ ์‹คํŒจํ•จ์ˆ˜์˜ ๊ฐ’์ด ๋จ    
        if P[i] == P[j]:
            # j๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
            j += 1
            fail[i] = j

8. ๋ถ„ํ•  ์ •๋ณต

ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•  ๋•Œ๊นŒ์ง€ ๋ฌธ์ œ๋ฅผ ์ชผ๊ฐœ๊ณ , ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ์›๋ž˜ ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ๋„์ถœํ•จ

๋ถ„ํ• ์ •๋ณต ๋ฌธ์ œ๋Š” ์žฌ๊ท€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•จ

def F(x):
    # ์ •๋ณต
	if F(x) is soluable:
		return solution
	# ๋ถ„ํ• 
    else:
        x๋ฅผ x1, x2๋กœ ๋ถ„ํ• 
        call F(x1)
        call F(x2)
        return F(x1), F(x2)๋กœ F(x)๋ฅผ ๊ตฌํ•œ ๊ฐ’

About

Problem Solving with Basic Algorithms

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages