ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[์ด์ฝ”ํ…Œ Ch12-14] ์™ธ๋ฒฝ ์ ๊ฒ€ (๊ตฌํ˜„)

์€์ง„ 2022. 3. 17. 21:08

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ์„ค๋ช…

[์ด์ฝ”ํ…Œ Ch12-14] ์™ธ๋ฒฝ ์ ๊ฒ€ (๊ตฌํ˜„)
์ด์ฝ”ํ…Œ

โœ๏ธIdea Sketch

๋ฌธ์ œ ์š”์•ฝ

์™ธ๋ฒฝ์˜ ๊ธธ์ด n, ์ทจ์•ฝ ์ง€์ ์˜ ์œ„์น˜๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด weak, ๊ฐ ์นœ๊ตฌ๊ฐ€ 1์‹œ๊ฐ„ ๋™์•ˆ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด dist๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ทจ์•ฝ ์ง€์ ์„ ์ ๊ฒ€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด๋‚ด์•ผ ํ•˜๋Š” ์นœ๊ตฌ ์ˆ˜์˜ ์ตœ์†Œ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

weak : ๋ฐ˜๋“œ์‹œ ๋ฐฉ๋ฌธํ•ด์•ผํ•˜๋Š” ์ง€์ 
dist : ํ•œ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ


์ œํ•œ์‚ฌํ•ญ

  • n์€ 1 ์ด์ƒ 200 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜

  • weak์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 15 ์ดํ•˜

  • weak์˜ ์›์†Œ๋Š” 0 ์ด์ƒ n - 1 ์ดํ•˜์ธ ์ •์ˆ˜

  • dist์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 8 ์ดํ•˜

  • dist์˜ ์›์†Œ๋Š” 1 ์ด์ƒ 100 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜

  • weak๋ฅผ ๋ชจ๋‘ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, return -1


์‹œ๊ฐ„๋ณต์žก๋„ : O(n!), ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋ธŒ๋ฃจํŠธํฌ์Šค (์™„์ „ ํƒ์ƒ‰)

์ฒ˜์Œ์—๋Š” ๊ทธ๋ฆฌ๋””๋กœ ์ ‘๊ทผํ•˜๋ ค ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, weak์™€ dist ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๋งค์šฐ ์ž‘์•„ ์™„์ „ ํƒ์ƒ‰๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•˜๋‹ค. ์นœ๊ตฌ์˜ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 8๋ช…์ด๋ฏ€๋กœ ์ด๋“ค์˜ ํˆฌ์ž… ์ˆœ์„œ๋ฅผ ์ •ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 8!, ์•ฝ 40000์ด๋‹ค. (์ˆœ์—ด)

์นœ๊ตฌ ํˆฌ์ž… ์ˆœ์„œ๋ฅผ ์ •ํ–ˆ์œผ๋‹ˆ, ์ฒซ๋ฒˆ์งธ ์นœ๊ตฌ๋ฅผ ์–ด๋Š ์ทจ์•ฝ์ง€์ ์— ํˆฌ์ž…์‹œํ‚ฌ์ง€ (์ถœ๋ฐœ ์ง€์ ) ์ •ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์กฐ๊ฑด weak์˜ ๋ฐฐ์—ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด, 0m์„ ๊ฐ€๋กœ์งˆ๋Ÿฌ ์—ฌ๋Ÿฌ ์ง€์ ์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ทจ์•ฝ์ง€์ ์ด ์ถœ๋ฐœ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์ทจ์•ฝ์ ์€ ์ตœ๋Œ€ 15๊ฐœ์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ์•ฝ 40000 * 15 ์ด๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ฐ€์žฅ ๋†’์€ ์ฐจ์ˆ˜์˜ ํ•ญ๋งŒ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์•ฝ์†์ด๋ฏ€๋กœ O(n!)์ด๋‹ค.

์ค‘์š” ์•„์ด๋””์–ด

  1. ์™„์ „ํƒ์ƒ‰
  2. ์™ธ๋ฒฝ ํ™•์žฅ


โœ๏ธ๋‚ด ์†Œ์Šค์ฝ”๋“œ

  • graph : 0m ์ง€์ ์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ weak๋ฅผ n * 2๋กœ ํ™•์žฅํ•œ๋‹ค.
  • permutations : ์นœ๊ตฌ๋ฅผ ํˆฌ์ž…ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๊ตฌํ•œ๋‹ค. (์ˆœ์—ด)
  • start์™€ for๋ฌธ : ๋ชจ๋“  ์ทจ์•ฝ์ง€์ ์€ ์ถœ๋ฐœ์ง€์ ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  from itertools import permutations


  def solution(n, weak, dist):
      W, D = len(weak), len(dist)
      graph = weak + [w + n for w in weak]  # weak ๋ฐฐ์—ด 2๋ฐฐ ํ™•์žฅ (0m๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ)
      res = float('inf')

      for friends in permutations(dist):  # ํˆฌ์ž… ์ˆœ์„œ (์ˆœ์—ด)
          for start in range(W):  # ์ฒซ๋ฒˆ์งธ ํˆฌ์ž… index
              end = start - 1 + W  # weak ํ™•์žฅํ–ˆ์œผ๋ฏ€๋กœ + W

              p = graph[start]
              cnt = 1

              for friend in friends:
                  p += friend

                  if p < graph[end]:
                      cnt += 1

                      for x in graph:
                          if p < x:
                              p = x
                              break

                  else:
                      res = min(res, cnt)
                      break

      if res == float('inf'):
          return -1
      else:
          return res