๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“– Problem Solution/Programmers

[Swift] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

by Fomagran ๐Ÿ’ป 2021. 2. 20.
728x90
๋ฐ˜์‘ํ˜•

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr


Solution

 

ํ•ด๋‹น ๋ฌธ์ œ๋Š” Greedy ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

๊ทธ ์ค‘์—์„œ๋„ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์–ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?๐Ÿค”

 

"์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ, ํฌ๋Ÿฌ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์˜์–ด: Kruskal’s algorithm)์€ ์ตœ์†Œ ๋น„์šฉ ์‹ ์žฅ ๋ถ€๋ถ„ ํŠธ๋ฆฌ๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋ณ€์˜ ๊ฐœ์ˆ˜๋ฅผ {\displaystyle E}E, ๊ผญ์ง“์ ์˜ ๊ฐœ์ˆ˜๋ฅผ {\displaystyle V}V๋ผ๊ณ  ํ•˜๋ฉด ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ {\displaystyle {\color {Blue}O}(E\log V)}{\color {Blue}O}(E\log V)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค."

 

์œ„ํ‚ค๋ฐฑ๊ณผ์— ์ด๋ ‡๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ์š”..... ์ €๋Š” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋”๋ผ๊ตฌ์š”....๐Ÿ˜…

 

๊ทธ๋ž˜์„œ ์—ด์‹ฌํžˆ ์ดํ•ดํ•ด๋ณด๋ ค๊ณ  ํ•˜๊ณ  ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ.... 

 

"๊ฐ€์žฅ ๊ฐ’์ด ๋‚ฎ์€ ์—ฐ๊ฒฐ๋กœ ์šฐ์„  ์ •๋ ฌํ•œ ๋’ค ์‚ฌ์ดํด ์ฆ‰,๋ฐ˜๋ณต์ด ์ƒ๊ธฐ๋Š” ๊ตฌ๊ฐ„์€ ์ œ์™ธ์‹œ์ผœ์ฃผ๋ฉด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค!"

 

๋ผ๊ณ  ์„ค๋ช…๋“œ๋ฆด์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

 

์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด ์–ด๋ ค์šฐ๋‹ˆ ์˜ˆ์ œ๋กœ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”!!

 

๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์€ ์—ฐ๊ฒฐ๋“ค์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ• ๊ฒŒ์š”.

 

 

 

 

 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€์žฅ ๊ฐ ์—ฐ๊ฒฐ๊ฐ„ ๊ฐ’์ด ๋‚ฎ์€ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด๋ณด๋ฉด

 

1. 3-4 5

 

2. 3-5 20

 

3. 4-5 21

 

4. 1-2 23

 

5. 2-5 46

 

6. 1-4 99

 

๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

 

๊ทธ๋Ÿฌ๋ฉด ์ € ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ์ดํ•ฉ์„ ๊ตฌํ•ด๋ด…์‹œ๋‹ค!๐Ÿ˜Ž

 

๋จผ์ € 3-4๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์‹œ๋ฉด ์ดํ•ฉ์€ 5๊ฐ€ ๋˜๊ฒ ์ฃ ?

 

 

 

 

๊ทธ ๋‹ค์Œ์œผ๋กœ ๋‚ฎ์€ 3-5๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ์ดํ•ฉ์€ 25๊ฐ€ ๋˜๊ฒ ์ฃ ?

 

 

 

๊ทธ ๋‹ค์Œ์œผ๋กœ ๋‚ฎ์€ 4-5๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ์š”...

 

์—ฌ๊ธฐ์„œ ์ž ๊น 4-5๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ฏ

 

 

 

์œ„์—์„œ์™€ ๊ฐ™์ด ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๋Š” ์—ฐ๊ฒฐ์€ ์ œ์™ธ์‹œ์ผœ์ค๋‹ˆ๋‹ค!

 

๊ทธ ๋‹ค์Œ์œผ๋กœ ๋‚ฎ์€ 1-2๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋ฉด ์ดํ•ฉ์ด 48์ด ๋˜๊ฒ ์ฃ ?

 

 

 

๊ทธ ๋‹ค์Œ์œผ๋กœ ๋‚ฎ์€ 2-5์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋ฉด ์ดํ•ฉ์€ 94๊ฐ€ ๋˜๊ณ  ๋ชจ๋“  ์ˆซ์ž๊ฐ€ 4 - 3 - 5 - 2 - 1 ๋กœ ์—ฐ๊ฒฐ๋œ๊ฑธ ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!!

 

 

 

