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

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3] ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ (2021 KAKAO BLIND RECRUTMENT, ๊ตฌํ˜„, ์ˆœ์—ด, BFS)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3. ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ

๋ฌธ์ œ ์„ค๋ช…

๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž์ธ ๋ฒ ๋กœ๋‹ˆ๋Š” ๊ฐœ๋ฐœ ์—ฐ์Šต์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์นด๋“œ ์ง๋งž์ถ”๊ธฐ ๋ณด๋“œ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.๊ฒŒ์ž„์ด ์‹œ์ž‘๋˜๋ฉด ํ™”๋ฉด์—๋Š” ์นด๋“œ 16์žฅ์ด ๋’ท๋ฉด์„ ์œ„๋กœํ•˜์—ฌ 4 x 4 ํฌ๊ธฐ์˜ ๊ฒฉ์ž ํ˜•ํƒœ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์นด๋“œ์˜ ์•ž๋ฉด์—๋Š” ์นด์นด์˜คํ”„๋ Œ์ฆˆ ์บ๋ฆญํ„ฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, 8๊ฐ€์ง€์˜ ์บ๋ฆญํ„ฐ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ์นด๋“œ๊ฐ€ ๊ฐ๊ธฐ 2์žฅ์”ฉ ํ™”๋ฉด์— ๋ฌด์ž‘์œ„๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.์œ ์ €๊ฐ€ ์นด๋“œ๋ฅผ 2์žฅ ์„ ํƒํ•˜์—ฌ ์•ž๋ฉด์œผ๋กœ ๋’ค์ง‘์—ˆ์„ ๋•Œ ๊ฐ™์€ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ง„ ์นด๋“œ๋ฉด ํ•ด๋‹น ์นด๋“œ๋Š” ๊ฒŒ์ž„ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉฐ, ๊ฐ™์€ ๊ทธ๋ฆผ์ด ์•„๋‹ˆ๋ผ๋ฉด ์›๋ž˜ ์ƒํƒœ๋กœ ๋’ท๋ฉด์ด ๋ณด์ด๋„๋ก ๋’ค์ง‘ํž™๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“  ์นด๋“œ๋ฅผ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
๊ฒŒ์ž„์—์„œ ์นด๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

- ์นด๋“œ๋Š” ์ปค์„œ๋ฅผ ์ด์šฉํ•ด์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  - ์ปค์„œ๋Š” 4 x 4 ํ™”๋ฉด์—์„œ ์œ ์ €๊ฐ€ ์„ ํƒํ•œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” "๊ตต๊ณ  ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ ์ƒ์ž"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
- ์ปค์„œ๋Š” [Ctrl] ํ‚ค์™€ ๋ฐฉํ–ฅํ‚ค์— ์˜ํ•ด ์ด๋™๋˜๋ฉฐ ํ‚ค ์กฐ์ž‘๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  - ๋ฐฉํ–ฅํ‚ค ←, ↑, ↓, → ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋ฉด, ์ปค์„œ๊ฐ€ ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์œผ๋กœ 1์นธ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  - [Ctrl] ํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ์—์„œ ๋ฐฉํ–ฅํ‚ค ←, ↑, ↓, → ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ˆ„๋ฅด๋ฉด, ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์นด๋“œ๋กœ ํ•œ๋ฒˆ์— ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    - ๋งŒ์•ฝ, ํ•ด๋‹น ๋ฐฉํ–ฅ์— ์นด๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋‹ค๋ฉด ๊ทธ ๋ฐฉํ–ฅ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์นธ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  - ๋งŒ์•ฝ, ๋ˆ„๋ฅธ ํ‚ค ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์นด๋“œ ๋˜๋Š” ๋นˆ ๊ณต๊ฐ„์ด ์—†์–ด ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ปค์„œ๋Š” ์›€์ง์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
- ์ปค์„œ๊ฐ€ ์œ„์น˜ํ•œ ์นด๋“œ๋ฅผ ๋’ค์ง‘๊ธฐ ์œ„ํ•ด์„œ๋Š” [Enter] ํ‚ค๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  - [Enter] ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์„œ ์นด๋“œ๋ฅผ ๋’ค์ง‘์—ˆ์„ ๋•Œ
    - ์•ž๋ฉด์ด ๋ณด์ด๋Š” ์นด๋“œ๊ฐ€ 1์žฅ ๋ฟ์ด๋ผ๋ฉด ๊ทธ๋ฆผ์„ ๋งž์ถœ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋’ค์ง‘์„ ๋•Œ ๊นŒ์ง€ ์•ž๋ฉด์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    - ์•ž๋ฉด์ด ๋ณด์ด๋Š” ์นด๋“œ๊ฐ€ 2์žฅ์ด ๋œ ๊ฒฝ์šฐ, ๋‘๊ฐœ์˜ ์นด๋“œ์— ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์ด ๊ฐ™์œผ๋ฉด ํ•ด๋‹น ์นด๋“œ๋“ค์ด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง€๋ฉฐ, ๊ทธ๋ฆผ์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋‘ ์นด๋“œ ๋ชจ๋‘ ๋’ท๋ฉด์ด ๋ณด์ด๋„๋ก ๋‹ค์‹œ ๋’ค์ง‘ํž™๋‹ˆ๋‹ค.

