Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 3055๋ฒˆ - ํƒˆ์ถœ (๊ณจ๋“œ4) (BFS)

๊ฐ์ž ๐Ÿฅ” 2023. 3. 3. 02:11
๋ฐ˜์‘ํ˜•

์—ญ์‹œ๋‚˜ ์ด๋ฌธ์ œ๋„ ๊ณจ๋“œ๋ผ์„œ ๊ฒ๋จน์—ˆ๋Š”๋ฐ, ๋ฌธ์ œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด๋‚˜๊ฐ€๋ฉด์„œ ์•„์ดํŒจ๋“œ์— ์ƒ๊ฐ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋‹ˆ ์กฐ๊ฑด์ฒ˜๋ฆฌ๋งŒ ์ž˜ ํ•ด์ฃผ๋ฉด ์‰ฌ์šด ๋ฌธ์ œ์˜€๋‹ค! 
๊ทผ๋ฐ ์™ค์ผ€ ๋งŽ์ด ํ‹€๋ ธ๋ƒ๊ณ ? ํ•˜ํ•˜ใ…ํ•˜ํ•ณ,,, ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๋Š๋ผ ๋ง‰ printํ•ด์•ผํ•˜๋Š”๋ฐ ์•ˆํ•ด์ฃผ๊ณ  print๋ฌธ ์ง€์›Œ์ง„์ง€๋„ ๋ชจ๋ฅด๊ณ  ๋‹ค๋ฅธ๊ฑฐ ์ˆ˜์ •ํ•˜๊ณ  ์•‰์•„์žˆ๊ณ  ์ƒ์‘ˆ๋ฅผ ํ–ˆ๋‹ค. ... ์•„์šฐ ๊ทธ๋ƒฅ...... ๋ฌธ์ œ๋Š” ๋‹ค ํ’€์—ˆ๋Š”๋ฐ ๋‚˜์˜ ์ž” ์‹ค์ˆ˜๋•Œ๋ฌธ์— ์“ธ๋ฐ์—†์ด ๋ฒ„๋ฆฐ ์‹œ๊ฐ„๋งŒ ๋„ˆ๋ฌด ๋งŽ์•„์„œ ํ™”๊ฐ€ ๋‹จ๋‹จํžˆ ๋‚ฌ๋˜ ๋ฌธ์ œ!

 

โšซ๏ธ ๋ฌธ์ œ

https://www.acmicpc.net/problem/3055

 

3055๋ฒˆ: ํƒˆ์ถœ

์‚ฌ์•…ํ•œ ์•”ํ‘์˜ ๊ตฐ์ฃผ ์ด๋ฏผํ˜์€ ๋“œ๋””์–ด ๋งˆ๋ฒ• ๊ตฌ์Šฌ์„ ์†์— ๋„ฃ์—ˆ๊ณ , ๊ทธ ๋Šฅ๋ ฅ์„ ์‹คํ—˜ํ•ด๋ณด๊ธฐ ์œ„ํ•ด ๊ทผ์ฒ˜์˜ ํ‹ฐ๋–ฑ์ˆฒ์— ํ™์ˆ˜๋ฅผ ์ผ์œผํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ์ด ์ˆฒ์—๋Š” ๊ณ ์Šด๋„์น˜๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์‚ด๊ณ  ์žˆ๋‹ค. ๊ณ ์Šด๋„์น˜๋Š” ์ œ

www.acmicpc.net

 

โšซ๏ธ ์ƒ๊ฐ์˜ ํ๋ฆ„

์–ด์šฐ,,, ๋ฌธ์ œ ์ฝ์ž๋งˆ์ž ๋ญ์ด๋ฆฌ๋งŽ์•„?? ํ•˜๋ฉด์„œ ์•„์ดํŒจ๋“œ์— ๋„์ ์ด๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ... ๋นˆ๊ณณ๋„ ์žˆ๊ณ ,, ๋น„๋ฒ„ ๊ตด.. ๋ฌผ์ด์ฐจ์žˆ๋Š”๊ณณใ„ฑ.. ๋“ฑ๋“ฑ ์šฐ์„  ์ƒ๊ฐ์˜ ํ๋ฆ„์„ ์ •๋ฆฌํ•ด๋ณด์ž.

๐Ÿ”– ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋ผ๊ณ ??

