๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š ์ „๊ณต ๊ณต๋ถ€/๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•

[๋ฌธ์ œํ•ด๊ฒฐ๊ธฐ๋ฒ•] 10. ๊ณ„์‚ฐ ๊ธฐํ•˜

 

๊ณ„์‚ฐ ๊ธฐํ•˜

  • 2, 3์ฐจ์› ๊ณต๊ฐ„์ƒ์—์„œ ์ , ์„ , ๋„ํ˜• ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฌธ์ œ
  • ๊ธฐ๋ณธ ๊ฐ€์ • : 2์ฐจ์› ๊ณต๊ฐ„, ์ •์ˆ˜์ขŒํ‘œ๋งŒ ๊ณ ๋ คํ•จ. ์‹ค์ˆ˜ ์—ฐ์‚ฐ์€ ์ง€์–‘
  • polygon : ์„ ๋ถ„๋“ค๋กœ ์ด๋ค„์ง„ ๋‹ซํžŒ ๋„ํ˜•. ๋‘ ์„ ๋ถ„์ด ๋งŒ๋‚˜๋Š” ์ ์€ ํ•˜๋‚˜๋ฟ์ด๋‹ค.

๋ชจ๋“  ์ ์„ ์ง€๋‚˜๋Š” ๊ฒฝ๋กœ

  • n๊ฐœ์˜ ์ ์ด ์ฃผ์–ด์ง€๋ฉด, ์ด ์ ๋“ค์„ ๋ชจ๋‘ ์ง€๋‚˜๊ณ  ์‹œ์ž‘์ ์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜์‹œ์˜ค. ๋‹จ, ๊ต์ฐจํ•˜์ง€ ์•Š๊ฒŒ
  • ํ’€์ด ๋ฐฉ๋ฒ•
    1. y์ขŒํ‘œ๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์„ ๊ธฐ์ค€์ ์œผ๋กœ ์žก์Œ. O(n)
    2. ์ด ์ ์„ ์ง€๋‚˜๋Š” ์ง์„ ๊ณผ ๋‹ค๋ฅธ ์ ๋“ค์„ ์ž‡๋Š” ์ง์„ ์„ ๋ชจ๋‘ ๊ตฌํ•˜๊ณ , ๊ฐ์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ •๋ ฌํ•œ๋‹ค. O(n log n). ๊ทธ๋ฆฌ๊ณ  ์ด ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋จ
  • ๊ฐ์˜ ๊ณ„์‚ฐ : arctan ํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ ์„ฑ์งˆ์„ ๊ฐ€์ง€๊ณ , ๋ถ„๋ชจ๊ฐ€ 0์ธ ๊ฒฝ์šฐ๊ฐ€ ์—†๋„๋ก ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค.

์ ๊ณผ ํด๋ฆฌ๊ฑด์˜ ํฌํ•จ ๊ด€๊ณ„

  • ์ ์˜ ์ขŒํ‘œ๊ฐ€ (x,y)๋ผ๊ณ  ํ•˜์ž.
  • (x,y)-(∞,y) ์ง์„ ๊ณผ ๋„ํ˜•์˜ ๋ชจ๋“  ์„ ๋ถ„๊ฐ„์˜ ๊ต์ฐจ ์—ฌ๋ถ€๋ฅผ ํŒ์ •ํ•˜์—ฌ ๊ต์ ์˜ ์ˆ˜๋ฅผ ์„ผ๋‹ค.
  • ๊ต์ ์˜ ์ˆ˜๊ฐ€ ์ง์ˆ˜๋ผ๋ฉด, ์ด ์ ์€ ๋„ํ˜• ์™ธ๋ถ€์— ์žˆ๋‹ค
  • ๊ต์  ์ˆ˜๊ฐ€ ํ™€์ˆ˜๋ผ๋ฉด, ์ด ์ ์€ ๋„ํ˜• ๋‚ด๋ถ€์— ์žˆ๋‹ค.

์ ๊ณผ ๋ณผ๋ก ๋‹ค๊ฐํ˜•์˜ ํฌํ•จ๊ด€๊ณ„ (์ปจ๋ฒก์Šค ํด๋ฆฌ๊ณค)

  • Convex polygon = ๋ชจ๋“  ๋‚ด๊ฐ์ด 180๋„ ์ดํ•˜์ธ ๋‹ค๊ฐํ˜•
  • ๋˜๋Š”, ๋‹ค๊ฐํ˜• ์•ˆ์˜ ๋‘ ์ ์„ ์ž‡๋Š” ์ง์„ ์ด ํ•ญ์ƒ ๋‹ค๊ฐํ˜• ๋‚ด์— ์žˆ๋Š” ๋‹ค๊ฐํ˜•
  • ๋‹ค๊ฐํ˜•์˜ ๋‘˜๋ ˆ๋ฅผ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๋Œ ๋•Œ, ํ•ญ์ƒ ์ขŒํšŒ์ „ ๋˜๋Š” ํ•ญ์ƒ ์šฐํšŒ์ „์ด๋ฉฐ ํšŒ์ „ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

