λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Problem Solving

[Java] λ°±μ€€ 31716 - ν˜„λŒ€λͺ¨λΉ„μŠ€ 자율 μ£Όν–‰ ν…ŒμŠ€νŒ… 1

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


풀이

ν•œ νŠΈλž™μ—μ„œ 1μ—΄ → Nμ—΄λ‘œ μ΄λ™ν•˜λŠ” μ΅œμ†Œκ±°λ¦¬λŠ” BFS 돌리면 금방 λ‚˜μ˜€λŠ”λ°

ν•œ νŠΈλž™μ—μ„œ λ‹€μŒ νŠΈλž™μœΌλ‘œ λ„˜μ–΄κ°ˆλ•Œ 이동 거리λ₯Ό κΌΌκΌΌν•˜κ²Œ μ²˜λ¦¬ν•΄μ€˜μ•Ό ν•œλ‹€.

특히, ν•΄λ‹Ή νŠΈλž™ λ„μ°©μ μ˜ ν–‰κ³Ό λ‹€μŒ νŠΈλž™ μ‹œμž‘μ μ˜ 행을 λ§žμΆ°μ£ΌλŠ” μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€.

 

 


μ½”λ“œ

더보기
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		long K = Long.parseLong(st.nextToken());
		char[][] board = new char[2][N];

		for (int r = 0; r < 2; r++) {
			for (int c = 0; c < N; c++) {
				board[r][c] = (char) br.read();
			}
			br.readLine();
		}
		br.close();

		Queue<int[]> que = new LinkedList<>();
		int[][][] dist = new int[2][N][2];
		long moveWithinBlock = -1;
		int startRow = 0;
		int endRow = 0;

		for (int r = 0; r < 2; r++) {
			for (int c = 0; c < N; c++) {
				dist[r][c][0] = -1;
			}
		}

		if (board[0][0] == '.') {
			que.add(new int[] { 0, 0 });
			dist[0][0][0] = 0;
			dist[0][0][1] = 0;
		}
		if (board[1][0] == '.') {
			que.add(new int[] { 1, 0 });
			dist[1][0][0] = 0;
			dist[1][0][1] = 1;
		}

		while (!que.isEmpty()) {
			int[] cur = que.remove();
			int r = cur[0];
			int c = cur[1];

			if (c == N - 1) {
				moveWithinBlock = dist[r][c][0];
				startRow = dist[r][c][1];
				endRow = r;
				break;
			}

			if (board[r][c + 1] == '.') {
				if (dist[r][c + 1][0] == -1) {
					dist[r][c + 1][0] = dist[r][c][0] + 1;
					dist[r][c + 1][1] = dist[r][c][1];
					que.add(new int[] { r, c + 1 });
				}
			} else if (board[(r + 1) % 2][c] == '.') {
				if (dist[(r + 1) % 2][c][0] == -1) {
					dist[(r + 1) % 2][c][0] = dist[r][c][0] + 1;
					dist[(r + 1) % 2][c][1] = dist[r][c][1];
					que.add(new int[] { (r + 1) % 2, c });
				}
			} else {
				System.out.println(-1);
				return;
			}
		}

		long moveToNextBlock = 0;

		if (K > 1) {
			if (startRow == endRow) {
				moveToNextBlock = 1;
			} else {
				if (board[endRow][0] == '.') {
					moveToNextBlock = 2;
				} else if (board[(endRow + 1) % 2][N - 1] == '.') {
					moveToNextBlock = 2;
				} else {
					System.out.println(-1);
					return;
				}
			}
		}

		System.out.println(moveWithinBlock * K + moveToNextBlock * (K - 1));
	}
}

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

// case 1:
2 1
#.
.#
expected output: -1

// case 2:
5 1
...#.
.#...
expected output: 5
    
// case 3:
5 3
...#.
.#...
expected output: 19

// case 4:
5 3
#....
..#..
expected output: 19

// case 5:
5 3
....#
..#..
expected output: 19

// case 6:
5 3
#....
..#.#
expected output: -1

// case 7:
5 3
#...#
..#..
expected output: 20