์•„ ์ตœ์†Œ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๊ฑฐ๊ตฌ๋‚˜! ์‹œ๊ฐ„์€ ํ•œ์นธ ์ด๋™ํ• ๋•Œ 1๋ถ„์ด๋ผ๊ณ  ์น˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜! ๊ทธ๋Ÿผ BFS๋ฅผ ์ด์šฉํ•ด์„œ ์‹œ์ž‘๋…ธ๋“œ~๋„์ฐฉ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜๊ฒ ๋„ค? ๊ณ ์Šด๋„์น˜๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์‹œ์ž‘๋…ธ๋“œ๋ผ๊ณ  ์น˜๊ณ , ๋น„๋ฒ„๊ตด์ด ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋„์ฐฉ๋…ธ๋“œ๋ผ๊ณ  ์ณ์„œ ๊ณ ์Šด๋„์น˜๋ฅผ ์ด๋™์‹œ์ผœ๋ณด์ž. ์ด๋ ‡๊ฒŒ ์ƒ๊ฐ์˜ ํ๋ฆ„์„ ๊ฐ€์ ธ๊ฐ”๋‹ค.

๐Ÿ”– ๊ทธ๋ ‡๋‹ค๋ฉด BFS๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

BFS๋Š” ์‹œ์ž‘๋…ธ๋“œ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ queue์— ๋„ฃ์–ด์ฃผ๋ฉด์„œ ์–ด๋–ค ๋…ธ๋“œ๊นŒ์ง€๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ผ์ง€ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋Ÿผ, queue์— ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜๊ฐ’ (x, y)๊ณผ depth๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋˜์ง€์•Š์„๊นŒ? depth์—๋Š” BFS๋‚ด๋ถ€์—์„œ ๋ช‡๊ฐœ์˜ ๊ฐ„์„ ์„ ์ง€๋‚ฌ๋Š”์ง€ ์ ์–ด์ฃผ์ž. ๊ทธ๋Ÿผ ์ด๊ฒŒ ์‹œ๊ฐ„์ด ๋˜๊ฒ ๋„ค?

๐Ÿ”– BFS๋ฅผ ์งœ๊ธฐ์ „์— ๊ทธ๋Ÿผ ์‹œ๊ฐ„๋ณต์žก๋„ ๋จผ์ € ์‚ดํŽด๋ณด์ž

BFS๋Š” ํ•œ๊ฐœ์˜ ๋…ธ๋“œ๋‹น N๋ฒˆ์˜ for loop๋ฅผ ๋Œ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— O(N)์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ์š”๋œ๋‹ค. ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ๋˜ queue ๋‚ด๋ถ€์— ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๋–„๊นŒ์ง€ while ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ธฐ ๋–„๋ฌธ์— O(N^2)์ด ์†Œ์š”๋œ๋‹ค. 

N์˜ ๋ฒ”์œ„๋Š”? 50๋ณด๋‹ค ์ž‘์€์ˆ˜๋‹ค! ์™€,,, ์ตœ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋„ 2500๋ฒˆ์ด๊ธฐ ๋•Œ๋ฌธ์— BFS๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฑฐ ์Œ‰๊ฐ€๋Šฅ์ด๊ฒŸ๊ณ ๋งŒ!

๐Ÿ”– ๊ทธ๋Ÿผ ์ด์ œ !! BFS๋ฅผ ์ˆ˜๋„์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์ž

๋‹ค์Œ ์‹œ๊ฐ„์— ๋ฌผ์ด ์ฐจ๋Š” ๊ณณ์€ ๊ณ ์Šด๋„์น˜๊ฐ€ ์›€์ง์ด์ง€ ๋ชปํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ, ๋ฌผ์„ ๋จผ์ € ์ฑ„์›Œ์ฃผ๊ณ , ๊ทธ๋‹ค์Œ ๊ณ ์Šด๋„์น˜๋ฅผ ์›€์ง์—ฌ์ฃผ๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜! ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋”ฐ. ๊ทธ๋ ‡๊ฒŒ ๋Œ€์ถฉ ์ฝ”๋“œ๋ฅผ ์งœ๋ณธ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ฒ˜์Œ์— ์ƒ๊ฐํ•œ ๋ฐฉ์‹์€ while๋ฌธ ๋‚ด๋ถ€์—์„œ *(๋ฌผ)์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ๊ณ , ๋ฌผ ์‚ฌ๋ฐฉ์„ ๋‹ค ๋ฌผ๋กœ ๋ฎ์–ด๋ฒ„๋ฆฐ ํ›„, ๊ณ ์Šด๋„์น˜๋ฅผ ์‚ฌ๋ฐฉ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ทธ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ,,, ๋‹น์—ฐํžˆ ํ‹€๋ฆฌ๊ณ  ๋ง์•˜๋”ฐ! ์™œ ํ‹€๋ ธ๋ƒ!!!

 

