[백준] 20165 인내의 도미노 장인 호석 자바(Java)
본문 바로가기
알고리즘 풀이/백준

[백준] 20165 인내의 도미노 장인 호석 자바(Java)

by IYK2h 2023. 3. 4.
728x90

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

 

20165번: 인내의 도미노 장인 호석

사람을 화나게 하는 법은 다양하다. 그 중에서도 악질은 바로 열심히 세워놓은 도미노를 넘어뜨리는 것이다. 이번에 출시된 보드 게임인 "너 죽고 나 살자 게임"은 바로 이 점을 이용해서 2명이

www.acmicpc.net

 

알고리즘은 다음과 같이 작동합니다.

각 도미노의 양쪽에 일정한 수의 점이 있는 도미노 게임을 시뮬레이트하는 Java 프로그램입니다.

직사각형의 도미노 보드를 가져옵니다. 여기서 각 셀은 각 면에 특정 수의 점이 있는 도미노를 나타냅니다. 프로그램은 또한 일련의 동작을 취하며 각 동작은 공격과 방어로 구성됩니다.

 

attack은 시작 셀, 방향 및 크기로 표시됩니다. 지정된 셀에서 시작하여 프로그램은 이동에 지정된 방향을 따라 지정된 크기까지 모든 도미노를 넘어뜨립니다. 그런 다음 프로그램은 넘어진 도미노의 수를 세고 "F"으로 표시합니다.

 

defense는 단일 셀로 표시되며, 프로그램은 해당 셀에서 아직 도미노가 없는 경우 간단히 뒤집습니다.

 

프로그램은 방문한 도미노의 총 수와 보드의 최종 상태를 출력합니다. 방문한 셀은 "F"로 표시되고 방문하지 않은 셀은 "S"로 표시됩니다.

 

코드

package main.iyk2h;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    static int[][] inputArr;
    static char[][] visited;

    static int[] dr = {0, 0, 1, -1};
    static int[] dc = {1, -1, 0, 0};
    static int cnt = 0;
    static int N;
    static int M;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken()); // 행
        M = Integer.parseInt(st.nextToken()); // 열
        int R = Integer.parseInt(st.nextToken()); // 라운드 횟수

        inputArr = new int[N + 1][M + 1]; // 입력 배열
        visited = new char[N + 1][M + 1]; // 방문 여부 배열

        // 입력 받기
        for (int i = 1; i <= N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 1; j <= M; j++) {
                inputArr[i][j] = Integer.parseInt(st.nextToken());
                visited[i][j] = 'S'; // 모든 칸을 방문하지 않은 상태로 초기화
            }
        }

        for (int i = 0; i < R; i++) {
            st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            String direction = st.nextToken();
            attack(x, y, getDir(direction));

            st = new StringTokenizer(br.readLine());
            x = Integer.parseInt(st.nextToken());
            y = Integer.parseInt(st.nextToken());
            defense(x, y);
        }

        System.out.println(cnt);
        for (int i = 1 ; i <= N ; i++) {
            for (int j = 1 ; j <= M ; j++) {
                System.out.print(visited[i][j]+" ");
            }
            System.out.println();
        }

    }

    static void attack(int x, int y, int dir) {
        if (visited[x][y] == 'F') { // 이미 방문한 칸이면 종료
            return;
        } else {
            int size = inputArr[x][y] - 1;
            visited[x][y] = 'F';  // 방문 표시
            cnt++; // 방문 횟수 증가

            while (size > 0) {
                int nx = x + dr[dir];
                int ny = y + dc[dir];
                // 경계를 벗어난 경우 종료
                if (nx < 1 || nx >= N + 1 || ny < 1 || ny >= M + 1) {
                    return;
                }
                size--;
                x = nx;
                y = ny;
                // 이미 방문한 칸
                // 사이즈 사이즈 비교할 필요없이 다음 자리로
                if (visited[nx][ny] == 'F') {
                    continue;
                }
                // 방문하지 않은 칸
                visited[nx][ny] = 'F';

                // 새로 방문한 곳과 기존 도미노 사이즈 비교
                size = Math.max(size, inputArr[nx][ny] - 1);

                //방문 횟수 증가
                cnt++;
            }
        }
    }

    // 방향 별 값
    static int getDir(String s) {
        if (s.equals("E")) {
            return 0;
        } else if (s.equals("W")) {
            return 1;
        } else if (s.equals("S")) {
            return 2;
        } else if (s.equals("N")) {
            return 3;
        }
        return 0;
    }

    // 뒤집기
    static void defense(int cr, int cc) {
        if (visited[cr][cc] == 'F') {
            visited[cr][cc] = 'S';
        } else {
            return;
        }
    }
}

 

728x90

댓글