"๋ฒ ๋กœ๋‹ˆ"๋Š” ๊ฒŒ์ž„ ์ง„ํ–‰ ์ค‘ ์นด๋“œ์˜ ์ง์„ ๋งž์ถฐ ๋ช‡ ์žฅ ์ œ๊ฑฐ๋œ ์ƒํƒœ์—์„œ ์นด๋“œ ์•ž๋ฉด์˜ ๊ทธ๋ฆผ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋‚จ์€ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜๋Š” ๋ฐฉํ–ฅํ‚ค์™€ [Enter] ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋Š” ๋™์ž‘์„ ๊ฐ๊ฐ ์กฐ์ž‘ ํšŸ์ˆ˜ 1๋กœ ๊ณ„์‚ฐํ•˜๋ฉฐ, [Ctrl] ํ‚ค์™€ ๋ฐฉํ–ฅํ‚ค๋ฅผ ํ•จ๊ป˜ ๋ˆ„๋ฅด๋Š” ๋™์ž‘ ๋˜ํ•œ ์กฐ์ž‘ ํšŸ์ˆ˜ 1๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์นด๋“œ๊ฐ€ ๋†“์ธ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 2์ฐจ์› ๋ฐฐ์—ด board์™€ ์ปค์„œ์˜ ์ฒ˜์Œ ์œ„์น˜ r, c๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์นด๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

- board๋Š” 4 x 4 ํฌ๊ธฐ์˜ 2์ฐจ์› ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
- board ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋Š” 0 ์ด์ƒ 6 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  - 0์€ ์นด๋“œ๊ฐ€ ์ œ๊ฑฐ๋œ ๋นˆ ์นธ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  - 1 ๋ถ€ํ„ฐ 6๊นŒ์ง€์˜ ์ž์—ฐ์ˆ˜๋Š” 2๊ฐœ์”ฉ ๋“ค์–ด์žˆ์œผ๋ฉฐ ๊ฐ™์€ ์ˆซ์ž๋Š” ๊ฐ™์€ ๊ทธ๋ฆผ์˜ ์นด๋“œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  - ๋’ค์ง‘์„ ์นด๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ(board์˜ ๋ชจ๋“  ์›์†Œ๊ฐ€ 0์ธ ๊ฒฝ์šฐ)๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
- r์€ ์ปค์„œ์˜ ์ตœ์ดˆ ์„ธ๋กœ(ํ–‰) ์œ„์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
- c๋Š” ์ปค์„œ์˜ ์ตœ์ดˆ ๊ฐ€๋กœ(์—ด) ์œ„์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
- r๊ณผ c๋Š” 0 ์ด์ƒ 3 ์ดํ•˜์ธ ์ •์ˆ˜์ž…๋‹ˆ๋‹ค.
- ๊ฒŒ์ž„ ํ™”๋ฉด์˜ ์ขŒ์ธก ์ƒ๋‹จ์ด (0, 0), ์šฐ์ธก ํ•˜๋‹จ์ด (3, 3) ์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