โŒ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค (1)

ํ‹€๋ ธ์„๋•Œ, ๋จธ๋ฆฌ๋กœ๋Š” ๋„์ €ํžˆ ์ฝ”๋“œ ์ˆ˜์ •์„ ๋ชปํ•  ๊ฒƒ ๊ฐ™์•„์„œ queue๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋ฐฉ์‹, ๋ฌผ์€ ์–ด๋””์— ์ฐจ๋Š”์ง€ ์ „๋ถ€ print๋กœ ์ฐ์–ด๋ดค๋‹ค. ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ง€๊ธˆ ๋‚ด ์ˆ˜๋„์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, while๋ฌธ์—์„œ queue๋ฅผ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ• ๋•Œ๋งˆ๋‹ค ๋ฌผ์„ ์ฑ„์›Œ์ฃผ๊ณ  ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๊ฐ€ ๋งŽ์•„์„œ queue ์— [2, 0, 1] , [2, 1, 1] ์ด๋ ‡๊ฒŒ ์Œ“์—ฌ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. (x, y, depth ์ˆœ) ์ฒ˜์Œ์— [2, 0, 1]์ด pop ๋˜์—ˆ์„ ๋•Œ depth ๋Š” 1์ด๋‹ค. ์‹œ๊ฐ„์ด 1์ด ์ง€๋‚ฌ์„๋•Œ์˜ ๋ฌผ์ด ์ฑ„์›Œ์ง„ ํ˜•ํƒœ์—ฌ์•ผํ•œ๋‹ค. ๋‹ค์Œ queue๊ฐ€ pop๋˜์—ˆ์„๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ depth๊ฐ€ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋‚˜๋Š” ๋˜! ๋ฌผ์„ ์ฑ„์›Œ์ค€ ๊ฒƒ์ด๋‹ค.

๐Ÿ”– ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ depth๋ณ„๋กœ ๋ฌผ์„ ์ฑ„์›Œ์ฃผ์ง€??

์ฒ˜์Œ์— ๋ฐ”๋ณด๊ฐ™์ด depth๊ฐ€ 1์ด๋ฉด for๋ฌธ์œผ๋กœ 1๋ฒˆ ๋Œ๋ ค์„œ ์ดˆ๊ธฐ ์ž…๋ ฅ๋ฐ›์€ arr๋กœ๋ถ€ํ„ฐ ๋ฌผ์„ 1๋ฒˆ ์ฑ„์›Œ์ฃผ๊ณ , depth๊ฐ€ 2์ด๋ฉด ๋˜ ์ดˆ๊ธฐ ์ž…๋ ฅ๋ฐ›์€ arr๋กœ๋ถ€ํ„ฐ for๋ฌธ์„ depth๋งŒํผ ๋Œ๋ ค์„œ ๋ฌผ์„ 2๋ฒˆ ์ฑ„์›Œ์ฃผ๊ณ .. ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค. ์ง„์งœ ใ„นใ…‡ 1์ฐจ์›์ ์ธ ์ƒ๊ฐ ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

๋‹น์—ฐํžˆ xcode ๋‚ด๋ถ€์—์„œ๋„ ๊ฒฐ๊ณผ๊ฐ’์ด ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋„๋ก ๋‚˜์˜ค์ง€ ์•Š๋Š” ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ์žก์•„๋จน์—ˆ๋”ฐ. ๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•œ๊ฒŒ....

queue๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด, depth ์ˆœ์„œ๋Œ€๋กœ queue์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ๋ฅผ print ํ•ด๋ดค๋Š”๋ฐ,, depth๋Š” 0, 0, 1,1,1,1,2,2,2,2,,,, ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์”ฉ ์ปค์ง€๋ฉด์„œ queue์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ!! ํŒ๋‹จํ•œ๊ฒŒ, depth๊ฐ€ ์ด์ „๊ฐ’๊ณผ ๋‹ฌ๋ผ์ง€๋ฉด? ๋ฌผ์„ ์ฑ„์›Œ๋ผ!~ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟจ๋‹ค. 

// ์–ด์ฐจํ”ผ depth๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฆ๊ฐ€ -> ๋ณ€ํ•˜๋ฉด ํ•˜๋‚˜ ๋ฌผ์ฑ„์›Œ์ง„ ์ง€๋„๋กœ ์‚ฌ์šฉ
if waterfillCount != depth {
    waterfillCount = depth
    fillwater()
}

