J

[JAVA] BOJ ๋ฐฑ์ค€ 19237 ์–ด๋ฅธ ์ƒ์–ด ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 19237 ์–ด๋ฅธ ์ƒ์–ด

snowball๐Ÿฐ 2023. 3. 6. 12:47

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

 

19237๋ฒˆ: ์–ด๋ฅธ ์ƒ์–ด

์ฒซ ์ค„์—๋Š” N, M, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000) ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฒฉ์ž์˜ ๋ชจ์Šต์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ์นธ์ด๊ณ , 0์ด ์•„๋‹Œ ์ˆ˜ x๋Š” x๋ฒˆ ์ƒ์–ด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์นธ์„ ์˜๋ฏธ

www.acmicpc.net

๋ฌธ์ œ

์ฒญ์†Œ๋…„ ์ƒ์–ด๋Š” ๋”์šฑ ์ž๋ผ ์–ด๋ฅธ ์ƒ์–ด๊ฐ€ ๋˜์—ˆ๋‹ค. ์ƒ์–ด๊ฐ€ ์‚ฌ๋Š” ๊ณต๊ฐ„์— ๋” ์ด์ƒ ๋ฌผ๊ณ ๊ธฐ๋Š” ์˜ค์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ƒ์–ด๋“ค๋งŒ์ด ๋‚จ์•„์žˆ๋‹ค. ์ƒ์–ด์—๋Š” 1 ์ด์ƒ M ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ๊ณ , ๋ชจ๋“  ๋ฒˆํ˜ธ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. ์ƒ์–ด๋“ค์€ ์˜์—ญ์„ ์‚ฌ์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ƒ์–ด๋“ค์„ ์ซ“์•„๋‚ด๋ ค๊ณ  ํ•˜๋Š”๋ฐ, 1์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ์–ด๋ฅธ ์ƒ์–ด๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•ด์„œ ๋‚˜๋จธ์ง€ ๋ชจ๋‘๋ฅผ ์ซ“์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

N×N ํฌ๊ธฐ์˜ ๊ฒฉ์ž ์ค‘ M๊ฐœ์˜ ์นธ์— ์ƒ์–ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ์”ฉ ๋“ค์–ด ์žˆ๋‹ค. ๋งจ ์ฒ˜์Œ์—๋Š” ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ์ž์‹ ์˜ ์œ„์น˜์— ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ๋‹ค. ๊ทธ ํ›„ 1์ดˆ๋งˆ๋‹ค ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ๋™์‹œ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ์นธ ์ค‘ ํ•˜๋‚˜๋กœ ์ด๋™ํ•˜๊ณ , ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋ฅผ ๊ทธ ์นธ์— ๋ฟŒ๋ฆฐ๋‹ค. ๋ƒ„์ƒˆ๋Š” ์ƒ์–ด๊ฐ€ k๋ฒˆ ์ด๋™ํ•˜๊ณ  ๋‚˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.

๊ฐ ์ƒ์–ด๊ฐ€ ์ด๋™ ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•  ๋•Œ๋Š”, ๋จผ์ € ์ธ์ ‘ํ•œ ์นธ ์ค‘ ์•„๋ฌด ๋ƒ„์ƒˆ๊ฐ€ ์—†๋Š” ์นธ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์žก๋Š”๋‹ค. ๊ทธ๋Ÿฐ ์นธ์ด ์—†์œผ๋ฉด ์ž์‹ ์˜ ๋ƒ„์ƒˆ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์žก๋Š”๋‹ค. ์ด๋•Œ ๊ฐ€๋Šฅํ•œ ์นธ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ๊ฒฝ์šฐ์—๋Š” ํŠน์ •ํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋”ฐ๋ฅธ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” ์ƒ์–ด๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ์ƒ์–ด๋ผ๋„ ํ˜„์žฌ ์ƒ์–ด๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ๋˜ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์–ด๊ฐ€ ๋งจ ์ฒ˜์Œ์— ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๊ณ , ๊ทธ ํ›„์—๋Š” ๋ฐฉ๊ธˆ ์ด๋™ํ•œ ๋ฐฉํ–ฅ์ด ๋ณด๊ณ  ์žˆ๋Š” ๋ฐฉํ–ฅ์ด ๋œ๋‹ค.

