๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

[๋ฐฑ์ค€] 1080๋ฒˆ: ํ–‰๋ ฌ(๊ทธ๋ฆฌ๋””)

by ์ฃผ๋ฐœ2 2020. 1. 28.
๋ฐ˜์‘ํ˜•

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

 

1080๋ฒˆ: ํ–‰๋ ฌ

์ฒซ์งธ ์ค„์— ํ–‰๋ ฌ์˜ ํฌ๊ธฐ N M์ด ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ํ–‰๋ ฌ A๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ทธ ๋‹ค์Œ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ํ–‰๋ ฌ B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

์ฝ”๋“œ

import java.util.Scanner;

public class Main {
	static int N;			// ํ–‰
	static int M;			// ์—ด
	static int[][] aArr;	// ํ–‰๋ ฌ A
	static int[][] bArr;	// ํ–‰๋ ฌ B
	static int count = 0;	// ์—ฐ์‚ฐ์˜ ํšŸ์ˆ˜

	// 3*3 ๋ถ€๋ถ„ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ์›์†Œ ๋’ค์ง‘๊ธฐ(0->1, 1->0)
	public static boolean reverseArr(int row, int col){

		// ์ „๋‹ฌ๋ฐ›์€ ์ธ๋ฑ์Šค i, j๊ฐ€ ๋ณ€ํ™˜ํ•  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ ๋•Œ
		if(row+3 > N || col+3 > M)
			return false;

		for(int i=row; i<row+3; i++) {
			for(int j=col; j<col+3; j++) {
				if(aArr[i][j] == 0) 
					aArr[i][j] = 1;
				else
					aArr[i][j] = 0;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();
		M = scan.nextInt();
		aArr = new int[N][M];
		bArr = new int[N][M];

		for(int i=0; i<N; i++) {
			String str = scan.next();
			for(int j=0; j<M; j++) 
				aArr[i][j] = str.charAt(j) - '0';
		}
		for(int i=0; i<N; i++) {
			String str = scan.next();
			for(int j=0; j<M; j++) 
				bArr[i][j] = str.charAt(j) - '0';
		}

		// (0,0)๋ถ€ํ„ฐ ์›์†Œ๋ฅผ ์ผ์ผ์ด ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ๋‹ค๋ฅผ๊ฒฝ์šฐ reverseArr ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์›์†Œ ๋’ค์ง‘์Œ.
		// 3*3 ํฌ๊ธฐ์˜ ํ–‰๋ ฌ์ด ๊ณ ์ •์ด๋ฏ€๋กœ, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋–„๊นŒ์ง€ ๊ฐ™์ง€์•Š์„๊ฒฝ์šฐ, -1 ์ถœ๋ ฅ
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(aArr[i][j] != bArr[i][j]) {
					if(reverseArr(i, j)) {
						count ++;
					} else {
						System.out.println("-1");
						return;
					}
				}
			}
		}

		System.out.println(count);
		scan.close();
	}

}

 

ํ’€์ด

๋ณ€์ˆ˜๋“ค์„ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋ž˜์Šค ๋ณ€์ˆ˜(static)๋กœ ์„ ์–ธํ–ˆ๋‹ค.

2์ฐจ์› ํ–‰๋ ฌ A, B์˜ ๊ฐ๊ฐ์˜ ์›์†Œ๋“ค์„ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜๋กœ ๊ฐ’์„ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ ๊ฐ’์ด ๋‹ค๋ฅผ๋•Œ, ๋ถ€๋ถ„ ํ–‰๋ ฌ(3*3)์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ๋’ค์ง‘์–ด ์ฃผ๋ฉด ๋œ๋‹ค.

๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 3*3์ด๋ฏ€๋กœ, i์™€ j๋Š” N-3, M-3 ๊นŒ์ง€๋งŒ ๋น„๊ตํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋งŒ์•ฝ N = 3 , M = 5์ธ 3 * 5 ์ธ ํ–‰๋ ฌ์ด ์žˆ์„๋•Œ,

 

A ํ–‰๋ ฌ์€

0 0 1 0 1