๋งจ ๋งˆ์ง€๋ง‰์ธ 1 - 4๋Š” 4- 3 - 5 - 2 - 1์˜ ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๋ฏ€๋กœ ์ œ์™ธ์‹œ์ผœ์ฃผ๊ณ  ๋„˜์–ด๊ฐ€์ฃผ๋ฉด ๊ฐ€์žฅ ๋‚ฎ์€ ์ดํ•ฉ์€ 94๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

ํฌ๋ฃจ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กฐ๊ธˆ์€ ์ดํ•ด๊ฐ€ ๋˜์…จ๋‚˜์š”?


728x90

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•˜๋Š”์ง€ ์•Œ๊นŒ์š”?๐Ÿง

 

๋ฐ”๋กœ ๋ถ€๋ชจ๋ฅผ ๊ฐ ์ˆซ์ž๋งˆ๋‹ค ์ •ํ•ด์ฃผ๋Š”๊ฒ๋‹ˆ๋‹ค. (๊ฐ‘์ž๊ธฐ ๋ถ€๋ชจ๊ฐ€ ๋‚˜์™€์„œ ๋‹นํ™ฉ์Šค๋Ÿฌ์šฐ์‹คํ…๋ฐ์š”.) ๐Ÿ˜Ÿ

 

๋งŒ์•ฝ ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด ์—ฐ๊ฒฐํ•˜๋Š” ์ˆซ์ž ์ค‘ ๋” ๋‚ฎ์€ ์ˆซ์ž(์™ผ์ชฝ๊ฐ’)๋ฅผ ๋‘ ์ˆซ์ž์˜ ๋ถ€๋ชจ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ˆซ์ž์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์‚ฌ์ดํด์ด ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ๋ชจ๋‘ ๋ถ€๋ชจ๊ฐ€ ์žˆ๋‹ค๋ฉด ์™ผ์ชฝ๊ฐ’์˜ ๋ถ€๋ชจ๋กœ ์˜ค๋ฅธ์ชฝ ๊ฐ’์˜ ๋ถ€๋ชจ์™€ ๊ทธ ์ž์‹๋“ค์˜ ๋ถ€๋ชจ๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.


์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด ์–ด๋ ค์šฐ๋‹ˆ ์˜ˆ์ œ๋กœ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”!!

 

 3-4๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ์„๋•Œ 3์˜ ๋ถ€๋ชจ์™€ 4์˜ ๋ถ€๋ชจ๊ฐ€ ๋ชจ๋‘ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ˆซ์ž ์ค‘ ์™ผ์ชฝ์ธ 3์ด 3๊ณผ 4์˜ ๋ถ€๋ชจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด 3์˜ ๋ถ€๋ชจ๋Š” 3์ด ๋˜๊ณ  4์˜ ๋ถ€๋ชจ๋Š” 3์ด ๋˜๊ฒ ์ฃ ? (๋ถ€๋ชจ๋Š” ์ฃผํ™ฉ์ƒ‰ ๋„ค๋ชจ ๋ฐ•์Šค๋กœ ํ‘œ์‹œํ•ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.)

 

 

 

๊ทธ ๋‹ค์Œ์œผ๋กœ 3 - 5๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์—ฐ๊ฒฐ๋˜๋Š” ์™ผ์ชฝ๊ฐ’์œผ๋กœ ๊ทธ ๋ถ€๋ชจ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

1 - 2์˜ ์—ฐ๊ฒฐ์€ 3 - 4์˜ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์ด ์™ผ์ชฝ ์ˆซ์ž๊ฐ€ ๋ถ€๋ชจ๊ฐ€ ๋˜๊ฒ ์ฃ ?

 

 

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•˜๋Š” 4 - 5์˜ ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ฏธ 4์™€ 5๋Š” ๋ถ€๋ชจ๊ฐ€ ์žˆ์ฃ ? ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ ๋ชจ๋‘ 3์ด๋„ค์š”.

 

๊ณ ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ๋‘ ์ชฝ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™๊ฒŒ ๋˜์–ด ์‚ฌ์ดํด์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ์ฃ !!

 

 

๋งˆ์ € ์„ค๋ช…๋“œ๋ฆฌ๋ฉด 1 - 2์˜ ์—ฐ๊ฒฐ์€ 3 - 4์™€์˜ ์—ฐ๊ฒฐ์ฒ˜๋Ÿผ ์™ผ์ชฝ๊ฐ’์ด ๋ถ€๋ชจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ 2 - 5๋ฅผ ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 

2์˜ ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์ด๊ณ  5์˜ ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ชจ๋‘ ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์™ผ์ชฝ์˜ ๋ถ€๋ชจ๋กœ ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋˜๊ณ  5์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ˆซ์ž์˜ ๋ถ€๋ชจ ๋˜ํ•œ ๋™์ผํ•˜๊ฒŒ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