board r c result
[[1,0,0,3],[2,0,0,0],[0,0,0,2],[3,0,1,0]] 1 0 14
[[3,0,0,2],[0,0,1,0],[0,1,0,0],[2,0,0,3]] 0 1 16

https://school.programmers.co.kr/learn/courses/30/lessons/72415

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

์นด์นด์˜ค ์ฝ”ํ…Œ ๊ธฐ์ถœ๋‹ต๊ฒŒ ๋ฌธ์ œ ์ดํ•ด๋ถ€ํ„ฐ ์–ด๋ ค์› ๊ณ , ์ •๋‹ต ํ’€์ด ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋Š” ๋ฐ๋„ ํ•œ์ฐธ ๊ฑธ๋ ธ๋‹ค. ๐Ÿ’ฆ

๊ตฌํ˜„, ์ˆœ์—ด, bfs ์œ ํ˜•์ด ๋ชจ๋‘ ์„ž์ธ ๋ฌธ์ œ์˜€๋‹ค. ์ˆœ์—ด๊ณผ bfs ๊ฐœ๋…์€ ์•Œ๊ณ  ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ๋ฌธ์ œ ํ’€์ด๋ฅผ ์ ์–ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์šฐ์„  ์š”์•ฝ์„ ํ•ด๋ณด์ž๋ฉด,,,

๊ฒŒ์ž„ํŒ(board)์— ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ๋ฅผ ์ฐพ๋Š” ์ˆœ์„œ๋ฅผ ์ˆœ์—ด๋กœ ๊ตฌํ•ด์„œ ๊ฐ bfs ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋Œ๋ฆฐ๋‹ค.

์นด๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค ์ตœ์†Œ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•ด์ฃผ๊ณ , ํ๋ฅผ ๋น„์›Œ์ฃผ๊ณ  ๋‹ค์Œ ์นด๋“œ๋ฅผ ์ฐพ์•„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

๋ชจ๋“  ์นด๋“œ๋ฅผ ์ฐพ์•˜์œผ๋ฉด ์ „์—ญ ๋ณ€์ˆ˜ answer(๋ชจ๋“  ๊ฒฝ์šฐ์˜ ๊ฐ’ ์ค‘ ์ตœ์†Ÿ๊ฐ’)๊ณผ ๋น„๊ตํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

 

ํ•„์š”ํ•œ ์ „์—ญ ๋ณ€์ˆ˜๋“ค์„ ์ •์˜ํ•œ๋‹ค.

static boolean[] isNum = new visited[7]; // ์ˆซ์ž ์นด๋“œ: ๊ฒŒ์ž„ํŒ์— ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false
static boolean[] visited = new visited[7]; // ์ˆœ์—ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์—ด

static int size = 0; // ์กด์žฌํ•˜๋Š” ์ˆซ์ž ์นด๋“œ ๊ฐœ์ˆ˜ (์ค‘๋ณต์—†์ด)
static int answer = Integer.MAX_VALUE; // ๋ฌธ์ œ ๋‹ต: ์ตœ์†Œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜

static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, 1, -1};
    
static class Point { // ๊ฒŒ์ž„ํŒ ๋‚ด ์œ„์น˜
	int x, y, d;
        
	Point(int x, int y, int d) {
		this.x = x; // row
		this.y = y; // column
		this.d = d; // ์ด๋™ ๊ฑฐ๋ฆฌ(ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜)
	}
}

 

solution ๋ฉ”์†Œ๋“œ