โŒ ์‹œ๊ฐ„์ดˆ๊ณผ (1)

์•„ ์™œ ๋˜ ์‹œ๊ฐ„์ดˆ๊ณผ!! ์™ค๊นŒ.... ์ž์ž.... ๋‹ค์‹œ ์œ„์— queue๋ฅผ ๋ณด์ž.

์—ฌ๊ธฐ ๋“œ๋ž˜๊ทธ ํ•ด๋†“์€๋ฐ๋ฅผ ๋ณด๋ฉด,, queue ๋‚ด๋ถ€์— ๋™์ผํ•œ ๋…ธ๋“œ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค! ์™œ๋ƒ๋ฉด,,, ๋‚ด๊ฐ€ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๊ทธ๋ ‡๋‹ค. ์ดˆ๋ฐ˜์—๋Š” ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์™œ๋ƒ๋ฉด? ์™”๋‹ค๊ฐ€ ๋˜๋Œ์•„๊ฐ€๋Š” route๋ฉด, ์–ด์ฐจํ”ผ depth๊ฐ€ ํ•œ๋‹จ๊ณ„ ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๊ฐ’์—๋Š” ํฌ๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทผ๋ฐ,, ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด queue๊ฐ€ ๋ฌด์ง€๋ง‰์ง€ํ•˜๊ฒŒ ์ปค์ง€๊ฒŒ ๋˜๊ณ , queue๋‚ด๋ถ€์—์„œ popํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋” ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•œ๋‹ค.

BFS๋Š” queue ๋‚ด๋ถ€์—์„œ ์žก์•„๋จน๋Š” ๊ณต๊ฐ„๋ณต์žก๋„๊ฐ€ ์‹œ๊ฐ„์— ํฌ๊ฒŒ ์˜ํ–ฅ์„ ์ค€๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์—ˆ๋‹ค... ์•„๋‹ˆ ๊ณ ์ƒˆ ์žŠ์—ˆ์–ด??? 

ํ•œ๋ฒˆ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋˜ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š”๋‹ค! ๋ผ๋Š” ์กฐ๊ฑด์ด ์—†์ง€๋งŒ, ์™”๋‹ค๊ฐ€ ๋˜๋Œ์•„๊ฐ€๋Š” ๋ฃจํŠธ๋Š” ์–ด์ฐจํ”ผ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— visited๋ผ๋Š” ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , ์ด๋Ÿฐ์ผ์ด ์—†๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์ž.... ๊ทธ๋ž˜์•ผ... ์‹œ๊ฐ„์ด ์กฐ๊ธˆ์ด๋ผ๋„ ๋œ๋“ค์ง€.. ํ›„..

๊ทธ ๊ฒฐ๊ณผ,,, ํ†ต๊ณผ ๐Ÿฅฐ ์–ด์šฐ.. ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ๋ฒ„๋ ธ์–ด์„œ ๋„ˆ๋ฌด ๊ธฐ๋ปค๋‹ค.... (์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š” ๋ณ€์ˆ˜ ๋ช… ์˜คํƒ€๋‚˜์„œ ๐Ÿ˜…)

 

โšซ๏ธ ์ •๋‹ต์ฝ”๋“œ

์•„ ๊ทธ๋ฆฌ๊ณ , ์ฝ”๋“œ ๋ณด๋ฉด fillwater ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ removefirst ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์“ธ๋ฐ์—†์ด ์‹œ๊ฐ„์„ ์žก์•„๋จน๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ๋„ ๊ฐœ์„ ํ•ด์คฌ๋‹ค! (์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์ฃผ์„๋‹ฌ์•„์„œ ์•„๋ž˜ ์ ์–ด๋†จ๋‹ค.)

import Foundation

let rc = readLine()!.split(separator: " ").map{ Int($0)! }
var maps = [[String]]()
var start = [0, 0]
var end = [0, 0]
var water = [[Int]]()

for i in 0..<rc[0] {
    let temp = readLine()!.map{ String($0) }
    if temp.contains("D") {
        end = [i, temp.firstIndex(of: "D")!]
    }

    if temp.contains("S") {
        start = [i, temp.firstIndex(of: "S")!]
    }

    for t in temp {
        if t == "*" {
            water.append([i, temp.firstIndex(of: t)!])
        }
    }

    maps.append(temp)
}

var visited = Array(repeating: Array(repeating: false, count: rc[1]), count: rc[0])
let dx = [-1, 1, 0, 0]
let dy = [0, 0, -1, 1]

