알고리즘/백준

[백준 - 14711] 골드4 - 타일 뒤집기( easy) (문자열)

www.acmicpc.net/problem/14711

 

14711번: 타일 뒤집기 (Easy)

지구이는 신기한 게임판을 가지고 있다. 이 게임판에는 한 면은 검은색, 한 면은 흰색으로 칠해진 타일이 N행 N열으로 배치되어 있다. 각 타일은 제자리에서 뒤집을 수 있는데, 타일 하나를 뒤집

www.acmicpc.net

 

1. 유형

문자열

 

2. 풀이

검은색을 뒤집을때 오른쪽, 왼쪽, 아래쪽을 뒤집어야 한다. 이때 뒤집은 횟수를 check배열에 저장한다

 

check배열을 탐색하면서 값이 홀수이면 칸을 바꾸고, 짝수이면 칸을 뒤집지 않는다

 

java로 풀 경우 입출력에 시간을 많이 써서 시간초과가 난다. 

 

이때 BufferdReader와 StringBuilder를 써야한다.

 

3. 코드

package 문자열;

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

public class back_14711타일뒤집기 {
	static int dr[] = { 0, 0, 1 };
	static int dc[] = { -1, 1, 0 };

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int n = Integer.valueOf(in.readLine());
		char map[][] = new char[n][n];
		int check[][] = new int[n][n];
		String tmp = in.readLine();
		for (int i = 0; i < n; i++) {
			map[0][i] = tmp.charAt(i);
			sb.append(map[0][i]);
		}
		sb.append('\n');
		for (int i = 0; i < n-1; i++) {
			for (int j = 0; j < n; j++) {
				if (map[i][j] == '#') {
					check[i][j]++;
					for (int d = 0; d < 3; d++) {
						int nr = i + dr[d];
						int nc = j + dc[d];
						if(nr<0 ||nr>=n || nc<0 || nc>=n) continue;
						check[nr][nc]++;
					}
				}
			}
			for(int j=0;j<n;j++) {
				if(check[i][j]%2==0) {
					map[i+1][j] = map[i][j]=='#' ? '#' : '.';
					sb.append(map[i+1][j]);
				}else {
					map[i+1][j] = map[i][j]=='#' ? '.' : '#';
					sb.append(map[i+1][j]);
				}
			}
			sb.append('\n');
		}
		System.out.println(sb);
	}
}