์ปจ๋ฒก์Šค ํ— (Convex Hull) : n๊ฐœ์˜ ์ ์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์ ๋“ค์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋ณผ๋ก ๋‹ค๊ฐํ˜•์ด๋‹ค.

 

์ปจ๋ฒก์Šค ํ—์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•

 

  1. ๋ธŒ๋ฃจํŠธ ํฌ์Šค : O(n^3)
    1. ๊ฐ€์žฅ y์ขŒํ‘œ๊ฐ€ ์ž‘์€ ์ ์„ ๊ธฐ์ค€์  u๋กœ ์žก๋Š”๋‹ค. u๋Š” ๋ฐ˜๋“œ์‹œ ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋œ๋‹ค.
    2. ๋‹ค๋ฅธ ๋ชจ๋“  ์ ์ด ์„ ๋ถ„ (u,v)์˜ ์™ผ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ์  v๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ ์  v๋Š” ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋œ๋‹ค.
    3. v์—์„œ ๋‹ค์‹œ 2๋ฒˆ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ ์„ ์ฐพ๋Š”๋‹ค. ๋ฐ˜๋ณต
  2. Graham scan : O(n log n) : stack์— ์ ์„ ์ €์žฅ
    1. ๊ฐ€์žฅ y์ขŒํ‘œ๊ฐ€ ์ž‘์€ ์ ์„ ๊ธฐ์ค€์  u๋กœ ์žก๋Š”๋‹ค. u๋Š” ๋ฐ˜๋“œ์‹œ ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋œ๋‹ค. O(n log n)
    2. ๋‹ค๋ฅธ ์ ๋“ค์„ ๊ฐ์— ๋”ฐ๋ผ ์ •๋ ฌํ•œ๋‹ค. O(n log n)
    3. ์ฒ˜์Œ์œผ๋กœ ๊ฒ€์‚ฌํ•  ์  2๊ฐœ(๊ธฐ์ค€์  ํฌํ•จ)๋ฅผ stack์— ๋„ฃ๊ณ , ์ด ๋‘์ ์„ ์ด์€ ๋ฒกํ„ฐ์™€, ๊ทธ ๋‹ค์Œ ์ ๊ณผ ๊ธฐ์ค€์ ์„ ์ด์€ ๋ฒกํ„ฐ์˜ ์™ธ์ ์„ ๋น„๊ตํ•œ๋‹ค.
    4. ๊ฒฐ๊ณผ๊ฐ€ ccw์ด๋ฉด(stack ๋‚ด๋ถ€์˜ ์ ์„ ์ด์€ ๋ฒกํ„ฐ๊ฐ€ ์˜ค๋ฅธ์ชฝ์ด๋ฉด) ์ปจ๋ฒก์Šคํ—์— ํฌํ•จ์‹œํ‚จ๋‹ค.
    5. ๊ฒฐ๊ณผ๊ฐ€ cw์ด๋ฉด, ๋งˆ์ง€๋ง‰์— stack์— ๋“ค์–ด๊ฐ„ ์ ์„ popํ•˜๊ณ , ์ด์ „ ๊ณผ์ •๋ถ€ํ„ฐ ๋‹ค์‹œ ์ง„ํ–‰ํ•œ๋‹ค.
    6. n-1๊ฐœ์˜ ์ ๋งˆ๋‹ค ์ด์ „์— ๊ทธ์€ ์„ ๋ถ„๊ณผ ์ƒˆ๋กœ ๊ทธ์€ ์„ ๋ถ„์˜ ์™ธ์ ์„ ๋น„๊ตํ•˜๋Š”๋ฐ์— O(n)
  3. Quick Hull : T(n) = O(n) + T(a) + T(b)
    1. ๊ฐ€์žฅ ์ƒํ•˜์ขŒ์šฐ์— ์žˆ๋Š” ์  4๊ฐœ๋Š” ๋ฐ˜๋“œ์‹œ ๋‘˜๋ ˆ์— ํฌํ•จ๋œ๋‹ค. ์ด ์ค‘ 2๊ฐœ์˜ ์ ์„ ์ž‡๋Š” ์„ ๋ถ„ A์™€ ๊ฐ€์žฅ ๋จผ ์  x๋ฅผ ์ฐพ๋Š”๋‹ค.
    2. x๋„ ๋ฐ˜๋“œ์‹œ ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋œ๋‹ค.
    3. A์™€ x๊ฐ€ ์ด๋ฃจ๋Š” ์‚ผ๊ฐํ˜•์˜ ๋‚ด๋ถ€์— ์žˆ๋Š” ์ ๋“ค์€ ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‚ญ์ œํ•œ๋‹ค.
    4. ๋‚จ์€ ์ ๋“ค์— ๋Œ€ํ•ด ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ์ปจ๋ฒก์Šค ํ—์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ ๋“ค์€ ๋ชจ๋‘ ์ง€์›Œ์ง„๋‹ค.
    5. ์„ ๋ถ„์„ ์ฐพ๋Š”๋ฐ์— O(n), ๊ฐ€์žฅ ๋จผ ์ ์„ ์ฐพ๋Š”๋ฐ์— O(n)์ด ๊ฑธ๋ฆผ
    6. ์„ ๋ถ„์„ ๊ธฐ์ค€์œผ๋กœ ๊ณต๊ฐ„์„ ๋‚˜๋ˆ„์–ด ๊ฐ ๊ณต๊ฐ„์„ a, b๋ผ๊ณ  ํ•˜๋ฉด,
      • Best : a=b=n/2 → T(n) = O(n log n)
      • Worst : a=1, b=n-1 → T(n) = O(n^2)
      • ์ด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” T(n) = O(n) + T(a) + T(b)

 