0 0 1 1 0

0 0 1 1 1 ์ด๊ณ ,

 

B ํ–‰๋ ฌ์€

0 0 1 0 0

0 0 1 1 0

0 0 1 0 0 ์ผ๋•Œ,

 

j(์—ด)์˜ ๊ฐ’์€ ๊ฐ ํ–‰๋งˆ๋‹ค 2๊นŒ์ง€๋งŒ ๋น„๊ตํ•˜๋ฉด ๋‘ ํ–‰๋ ฌ์ด ์›์†Œ๋ฅผ ๋’ค์ง‘์—ˆ์„๋•Œ ๊ฐ™์€์ง€ ๋‹ค๋ฅธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด 3*3์ธ ๋ถ€๋ถ„ ๋ฐฐ์—ด ์ด๋ฏ€๋กœ j=4 ์ผ๋•Œ ๋‘ ํ–‰๋ ฌ์˜ ์›์†Œ๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ, 3*3์ธ ๋ถ€๋ถ„ ํ–‰๋ ฌ์„ ๋’ค์ง‘์„ ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ถ€๋ถ„ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๋’ค์ง‘๋Š” ๋ฉ”์†Œ๋“œ reverseArr()๋ฅผ ํ†ตํ•ด ์›์†Œ๋ฅผ ๋’ค์ง‘๋Š”๋ฐ, ์ด ๋•Œ

i, j์˜ ๊ฐ’์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์„๋•Œ๋Š” false๋กœ ๋ฆฌํ„ดํ•˜๊ณ , ๋ฒ”์œ„ ์•ˆ์ผ๊ฒฝ์šฐ ํ–‰๋ ฌ์˜ 3*3 ๋ถ€๋ถ„ ํ–‰๋ ฌ์„ ๋’ค์ง‘์–ด์ค€๋‹ค.

 

	// 3*3 ๋ถ€๋ถ„ ํ–‰๋ ฌ์˜ ๋ชจ๋“  ์›์†Œ ๋’ค์ง‘๊ธฐ(0->1, 1->0)
	public static boolean reverseArr(int row, int col){
		
		// ์ „๋‹ฌ๋ฐ›์€ ์ธ๋ฑ์Šค i, j๊ฐ€ ๋ณ€ํ™˜ํ•  ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ ๋•Œ
		if(row+3 > N || col+3 > M)
			return false;
		
		for(int i=row; i<row+3; i++) {
			for(int j=col; j<col+3; j++) {
				if(aArr[i][j] == 0) 
					aArr[i][j] = 1;
				else
					aArr[i][j] = 0;
			}
		}
		return true;
	}

 

 

 

main ๋ฉ”์†Œ๋“œ์—์„œ ๋‘ ํ–‰๋ ฌ A, B์˜ ๋ชจ๋“  ์›์†Œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ’์ด ๋‹ค๋ฅผ๊ฒฝ์šฐ ๋ถ€๋ถ„ ํ–‰๋ ฌ์˜ ์›์†Œ๋ฅผ ๋’ค์ง‘๊ณ ,

๋งŒ์•ฝ ์›์†Œ๋ฅผ ๋’ค์ง‘์„๋•Œ ์ธ๋ฑ์Šค์˜ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚ฌ์„๋•Œ๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

		// (0,0)๋ถ€ํ„ฐ ์›์†Œ๋ฅผ ์ผ์ผ์ด ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ๋‹ค๋ฅผ๊ฒฝ์šฐ reverseArr ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์›์†Œ ๋’ค์ง‘์Œ.
		// 3*3 ํฌ๊ธฐ์˜ ํ–‰๋ ฌ์ด ๊ณ ์ •์ด๋ฏ€๋กœ, ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋–„๊นŒ์ง€ ๊ฐ™์ง€์•Š์„๊ฒฝ์šฐ, -1 ์ถœ๋ ฅ
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				if(aArr[i][j] != bArr[i][j]) {
					if(reverseArr(i, j)) {
						count ++;
					} else {
						System.out.println("-1");
						return;
					}
				}
			}
		}
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€