๋ชจ๋“  ์ƒ์–ด๊ฐ€ ์ด๋™ํ•œ ํ›„ ํ•œ ์นธ์— ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ์ƒ์–ด๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉด, ๊ฐ€์žฅ ์ž‘์€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ง„ ์ƒ์–ด๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ์ซ“๊ฒจ๋‚œ๋‹ค.

<๊ทธ๋ฆผ 1>

<๊ทธ๋ฆผ 1>์€ ๋งจ ์ฒ˜์Œ์— ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, <ํ‘œ 1>์—๋Š” ๊ฐ ์ƒ์–ด ๋ฐ ํ˜„์žฌ ๋ฐฉํ–ฅ์— ๋”ฐ๋ฅธ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” k = 4์ด๋‹ค. ์™ผ์ชฝ ํ•˜๋‹จ์— ์ ํžŒ ์ •์ˆ˜๋Š” ๋ƒ„์ƒˆ๋ฅผ ์˜๋ฏธํ•˜๊ณ , ๊ทธ ๊ฐ’์€ ์‚ฌ๋ผ์ง€๊ธฐ๊นŒ์ง€ ๋‚จ์€ ์‹œ๊ฐ„์ด๋‹ค. ์ขŒ์ธก ์ƒ๋‹จ์— ์ ํžŒ ์ •์ˆ˜๋Š” ์ƒ์–ด์˜ ๋ฒˆํ˜ธ ๋˜๋Š” ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ ์ƒ์–ด์˜ ๋ฒˆํ˜ธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

<๊ทธ๋ฆผ 2>

<๊ทธ๋ฆผ 3>

<๊ทธ๋ฆผ 2>๋Š” ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ํ•œ ์นธ ์ด๋™ํ•˜๊ณ  ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ ์ƒํƒœ์ด๊ณ , <๊ทธ๋ฆผ 3>์€ <๊ทธ๋ฆผ 2>์˜ ์ƒํƒœ์—์„œ ํ•œ ์นธ ๋” ์ด๋™ํ•œ ๊ฒƒ์ด๋‹ค. (2, 4)์—๋Š” ์ƒ์–ด 2๊ณผ 4๊ฐ€ ๊ฐ™์ด ๋„๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์–ด 4๋Š” ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ์ซ“๊ฒจ๋‚ฌ๋‹ค.

<๊ทธ๋ฆผ 4>

<๊ทธ๋ฆผ 5>

<๊ทธ๋ฆผ 4>์€ ๊ฒฉ์ž์— ๋‚จ์•„์žˆ๋Š” ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ํ•œ ์นธ ์ด๋™ํ•˜๊ณ  ์ž์‹ ์˜ ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ ์ƒํƒœ, <๊ทธ๋ฆผ 5>๋Š” <๊ทธ๋ฆผ 4>์—์„œ ํ•œ ์นธ ๋” ์ด๋™ํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ƒ์–ด 2๋Š” ์ธ์ ‘ํ•œ ์นธ ์ค‘์— ์•„๋ฌด ๋ƒ„์ƒˆ๋„ ์—†๋Š” ์นธ์ด ์—†์œผ๋ฏ€๋กœ ์ž์‹ ์˜ ๋ƒ„์ƒˆ๊ฐ€ ๋“ค์–ด์žˆ๋Š” (2, 4)์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค. ์ƒ์–ด๊ฐ€ ์ด๋™ํ•œ ํ›„์—, ๋งจ ์ฒ˜์Œ์— ๊ฐ ์ƒ์–ด๊ฐ€ ๋ฟŒ๋ฆฐ ๋ƒ„์ƒˆ๋Š” ์‚ฌ๋ผ์กŒ๋‹ค.

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•  ๋•Œ, 1๋ฒˆ ์ƒ์–ด๋งŒ ๊ฒฉ์ž์— ๋‚จ๊ฒŒ ๋˜๊ธฐ๊นŒ์ง€ ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” N, M, k๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 20, 2 ≤ M ≤ N2, 1 ≤ k ≤ 1,000)

๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฒฉ์ž์˜ ๋ชจ์Šต์ด ์ฃผ์–ด์ง„๋‹ค. 0์€ ๋นˆ์นธ์ด๊ณ , 0์ด ์•„๋‹Œ ์ˆ˜ x๋Š” x๋ฒˆ ์ƒ์–ด๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์นธ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ๊ฐ ์ƒ์–ด์˜ ๋ฐฉํ–ฅ์ด ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. 1, 2, 3, 4๋Š” ๊ฐ๊ฐ ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ ์ƒ์–ด์˜ ๋ฐฉํ–ฅ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์ƒ์–ด ๋‹น 4์ค„์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์€ 4๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ ์ƒ์–ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋„ค ์ค„ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ํ•ด๋‹น ์ƒ์–ด๊ฐ€ ์œ„๋ฅผ ํ–ฅํ•  ๋•Œ์˜ ๋ฐฉํ–ฅ ์šฐ์„ ์ˆœ์œ„, ๋‘ ๋ฒˆ์งธ ์ค„์€ ์•„๋ž˜๋ฅผ ํ–ฅํ•  ๋•Œ์˜ ์šฐ์„ ์ˆœ์œ„, ์„ธ ๋ฒˆ์งธ ์ค„์€ ์™ผ์ชฝ์„ ํ–ฅํ•  ๋•Œ์˜ ์šฐ์„ ์ˆœ์œ„, ๋„ค ๋ฒˆ์งธ ์ค„์€ ์˜ค๋ฅธ์ชฝ์„ ํ–ฅํ•  ๋•Œ์˜ ์šฐ์„ ์ˆœ์œ„์ด๋‹ค. ๊ฐ ์šฐ์„ ์ˆœ์œ„์—๋Š” 1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ๋‚˜ํƒ€๋‚œ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๋ฐฉํ–ฅ์ด ์ตœ์šฐ์„ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ์„ ์ˆœ์œ„๊ฐ€ 1 3 2 4๋ผ๋ฉด, ๋ฐฉํ–ฅ์˜ ์ˆœ์„œ๋Š” ์œ„, ์™ผ์ชฝ, ์•„๋ž˜, ์˜ค๋ฅธ์ชฝ์ด๋‹ค.

๋งจ ์ฒ˜์Œ์—๋Š” ๊ฐ ์ƒ์–ด๋งˆ๋‹ค ์ธ์ ‘ํ•œ ๋นˆ ์นธ์ด ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๋™์„ ๋ชป ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

1๋ฒˆ ์ƒ์–ด๋งŒ ๊ฒฉ์ž์— ๋‚จ๊ฒŒ ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋‹จ, 1,000์ดˆ๊ฐ€ ๋„˜์–ด๋„ ๋‹ค๋ฅธ ์ƒ์–ด๊ฐ€ ๊ฒฉ์ž์— ๋‚จ์•„ ์žˆ์œผ๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฌธ์ œ ์š”์•ฝ

์–ด๋ฅธ ์ƒ์–ด๋“ค์€ ์„œ๋กœ ์˜์—ญ ์‹ธ์›€์„ ํ•œ๋‹ค. ์ˆซ์ž๊ฐ€ ์ž‘์„ ์ˆ˜๋ก ๊ฐ•ํ•œ ์ƒ์–ด์ด๋‹ค.

1์ดˆ๋งˆ๋‹ค ์ƒ์–ด๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

  1. ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ “๋™์‹œ์—” ์ด๋™ํ•œ๋‹ค.
  2. ๋„์ฐฉํ•œ ์นธ์— ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฐ๋‹ค.
  3. ๋ƒ„์ƒˆ๋Š” k๋ฒˆ ์ด๋™ํ•˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.
  4. ๋ชจ๋“  ์ƒ์–ด๊ฐ€ ์ด๋™ ํ›„ ํ•œ ์นธ์— ์žˆ๋Š” ์ƒ์–ด๋Š” ๊ฐ€์žฅ ์ˆซ์ž๊ฐ€ ์ž‘์€ ์ƒ์–ด(๊ฐ•ํ•œ ์ƒ์–ด)์ด๋‹ค.

์ด๋•Œ ์ด๋™ ์œ„์น˜์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์•„๋ฌด ๋ƒ„์ƒˆ ์—†๋Š” ๊ณณ
  2. ์ž์‹ ์˜ ๋ƒ„์ƒˆ๊ฐ€ ์žˆ๋Š” ๊ณณ

๊ฐ™์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ๊ณณ์€ ํ•˜๋‚˜๊ฐ€ ์•„๋‹์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ๋Š” ํŠน์ •ํ•œ ๋ฐฉํ–ฅ ์šฐ์„ ์ˆœ์œ„๋กœ ๊ฒฐ์ •ํ•œ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” ์ƒ์–ด๋งˆ๋‹ค ๋‹ค๋ฅด๋‹ค.

