본문 바로가기
카테고리 없음

[백준] 20165번 : 인내의 도미노 장인 호석(JAVA)

by lms0806 2021. 10. 18.
728x90
반응형

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

 

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

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

www.acmicpc.net

풀이

행과 열, 횟수를 입력받습니다.

공격자가 공격하고, 수비자가 한개를 다시 원래상태로 복구하는 방식으로 진행됩니다.

 

입력받은 배열과 똑같은 배열을 만들어 줍니다.(clone은 하지말것)

attack을 통하여 해당 도미노의 크기만큼 다음 배열의 위치에 있는 도미노를 치워줍니다.(반복)

위치를 입력받아 똑같은 배열을 만들어 줬던 값을 가져와 복구시켜줍니다.

 

소스코드

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

public class Main {
	static int[] dr = {-1, 0, 1, 0}, dc = { 0, 1, 0, -1};
	static int[][] num;
	static int n, m, answer = 0;
	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());
		
		num = new int[n][m];
		for(int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0; j < m; j++) {
				num[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int[][] arr = new int[n][m];
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				arr[i][j] = num[i][j];
			}
		}
		
		while(r --> 0) {
			st = new StringTokenizer(br.readLine());

			attack(Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1, st.nextToken().charAt(0));

			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken()) - 1, b = Integer.parseInt(st.nextToken()) - 1;
			num[a][b] = arr[a][b];
		}
		
		StringBuilder sb = new StringBuilder();
		sb.append(answer);
		for(int[] a : num) {
			sb.append("\n");
			for(int aa : a) {
				sb.append(aa == 0 ? "F " : "S ");
			}
		}
		System.out.print(sb);
	}
	
	public static void attack(int a, int b, char c) {
		int k = c == 'E' ? 1 : c == 'W' ? 3 : c == 'S' ? 2 : 0;
		
		int h = num[a][b];
		int nr = a, nc = b;
		while(h > 0) {
			if(num[nr][nc] > 0) {
				h = Math.max(h, num[nr][nc]);
				num[nr][nc] = 0;
				answer++;
			}
			h--;
			
			nr += dr[k];
			nc += dc[k];
			
			if(!check(nr, nc)) {
				break;
			}
		}
	}
	
	public static boolean check(int r, int c) {
		if(r >= 0 && r < n && c >= 0 && c < m) {
			return true;
		}
		return false;
	}
}
728x90
반응형

댓글