public int solution(int[][] board, int r, int c) {
        
	// ๊ฒŒ์ž„ํŒ์— ์žˆ๋Š” ์นด๋“œ ํ™•์ธ
	for(int i = 0; i < 4; i++) {
		for(int j = 0; j < 4; j++) {
        	// ์นด๋“œ๊ฐ€ ์—†๋Š” ์นธ์ด๊ฑฐ๋‚˜, ์ด๋ฏธ ํ™•์ธํ•œ ์นด๋“œ ์ข…๋ฅ˜์ด๋ฉด pass
			if(board[i][j] == 0 || isNum[board[i][j]]) continue;
               
			isNum[board[i][j]] = true; // ์นด๋“œ ์กด์žฌ ํ™•์ธ
			size++; // ์นด๋“œ ์ข…๋ฃŒ ๊ฐœ์ˆ˜ + 1
		}
	}
        
	// ์ˆœ์—ด: ์นด๋“œ ํƒ์ƒ‰ ์ˆœ์„œ
	permutation(0, new int[size], board, r, c);

	// ๋ชจ๋“  ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ์ตœ์†Œ ์กฐ์ž‘ ๊ฐœ์ˆ˜ ๊ฐ’ ๋ฐ˜ํ™˜
	return answer;
}

 

permutation ๋ฉ”์†Œ๋“œ : ์ˆœ์—ด, ์นด๋“œ ํƒ์ƒ‰ ์ˆœ์„œ๋ฅผ ๊ตฌํ•œ๋‹ค.

// cnt: ๋ฝ‘์€ ์ˆ˜ ๊ฐœ์ˆ˜, arr: ์นด๋“œ ํƒ์ƒ‰ ์ˆœ์„œ
private void permutation(int cnt, int[] arr, int[][] board, int r, int c) {
	if(size == cnt) { // ์ˆœ์—ด ๋๋‚ฌ์œผ๋ฉด arr ์ˆœ์„œ๋Œ€๋กœ bfs ๋Œ๋ฆฌ๊ธฐ
		bfs(board, r, c, arr);
		return;
	}
        
	for(int i = 1; i <= 6; i++) {
            if(visited[i] || !isNum[i]) continue; // ์—†๋Š” ์นด๋“œ์ด๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด pass

            visited[i] = true;
            arr[cnt] = i;
            permutation(cnt + 1, arr, board, r, c);
            visited[i] = false;
	}
}

 

bfs ๋ฉ”์†Œ๋“œ : ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ตœ์†Œ ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.