๋งˆ์ง€๋ง‰์œผ๋กœ 1 - 4๋ฅผ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด 1์˜ ๋ถ€๋ชจ๋Š” 1์ด๊ณ  4์˜ ๋ถ€๋ชจ๋Š” 1์ด๋ฏ€๋กœ ๊ฐ™์€ ๋ถ€๋ชจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Š” ๊ณง ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•œ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ œ์™ธํ•ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ด๋ ‡๊ฒŒ ํฌ๋ฃจ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”.

 

์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”!!


Source Code

 

 

 

 


P.S

 

์ฒ˜์Œ์—” ํฌ๋ฃจ์Šค์ปฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ๊ฒƒ์„ ๋ชฐ๋ผ์„œ ๊ทธ๋ƒฅ ์™„์ „ํƒ์ƒ‰๊ณผ ์žฌ๊ท€๋กœ ๊ฐ ์ˆซ์ž๋งˆ๋‹ค ์—ฐ๊ฒฐ์˜ ๋ชจ๋‘๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  

 

๊ฐ€์žฅ ๋‚ฎ์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜์ง€์•Š์„๊นŒ? ๋ผ๊ณ  ์ฝ”๋“œ๋ฅผ ์งฐ๋”๋‹ˆ ํšจ์œจ๋„ ๊ต‰์žฅํžˆ ์•ˆ์ข‹๊ณ  ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์ด ์‹คํŒจ๋ผ๊ณ  ๋‚˜์™”๋‹ค....

 

๋ญ”๊ฐ€ ๊ฒ€์ƒ‰ํ•˜์ง€์•Š๊ณ  ๋‚ด ์ƒ๊ฐ์œผ๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๊ณ  ๋‹ค์งํ•˜๊ณ  ํ’€์—ˆ๋”๋‹ˆ ๊ฑฐ์˜ ํ•˜๋ฃจ๋ฅผ ์žก์•„๋จน์—ˆ๋‹ค....

 

๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ •ํ•ด์ง„ ์‹œ๊ฐ„๋งŒํผ๋งŒ ๊ณ ๋ฏผํ•˜๊ณ  ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋ฐ”๋กœ ๊ฒ€์ƒ‰ํ•ด์„œ ํ•™์Šตํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค.....

import Foundation

var costsCopy = [[Int]]()
var nCopy = Int()
var min = 10000000

func solution(_ n:Int, _ costs:[[Int]]) -> Int {
    let numbers = (0..<n).map{$0}
    costsCopy = costs
    nCopy = n
    
    numbers.forEach{
        greedy($0, cost: 0,numbers: Set<Int>(),history: [String]())
    }

    return min
}

func greedy(_ start:Int,cost:Int,numbers:Set<Int>,history:[String]){
    
    if cost >= min {
        return
    }
    
    var currentNumbers = Set(numbers)
    
    currentNumbers.insert(start)
    
    if currentNumbers.count == nCopy {
        print(history,cost)
        min = cost
        return
    }
    
    let startFilter = costsCopy.filter{$0[0] == start || $0[1] == start}
    
    for s in startFilter {
        
        var destination = Int()
        
        if s[0] == start {
            destination = s[1]
        }else {
            destination = s[0]
        }
        var newHistory = history
        let h = "\(start)\(destination)"
        if  history.contains(h) {
            return
        }
        newHistory.append(h)
        
        let currentCost = cost + s[2]
        
        greedy(destination, cost: currentCost,numbers: currentNumbers,history: newHistory)
        
    }
}

solution(4, [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]])

Reference

 

์•„๋ž˜ ๋ธ”๋กœ๊ทธ์˜ ํ’€์ด๊ฐ€ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค)

๊ฐ„๋‹จํ•˜๊ฒŒ ํ’€์–ด๋ดค์ง€๋งŒ ์—ญ์‹œ ์˜ˆ์ƒ๋Œ€๋กœ ๋Œ€๋‹ค์ˆ˜ ์ผ€์ด์Šค๊ฐ€ ์‹คํŒจ๋กœ ๋–ด๋‹ค. ํ‘ผ ๋ฐฉ๋ฒ•์€ ๋น„์šฉ ์ˆœ์„œ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜์—ฌ, ์ˆœ์„œ๋Œ€๋กœ ๋‹ค๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜๋Š” ์„ฌ์„ ๊ธฐ๋กํ•ด ๋†“๋Š”๋‹ค. ๋‹ค๋ฆฌ๋ฅผ ์„ค์น˜ํ•  ์œ„์น˜

lipcoder.tistory.com

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€