func bfs() {
    var flag = false
    var queue = [[Int]]() // [x, y, depth]
    queue.append([start[0], start[1], 0])
    visited[start[0]][start[1]] = true
    var waterfillCount = -999

    while !queue.isEmpty {
        // ๊ณ ์Šด๋„์น˜ S ์ด๋™์‹œ์ผœ์ฃผ๊ธฐ
        let q = queue.removeFirst()
        let x = q[0]
        let y = q[1]
        let depth = q[2]

        // ์–ด์ฐจํ”ผ depth๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ฆ๊ฐ€ -> ๋ณ€ํ•˜๋ฉด ํ•˜๋‚˜ ๋ฌผ์ฑ„์›Œ์ง„ ์ง€๋„๋กœ ์‚ฌ์šฉ
        if waterfillCount != depth {
            waterfillCount = depth
            fillwater()
        }

        if x == end[0], y == end[1] {
            print(depth)
            flag = true
            break
        }

        for i in 0..<4 {
            let nx = x + dx[i]
            let ny = y + dy[i]

            if nx < 0 || ny < 0 || nx >= rc[0] || ny >= rc[1] {
                continue
            }

            // ๋Œ์ด๊ฑฐ๋‚˜ ๋ฌผ์ด๋ฉด pass
            if maps[nx][ny] == "X" || maps[nx][ny] == "*" {
                continue
            }

            // maps์—์„œ ๋น„์–ด์žˆ๋Š”๊ณณ์ด๋ฉด, ํ์— ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ์ธ์ ‘๋…ธ๋“œ๋กœ ์ถ”๊ฐ€
            // visited ๊ผญํ•ด์ค˜์•ผ ์‹œ๊ฐ„์ดˆ๊ณผ ์•ˆ๋‚จ ;
            if (maps[nx][ny] == "." || maps[nx][ny] == "D"), !visited[nx][ny] {
                visited[nx][ny] = true
                queue.append([nx, ny, depth + 1])
            }
        }
    }

    if !flag {
        print("KAKTUS")
    }
}

// ๋ฌผ์„ ์ฑ„์›Œ์ฃผ๋Š” ํ•จ์ˆ˜
// ์–ด์ฐจํ”ผ water ๋‚ด๋ถ€์—์„œ๋งŒ ์ˆœ์„œ๋Œ€๋กœ ๋Œ๋ฆฌ๋ฉด๋ผ
// ๊ทธ๋ฆฌ๊ณ  temp๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ฃผ์ž... O(N^2) -> O(N) ์Œ‰๊ฐ€๋Šฅ (์ด์ง€๋งŒ ๋‘๋ฒˆ์งธ ์‹œ๋„๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚˜๊ณ  ๋ง์•˜๋‹ค)
func fillwater() {
    var temp = [[Int]]()

    for w in water {
        let waterX = w[0]
        let waterY = w[1]

        for i in 0..<4 {
            let nwx = waterX + dx[i]
            let nwy = waterY + dy[i]

            if nwx < 0 || nwy < 0 || nwx >= rc[0] || nwy >= rc[1] {
                continue
            }

            if maps[nwx][nwy] == "." {
                maps[nwx][nwy] = "*"
                temp.append([nwx, nwy])
            }
        }
    }
    water = temp
}

// โŒ ์ฒซ๋ฒˆ์งธ ์‹œ๋„ -> ์‹œ๊ฐ„์ดˆ๊ณผ
// ๋ฌผ ์ด๋™์‹œํ‚ค๋Š”๊ฑฐ -> maps ๋งŒ ๋ณ€ํ™”์‹œ์ผœ์ฃผ๋ฉด ๋˜๋Š”๋ฐ ์“ธ๋ฐ์—†์ด removeFirst์กฐ์ง€๊ณ  ์žˆ์—ˆ์Œ
func timeover_fillwater() {
    let waterCnt = water.count
    var maps = maps

    for _ in 0..<waterCnt {
        let waterPlace = water.removeFirst()
        let waterX = waterPlace[0]
        let waterY = waterPlace[1]

        for i in 0..<4 {
            let nwx = waterX + dx[i]
            let nwy = waterY + dy[i]

            if nwx < 0 || nwy < 0 || nwx >= rc[0] || nwy >= rc[1] {
                continue
            }

            if maps[nwx][nwy] == "X" || maps[nwx][nwy] == "*" {
                continue
            }

            maps[nwx][nwy] = "*"
            water.append([nwx, nwy])
        }
    }
}

bfs()

 

๋ฐ˜์‘ํ˜•