1๋ฒˆ ์ƒ์–ด๋งŒ ๊ฒฉ์ž์— ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ช‡์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š”์ง€ ๊ตฌํ•˜์ž!

์ „์ฒด ์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {
	static int N, M ;
	static int t, k;
	static int[][] water;
	static int[][][] dir;
	static int[][][] smell;
	static int[] D;
	static int[] dx = {0, -1, 1, 0, 0};
	static int[] dy = {0, 0, 0, -1, 1};
	public static void main(String[] args) throws Exception {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
		StringBuilder sb = new StringBuilder();
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		water = new int[N][N];
		smell = new int[N][N][2];
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(bf.readLine(), " ");
			for(int j=0; j<N; j++) {
				water[i][j] = Integer.parseInt(st.nextToken());
				if(water[i][j] > 0) {smell[i][j][0] = water[i][j]; smell[i][j][1] = k;}
			}
		}
		D = new int[M+1];
		st = new StringTokenizer(bf.readLine(), " ");
		for(int i = 1; i<=M; i++)
			D[i] = Integer.parseInt(st.nextToken());
		
		dir = new int[M+1][5][5];
		for(int i=1; i<=M; i++) {
			for(int d = 1; d<=4; d++) {
				st = new StringTokenizer(bf.readLine(), " ");
				for(int u=1; u<=4; u++)
					dir[i][d][u] = Integer.parseInt(st.nextToken());
			}
		}
		for(t=1; t<=1001; t++) {
			if(t == 1001) break;
			move();
			if(M == 1) break;
		}
		if(t == 1001) t = -1;
		System.out.println(t);
	}
	static void move() {
		int[][] tmp = new int[N][N];
		ArrayDeque<int[]> newsmell = new ArrayDeque<>();
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				if(water[i][j] == 0) continue;
				int s = water[i][j]; int mx = N; int my = N; int md = 0;
				for(int d = 1; d<=4; d++) {
					int ni = i + dx[dir[s][D[s]][d]];
					int nj = j + dy[dir[s][D[s]][d]];
					if(ni < 0 || nj < 0 || ni >= N || nj >= N) continue;
					if(smell[ni][nj][0] != s && smell[ni][nj][1] >= t) continue;
					if(smell[ni][nj][1] < t) {mx = ni; my = nj; md = dir[s][D[s]][d]; break;} // ์ตœ์ ์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ๋‚˜๊ฐ€๋„ ๋จ
					else if(smell[ni][nj][0] == s && mx == N) // mx๊ฐ€ ์•„๋ฌด ์„ ํƒ๋„ ์•ˆ๋œ ๊ฒฝ์šฐ -> ๊ฐ€์žฅ ์ฒ˜์Œ์— ์„ ํƒ๋œ ๋ฐฉํ–ฅ์ด ๋จ
						{mx = ni; my = nj; md = dir[s][D[s]][d];}
				}
				if(tmp[mx][my] == 0) {tmp[mx][my] = water[i][j]; newsmell.offer(new int[] {mx, my, s, t+k});}
				else if(tmp[mx][my] > water[i][j]) {tmp[mx][my] = water[i][j]; M--; newsmell.offer(new int[] {mx, my, s, t+k});}
				else {M--;}
				D[s] = md;
			}
		}
		while(!newsmell.isEmpty()) {
			int[] n = newsmell.poll();
			smell[n[0]][n[1]][0] = n[2];
			smell[n[0]][n[1]][1] = n[3];
		}
		water = tmp;
	}
}

ํ•œ์ค„์”ฉ ์‚ดํŽด๋ณด์ž

static int N, M ;
static int t, k;
static int[][] water;
static int[][][] dir;
static int[][][] smell;
static int[] D;
static int[] dx = {0, -1, 1, 0, 0};
static int[] dy = {0, 0, 0, -1, 1};

N, M, k, water๋Š” ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.

t๋Š” ํ˜„์žฌ๊นŒ์ง€ ํ๋ฅธ ์ดˆ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

dir๋Š” ์–ด๋ฅธ ์ƒ์–ด๋“ค์˜ ๋ฐฉํ–ฅ ์šฐ์„ ์ˆœ์œ„ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด dir[1][1][1] : 1๋ฒˆ ์ƒ์–ด๊ฐ€ ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด 1์ผ ๋•Œ ์ตœ๊ณ  ์šฐ์„ ์ˆœ์œ„(1์œ„)

