728x90
https://www.acmicpc.net/problem/20165
알고리즘은 다음과 같이 작동합니다.
각 도미노의 양쪽에 일정한 수의 점이 있는 도미노 게임을 시뮬레이트하는 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
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준] 2493 탑 자바(Java) (0) | 2023.04.10 |
---|---|
[백준] 1874 스택 수열 자바(Java) (0) | 2023.04.09 |
[백준] 16924 십자가 찾기 자바(Java) (0) | 2023.02.28 |
[백준] 10816 숫자 카드 2 자바(Java) (0) | 2023.02.22 |
[백준] 11004 K번째 수 자바(Java) (0) | 2023.01.29 |
댓글