
๐ ๋ฌธ์ 

๐ฑ ์์ด๋์ด
"๊ณ ๋ฏผํด๋ ์ ๋์จ๋ค๋ฉด ๋ต์ง๋ณด๊ณ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์"
์ด ๋ฌธ์ ๋ ๋ด๊ฐ ์ฌํ๊น์ง ํ์ด์๋ ์๊ณ ๋ฆฌ์ฆ ์ง์ + ๊ธฐ๋ฒ(?)์ผ๋ก ์ด๋ป๊ฒ๋ ํด๊ฒฐํด๋ณด๋ ค๊ณ ํ์ผ๋ ๋ค ์คํจํ๋ค.
์ฐ์ธํดํ๋ฉด์ ๊ฒฐ๊ตญ ๊ฒ์์ ํตํด ์ฝ๋๋ฅผ ๋ดค๋ค.
HashMap์ผ๋ก BFS ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ฝ๋์์ง๋ง ์ ๋ง ํน์ดํ ๋ถ๋ถ์ด ์์๋ค
1์ฐจ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค(๋ฌธ์์ด)๋ฅผ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด์ ๊ฒฝ๋ก ์ด๋ํ ๋ค์ 1์ฐจ์ ๋ฐฐ์ด(๋ฌธ์์ด)๋ก ๋ณํ ํ
HashMap์ ํตํด ๋ฌธ์์ด์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด์๋ค
์๋ฅผ ๋ค์ด
๋ฌธ์์ด str = "123456789"
3*3 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ํ๋ผ ๋
1์ฐจ์ ๋ฐฐ์ด -> 2์ฐจ์ ๋ฐฐ์ด
Y = 3 / 3
X = 3 % 3
์ซ์ 4๋
idx ( 1 , 0 )์ ์์นํ๊ฒ ๋๋ค
๋ง์ฝ X ์ถ์ผ๋ก +1์ ํด์ฃผ๊ณ
idx ( 1 , 1 )๋ก ์ด๋ํ๋ค๋ฉด.
๋ค์ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด ๋ณด์!
2์ฐจ์ ๋ฐฐ์ด -> 1์ฐจ์ ๋ฐฐ์ด
idx = 3 * 1 + 1;
str = "123546789"
์ด๋ฐ ๋ฐฉ๋ฒ์ ํตํด ํผ์ฆ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํด์ฌ๋งต์ ๋ฃ๊ณ "1234567890"์ด ์๋์ง ํ๋จ ํ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๐ฑ ์ฝ๋ ๋ฐ ํ์ด
| public class Main { | |
| public static HashMap<String, Integer> map = new HashMap<>(); | |
| public static int[] dx = {0, 0, -1, 1}; | |
| public static int[] dy = {-1, 1, 0, 0}; | |
| public static void bfs(String input) { | |
| Queue<String> qu = new LinkedList<>(); | |
| map.put(input, 0); | |
| qu.offer(input); | |
| while (!qu.isEmpty()) { | |
| String now = qu.poll(); | |
| int zeroIdx = now.indexOf("0"); | |
| // 1์ฐจ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ | |
| // 3*3 2์ฐจ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ๋ณํ | |
| // ex. 1์ฐจ์ ๋ฐฐ์ด 7๋ฒ์งธ ๊ฐ์ | |
| // 2์ฐจ์ ๋ฐฐ์ด์ [2][1]์๋ฆฌ์ ์กด์ฌํ๋ค. | |
| int nowX = zeroIdx % 3; | |
| int nowY = zeroIdx / 3; | |
| for (int i = 0; i < 4; i++) { | |
| int nx = nowX + dx[i]; | |
| int ny = nowY + dy[i]; | |
| if (nx < 0 || ny < 0 || nx >= 3 || ny >= 3) continue; | |
| // 2์ฐจ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ -> 1์ฐจ์ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ๋ณํ | |
| // ๋ฐฐ์ด[2][1] ๊ฐ์ -> 3*2+1 -> ๋ฐฐ์ด[7]์ ์กด์ฌํจ | |
| int nextIdx = 3 * ny + nx; | |
| // StringBuilder์ ๋ฉ์๋๋ฅผ ํตํด 0๊ณผ flag ์๋ฆฌ ์ค์ | |
| StringBuilder sb = new StringBuilder(now); | |
| char flag = sb.charAt(nextIdx); | |
| sb.setCharAt(nextIdx, '0'); | |
| sb.setCharAt(zeroIdx, flag); | |
| // ๋งต์ ํฌํจ๋์ง ์์๋ค๋ฉด ์๋ก์ด ์กฐํฉ์ -> ๋ฐฉ๋ฌธ์ฒดํฌ ํจ๊ณผ๋์์(๋ฌดํ๋ฃจํ ๋ฐฉ์ง) | |
| if (!map.containsKey(sb.toString())) { | |
| qu.offer(sb.toString()); | |
| // ํ์ฌ์กฐํฉ ๊ณผ (์ ๋ฒ์กฐํฉ์ด ๋ง๋ค์ด ์ง๊ธฐ๊น์ง์ ํ์ +1) ์ ์ฅ | |
| map.put(sb.toString(), map.get(now) + 1); | |
| } | |
| } | |
| } | |
| } | |
| public static void main(String[] args) throws IOException { //์กฐ๊ฑด ์ ๋ ฅ | |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
| StringTokenizer st; | |
| String str = ""; | |
| for (int i = 0; i < 3; i++) { | |
| st = new StringTokenizer(br.readLine(), " "); | |
| for (int j = 0; j < 3; j++) { | |
| str += st.nextToken(); | |
| } | |
| } | |
| // ๋๋น์ฐ์ ํ์์ผ๋ก ๋ง๋ค ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์กฐํฉ์ ๋ง๋ค๊ณ ๋งต์ ์ ์ฅํ๋ค. | |
| bfs(str); | |
| // ์ฌ๋ฐ๋ฅธ ์กฐํฉ "123456780"์ด ๋งต์ ์๋ค๋ฉด, ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ์. | |
| if (map.containsKey("123456780")) { | |
| System.out.print(map.get("123456780")); | |
| } else { | |
| System.out.print(-1); | |
| } | |
| } | |
| } | 
๐ฑ ๋๋ ์ 
์ด ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ด๋ฐ ์์ผ๋ก๋ ๋ฌธ์ ๋ฅผ ์ ๊ทผํ ์ ์๊ตฌ๋๋ฅผ ์๊ฒ ๋์๊ณ ๊ธฐ์กด์ ๋ชป ํ๋ ๋ฌธ์ ๋ฅผ ์์ ๊ฐ์ ์์ด๋์ด์ ์ ๋ชฉํ๋ฉด
ํ ์ ์์ ๊ฒ ๊ฐ๋ค ํนํ 1์ฐจ์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ฅผ 2์ฐจ์ ๋ฐฐ์ด์ธ๋ฑ์ค๋ก ๋ณํํด์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ ๊ณ
BFS์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ ํด์ฌ๋งต์ผ๋ก๋ ํ ์ ์๋ค๋ ๊ฒ์ ๋ฐฐ์์ ๋ค๋ฅธ ๋ฌธ์ ์๋ ์ ๋ชฉ์์ผ์ ๋ด ๊ฒ์ผ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋ค.
'Algorithm > - Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [BOJ] ๋ฐฑ์ค 17299 ์ค๋ฑํฐ์ (JAVA) (0) | 2024.04.01 | 
|---|---|
| [BOJ] ๋ฐฑ์ค 1719 ํ๋ฐฐ (JAVA) (1) | 2024.03.21 | 
| [BOJ] ๋ฐฑ์ค 1153 ๋ค ๊ฐ์ ์์ (JAVA) (1) | 2024.03.14 | 
| [BOJ] ๋ฐฑ์ค 10830 ํ๋ ฌ ์ ๊ณฑ (JAVA) (1) | 2024.03.13 | 
| [BOJ] ๋ฐฑ์ค 6198 ์ฅ์ ์ ์ ๊พธ๋ฏธ๊ธฐ (JAVA) (2) | 2024.03.05 | 
๋๋ง์ ๊ฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค!
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!