smell์€ ํ•ด๋‹น ์œ„์น˜์˜ ๋ƒ„์ƒˆ์˜ ์ฃผ์ธ๊ณผ ๋ƒ„์ƒˆ๋ฅผ ๋‚จ๊ธด ์‹œ๊ฐ„ + k๋ฅผ ์ €์žฅํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ˜„์žฌ๋กœ ๋ถ€ํ„ฐ k์ดˆ ํ›„๋ถ€ํ„ฐ ์ด ์œ„์น˜๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฐ›๋Š” ์ •๋ณด์˜ ๋ฐฉํ–ฅ์€ 1~4์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 0์—๋Š” ์ •๋ณด๋ฅผ ์ฃผ์ง€ ์•Š์•˜๋‹ค.

D์—๋Š” ์ƒ์–ด๋“ค์˜ ํ˜„์žฌ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์ €์žฅํ•ด์ค€๋‹ค.

for(int i=0; i<N; i++) {
		st = new StringTokenizer(bf.readLine(), " ");
		for(int j=0; j<N; j++) {
			water[i][j] = Integer.parseInt(st.nextToken());
			if(water[i][j] > 0) {smell[i][j][0] = water[i][j]; smell[i][j][1] = k;}
		}
	}

์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜์—๋„ ๋ƒ„์ƒˆ๋ฅผ ๋ฟŒ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ๊ณผ ๋™์‹œ์— smell์— ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

dir = new int[M+1][5][5];
	for(int i=1; i<=M; i++) {
		for(int d = 1; d<=4; d++) {
			st = new StringTokenizer(bf.readLine(), " ");
			for(int u=1; u<=4; u++)
				dir[i][d][u] = Integer.parseInt(st.nextToken());
		}
	}
	for(t=1; t<=1001; t++) {
		if(t == 1001) break;
		move();
		if(M == 1) break;
	}
	if(t == 1001) t = -1;

dir ๋ณ€์ˆ˜์— ์ƒ์–ด์˜ ์ด๋™ ์œ„์น˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค. ์ด๋•Œ ๋ฐฉํ–ฅ์€ 1~4๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 5๋กœ ์„ ์–ธํ•ด์ค€๋‹ค.

1000์ดˆ ์ดํ›„ ์ด๋™์€ ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— 1001์— for๋ฌธ์„ ์ข…๋ฃŒํ•œ๋‹ค. ์ด๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋Š” -1๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