private void bfs(int[][] board, int r, int c, int[] arr) {
	// ์œ„์น˜ ์ •๋ณด ํ
	Queue<Point> queue = new LinkedList<>();
	queue.add(new Point(r, c, 0));
    
	// ์œ„์น˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ์ €์žฅ
	boolean[][] isVisited = new boolean[4][4];
	isVisited[r][c] = true;
    
	// ์นด๋“œ๋ฅผ ์ฐพ์•˜๋Š”์ง€(enter) ์—ฌ๋ถ€ ์ €์žฅ
	boolean[][] enterVisited = new boolean[4][4];
    
	int answerCnt = 0; // ์ „์ฒด ํ‚ค ์กฐ์ž‘ ํšŸ์ˆ˜
	int idx = 0; // ์นด๋“œ ํƒ์ƒ‰ ์ˆœ์„œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค
	boolean isSecond = false; // ๋‘๋ฒˆ์งธ ์นด๋“œ ํƒ์ƒ‰ ์—ฌ๋ถ€
        
	while(!queue.isEmpty()) {
		Point cur = queue.poll();
            
		// ์ฐพ๊ณ ์žํ•˜๋Š”(arr[idx]) ์นด๋“œ๋ฅผ ์ฒ˜์Œ(!enterVisited) ์ฐพ์•˜์„ ๋•Œ
		if(board[cur.x][cur.y] == arr[idx] && !enterVisited[cur.x][cur.y]) {
			enterVisited[cur.x][cur.y] = true;
			answerCnt++; // enter ํ‚ค
 			answerCnt += cur.d; // ์ตœ๋‹จ ์ด๋™ ๊ฑฐ๋ฆฌ ๋”ํ•˜๊ธฐ

			// ํ ์ดˆ๊ธฐํ™” (๋‹ค์Œ ์นด๋“œ ํƒ์ƒ‰ ์‹œ์ž‘ ์ค€๋น„)
 			queue.clear();
			queue.add(new Point(cur.x, cur.y, 0)); 
			isVisited = new boolean[4][4];
			isVisited[cur.x][cur.y] = true;
                
			if(!isSecond) { // ๊ฐ™์€ ์ข…๋ฅ˜์—์„œ ์ฒซ๋ฒˆ์งธ๋กœ ์ฐพ์€ ์นด๋“œ์ผ ๋•Œ
				isSecond = true;
			} else { // ๋‘๋ฒˆ์งธ๋กœ ์ฐพ์€ ์นด๋“œ์ผ ๋•Œ
				isSecond = false;
				idx++; // ๋‹ค์Œ ์นด๋“œ ์œ ํ˜•
				if(idx >= arr.length) { // ๋ชจ๋“  ์นด๋“œ๋ฅผ ์ฐพ์•˜์„ ๋•Œ
					answer = Math.min(answer, answerCnt); // ์ตœ์†Ÿ๊ฐ’ ์—…๋ฐ์ดํŠธ
					return;
				}
			}
                
			continue;
		}
            
		for(int i = 0; i < 4; i++) {
			int nx = cur.x + dx[i];
			int ny = cur.y + dy[i];

			// ํ•œ ์นธ ์ด๋™
			if(0 <= nx && nx < 4 && 0 <= ny && ny < 4 && !isVisited[nx][ny]) {
				isVisited[nx][ny] = true;
				queue.add(new Point(nx, ny, cur.d + 1));
			}

			// ํ•œ ์นธ ์ด๋™ํ•˜๊ธฐ ์ „ ์œ„์น˜๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”
			nx -= dx[i];
			ny -= dy[i];

			// ctrl ์ด์šฉํ•ด์„œ ๋๊นŒ์ง€ ์ด๋™
			while(0 <= nx + dx[i] && nx + dx[i] < 4 && 0 <= ny + dy[i] && ny + dy[i] < 4) {
				nx += dx[i];
				ny += dy[i];

				// ์ค‘๊ฐ„์— enter ํ•˜์ง€ ์•Š์€ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฉˆ์ถค
				if(board[nx][ny] != 0 && !enterVisited[nx][ny]) {
					break;
				}
			}

			// ctrl ์ด๋™
			if(0 <= nx && nx < 4 && 0 <= ny && ny < 4 && !isVisited[nx][ny]) {
				isVisited[nx][ny] = true;
				queue.add(new Point(nx, ny, cur.d + 1));
			}
		}
	}
}

 

ํ’€์ด ๋ฐฉ์‹์„ ์ „์ฒด ์ฝ”๋“œ๋กœ ํ’€์–ด๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import java.util.*;

class Solution {
    