์•„๋ž˜๋Š” graham scan ์ฝ”๋“œ์˜ ํ•จ์ˆ˜ ์ž‘์„ฑ ์˜ˆ์‹œ์ด๋‹ค.

 

// Graham's scan ์œผ๋กœ ์ปจ๋ฒก์Šค ํ— ์ฐพ๋Š” ์ฝ”๋“œ

nextToTop(stack<Point> &S): ์Šคํƒ์—์„œ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ์ ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 
์Šคํƒ์˜ ๋งจ ์œ„์˜ ์ ์„ ๊ฐ€์ ธ์˜จ ๋’ค ์Šคํƒ์—์„œ ์ œ๊ฑฐํ•œ ๋‹ค์Œ, ๋‹ค์‹œ ์Šคํƒ์— ๋„ฃ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ์ ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

swap(Point &p1, Point &p2): ๋‘ ์ ์„ ๊ตํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ๋‘ ๊ฐœ์˜ Point ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๊ฐ’์„ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.

distSq(Point p1, Point p2): ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ๋‘ ๊ฐœ์˜ Point ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

compare(const void *vp1, const void *vp2): qsort() ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ๋น„๊ต ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 
์ด ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐœ์˜ Point ํฌ์ธํ„ฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„์„œ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. 
๋˜ํ•œ orientation() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ๋“ค์˜ ๋ฐฉํ–ฅ์„ฑ์„ ๋น„๊ตํ•˜๊ณ , ์ผ์ •ํ•œ ๊ทœ์น™์— ๋”ฐ๋ผ ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

convexHull(Point points[], int n): ๋ณผ๋ก ๊ป์งˆ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ฃผ์š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์ ๋“ค์˜ ๋ฐฐ์—ด๊ณผ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. 

์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค:

๊ฐ€์žฅ ์•„๋ž˜์— ์žˆ๋Š” ์ ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์— ์žˆ๋Š” ์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ์™ผ์ชฝ์— ์žˆ๋Š” ์ ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€์žฅ ์•„๋ž˜์— ์žˆ๋Š” ์ ์„ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋จธ์ง€ ์ ๋“ค์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. qsort() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, compare() ํ•จ์ˆ˜๋ฅผ ๋น„๊ต ํ•จ์ˆ˜๋กœ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ •๋ ฌ๋œ ์ ๋“ค ์ค‘์—์„œ ๊ธฐ์ค€์ ๊ณผ์˜ ๊ฐ๋„์— ๋”ฐ๋ผ ๊ฒน์น˜๋Š” ์ ๋“ค์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ์ ์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ดํ•˜๋ผ๋ฉด ๊ณ„์‚ฐ์„ ์ค‘๋‹จํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ณผ๋ก ๊ป์งˆ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์„ธ ๊ฐœ์˜ ์ ์„ ์Šคํƒ์— ๋„ฃ๊ณ , ๋‚˜๋จธ์ง€ ์ ๋“ค์„ ์ˆœํšŒํ•˜๋ฉด์„œ ์Šคํƒ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์Šคํƒ์—์„œ ์ ๋“ค์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ๋น„-์™ผ์ชฝ ํšŒ์ „(non-left turn)์ด ๋˜๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์—๋Š” ์ตœ์ข…์ ์œผ๋กœ ๋ณผ๋ก ๊ป์งˆ์— ์†ํ•˜๋Š” ์ ๋“ค๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋Š” ์ฃผ์–ด์ง„ ์ ๋“ค ์ค‘์—์„œ ๋ณผ๋ก ๊ป์งˆ์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

์ปจ๋ฒก์Šค ํ— ์‘์šฉ : n๊ฐœ์˜ ์ ์ด ์žˆ์„ ๋•Œ, ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋‘ ์ ์„ ๊ตฌํ•˜์‹œ์˜ค

  1. ๋ธŒ๋ฃจํŠธ ํฌ์Šค O(n^2) : (n,2)์˜ ์กฐํ•ฉ์„ ๋ชจ๋‘ ํ•ด๋ณธ๋‹ค
  2. ์ปจ๋ฒก์Šค ํ—์„ ๊ตฌํ•œ๋‹ค. ๊ฐ€์žฅ ๋จผ ๋‘ ์ ์€ ์ปจ๋ฒ…์Šค ํ— ์œ„์— ์žˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ, ์ปจ๋ฒก์Šค ํ— ์œ„์˜ ์ ๋“ค๋ผ๋ฆฌ์˜ ๊ฑฐ๋ฆฌ ์ฐจ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.