int[][] tmp = new int[N][N];
	ArrayDeque<int[]> newsmell = new ArrayDeque<>();
	for(int i=0; i<N; i++) {
		for(int j=0; j<N; j++) {
			if(water[i][j] == 0) continue;
			int s = water[i][j]; int mx = N; int my = N; int md = 0;

move()๋Š” ์ƒ์–ด๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด๋™๋œ ์œ„์น˜์™€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๋„๋ก tmp๋ฅผ ์„ ์–ธํ•ด์„œ ์ €์žฅํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

์ƒˆ๋กœ์šด ๋ƒ„์ƒˆ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ deque์„ ์„ ์–ธํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฐ”๋กœ smell์— ์ €์žฅํ•œ๋‹ค๋ฉด ๊ฐฑ์‹ ๋œ smell ๋ฐฐ์—ด๋กœ ์ธํ•ด ๋™์‹œ์— ์ด๋™ํ•˜๋Š” ์ƒ์–ด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 1๋ฒˆ ์ƒ์–ด๊ฐ€ (1, 2)๋กœ ์ด๋™ํ•˜์—ฌ ๋ƒ„์ƒˆ๋ฅผ ๋‚จ๊ธฐ๋ฉด 2๋ฒˆ ์ƒ์–ด๋Š” (1, 2)๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์œ„์น˜๋ฅผ ํ™•์ธํ•˜๊ณ  s์— ์ƒ์–ด์˜ ์ˆซ์ž๋ฅผ ์ €์žฅํ•ด์ค€๋‹ค. mx, my, md๋ฅผ ํ†ตํ•ด ๊ฐฑ์‹ ๋˜๋Š” ์ƒ์–ด์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

for(int d = 1; d<=4; d++) {
		int ni = i + dx[dir[s][D[s]][d]];
		int nj = j + dy[dir[s][D[s]][d]];
		if(ni < 0 || nj < 0 || ni >= N || nj >= N) continue;
		if(smell[ni][nj][0] != s && smell[ni][nj][1] >= t) continue;
		if(smell[ni][nj][1] < t) {mx = ni; my = nj; md = dir[s][D[s]][d]; break;} // ์ตœ์ ์„ ์ฐพ์•˜์œผ๋ฏ€๋กœ ๋‚˜๊ฐ€๋„ ๋จ
		else if(smell[ni][nj][0] == s && mx == N) // mx๊ฐ€ ์•„๋ฌด ์„ ํƒ๋„ ์•ˆ๋œ ๊ฒฝ์šฐ -> ๊ฐ€์žฅ ์ฒ˜์Œ์— ์„ ํƒ๋œ ๋ฐฉํ–ฅ์ด ๋จ
			{mx = ni; my = nj; md = dir[s][D[s]][d];}
	}

4๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•  ๊ฒƒ์ด๋‹ค. dir[s][D[s]][d] ์—๋Š” s๋ฒˆ ์ƒ์–ด์˜ ํ˜„์žฌ ์œ„์น˜ (D[s])์ผ ๋•Œ d๋ฒˆ์งธ ์šฐ์„ ์ˆœ์œ„ ๋ฐฉํ–ฅ์ด ๋‹ด๊ฒจ์žˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„ ๋Œ€๋กœ ํƒ์ƒ‰ํ•˜๊ณ  ๊ฒฉ์ž๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ƒ์–ด์˜ ๋ƒ„์ƒˆ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ continue์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งŒ์•ฝ ๋ƒ„์ƒˆ๋ฅผ ๋‚จ๊ธด ์‹œ๊ฐ„์ด t๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์•„๋ฌด ๋ƒ„์ƒˆ๊ฐ€ ๋‚จ์•„์žˆ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ 1์ˆœ์œ„๋กœ ์ด๋™๊ฐ€๋Šฅํ•œ ๊ณณ์ด ๋œ๋‹ค. ๋ฐ”๋กœ break๋ฅผ ํ•ด๋„ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๊ณณ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ž์‹ ์˜ ๋ƒ„์ƒˆ๊ฐ€ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋จผ์ € ๋งŒ๋‚œ ๊ณณ์„ mx, my์— ์ €์žฅํ•ด์ค€๋‹ค.

		if(tmp[mx][my] == 0) {tmp[mx][my] = water[i][j]; newsmell.offer(new int[] {mx, my, s, t+k});}
		else if(tmp[mx][my] > water[i][j]) {tmp[mx][my] = water[i][j]; M--; newsmell.offer(new int[] {mx, my, s, t+k});}
		else {M--;}
		D[s] = md;
	}
}
while(!newsmell.isEmpty()) {
	int[] n = newsmell.poll();
	smell[n[0]][n[1]][0] = n[2];
	smell[n[0]][n[1]][1] = n[3];
}
water = tmp;

ํ•ด๋‹น ์œ„์น˜์— ์ƒ์–ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ด๋™ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด๋™ํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ํ•ด๋‹น ์œ„์น˜์˜ ์ƒ์–ด๊ฐ€ ์ž์‹ ๋ณด๋‹ค ํฐ ์ˆ˜๋ฅผ ๊ฐ€์กŒ๋‹ค๋ฉด ์ด๋™๊ฐ€๋Šฅํ•˜๊ณ  ์ƒ์–ด ํ•œ๋งˆ๋ฆฌ๊ฐ€ ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— M์„ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

๋‘ ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฉ์ž ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์•ผ ๋˜๋ฏ€๋กœ ๋˜ํ•œ M์„ ๊ฐ์†Œํ•œ๋‹ค.

์ด๋™์ด ๋ชจ๋‘ ์ข…๋ฃŒ๋์œผ๋ฏ€๋กœ smell์„ ์ €์žฅํ•ด์ค€๋‹ค. ๊ตณ์ด ๊ฒฉ์ž์— ๋‹ค๋ฅธ ์ƒ์–ด๊ฐ€ ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•  ํ•„์š”์—†์ด ๋“ค์–ด์˜จ ์ˆœ์„œ๋Œ€๋กœ smell ๋ฐฐ์—ด์— ์ €์žฅํ•ด์ฃผ์–ด๋„ ๊ฒฉ์ž์— ๋‚จ์€ ์ƒ์–ด์˜ ๊ฒƒ์ด ๋งˆ์ง€๋ง‰์— ๋“ค์–ด์™”๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๋™๋œ ์œ„์น˜๋กœ water๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

Comments