    static boolean[] isNum = new boolean[7];
    static boolean[] visited = new boolean[7];
    static int size = 0;
    static int answer = Integer.MAX_VALUE;
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};
    
    static class Point {
        int x;
        int y;
        int d;
        
        Point(int x, int y, int d) {
            this.x = x;
            this.y = y;
            this.d = d;
        }
    }
    
    public int solution(int[][] board, int r, int c) {
        for(int i = 0; i < 4; i++) {
            for(int j = 0; j < 4; j++) {
                if(board[i][j] == 0 || isNum[board[i][j]]) {
                    continue;
                }
                
                isNum[board[i][j]] = true;
                size++;
            }
        }
        
        permutation(0, new int[size], board, r, c);
        
        return answer;
    }
    
    private void bfs(int[][] board, int r, int c, int[] arr) {
        Queue<Point> queue = new LinkedList<>();
        queue.add(new Point(r, c, 0));
        
        boolean[][] isVisited = new boolean[4][4];
        isVisited[r][c] = true;
        
        boolean[][] enterVisited = new boolean[4][4];
        
        int answerCnt = 0;
        int idx = 0;
        boolean isSecond = false;
        
        while(!queue.isEmpty()) {
            Point cur = queue.poll();
            
            // ์นด๋“œ ์ผ์น˜
            if(board[cur.x][cur.y] == arr[idx] && !enterVisited[cur.x][cur.y]) {
                enterVisited[cur.x][cur.y] = true;
                answerCnt++; // enter
                answerCnt += cur.d; // ์ตœ๋‹จ ์ด๋™ ๊ฑฐ๋ฆฌ
                
                queue.clear();
                queue.add(new Point(cur.x, cur.y, 0));
                
                isVisited = new boolean[4][4];
                isVisited[cur.x][cur.y] = true;
                
                if(!isSecond) {
                    isSecond = true;
                } else {
                    isSecond = false;
                    idx++;
                    
                    if(idx >= arr.length) {
                        answer = Math.min(answer, answerCnt);
                        return;
                    }
                }
                
                continue;
            }
            
            for(int i = 0; i < 4; i++) {
                int nx = cur.x + dx[i];
                int ny = cur.y + dy[i];
                
                // ํ•œ ์นธ ์ด๋™
                if(0 <= nx && nx < 4 && 0 <= ny && ny < 4 && !isVisited[nx][ny]) {
                    isVisited[nx][ny] = true;
                    queue.add(new Point(nx, ny, cur.d + 1));
                }
                
                // ํ•œ ์นธ ์ด๋™ํ•˜๊ธฐ ์ „ ์œ„์น˜๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”
                nx -= dx[i];
                ny -= dy[i];
                
                // ctrl ์ด์šฉํ•ด์„œ ๋๊นŒ์ง€ ์ด๋™
                while(0 <= nx + dx[i] && nx + dx[i] < 4 && 0 <= ny + dy[i] && ny + dy[i] < 4) {
                    nx += dx[i];
                    ny += dy[i];
                    
                    // ์ค‘๊ฐ„์— enter ํ•˜์ง€ ์•Š์€ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฉˆ์ถค
                    if(board[nx][ny] != 0 && !enterVisited[nx][ny]) {
                        break;
                    }
                }
                
                // ctrl ์ด๋™
                if(0 <= nx && nx < 4 && 0 <= ny && ny < 4 && !isVisited[nx][ny]) {
                    isVisited[nx][ny] = true;
                    queue.add(new Point(nx, ny, cur.d + 1));
                }
            }
        }
    }
    
    private void permutation(int cnt, int[] arr, int[][] board, int r, int c) {
        if(size == cnt) { // arr ์ˆœ์„œ๋Œ€๋กœ bfs ๋Œ๋ฆฌ๊ธฐ
            bfs(board, r, c, arr);
            return;
        }
        
        for(int i = 1; i <= 6; i++) {
            if(visited[i] || !isNum[i]) { // ์—†๋Š” ์นด๋“œ์ด๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด pass
                continue;
            }
            
            visited[i] = true;
            arr[cnt] = i;
            permutation(cnt + 1, arr, board, r, c);
            visited[i] = false;
        }
    }
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

๋„ˆ๋ฌด๋„ˆ๋ฌด ์–ด๋ ต๊ณ  ์ดํ•ดํ•˜๋Š”๋ฐ๋„ ๊ธด ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์ง€๋งŒ, ์ƒˆ๋กœ์šด ํ’€์ด ๋ฐฉ๋ฒ•์„ ํ•œ ๋ฒˆ์— ์•Œ๊ฒŒ ๋˜์„œ ์ข‹์•˜๋‹ค. ๐Ÿ‘

๋ฐ˜์‘ํ˜•
LIST