J

[JAVA] BOJ ๋ฐฑ์ค€ 14890 ๊ฒฝ์‚ฌ๋กœ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 14890 ๊ฒฝ์‚ฌ๋กœ

snowball๐Ÿฐ 2023. 2. 18. 20:19

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

 

14890๋ฒˆ: ๊ฒฝ์‚ฌ๋กœ

์ฒซ์งธ ์ค„์— N (2 ≤ N ≤ 100)๊ณผ L (1 ≤ L ≤ N)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์ง€๋„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์นธ์˜ ๋†’์ด๋Š” 10๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

๋ฌธ์ œ

ํฌ๊ธฐ๊ฐ€ N×N์ธ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์—๋Š” ๊ทธ ๊ณณ์˜ ๋†’์ด๊ฐ€ ์ ํ˜€์ ธ ์žˆ๋‹ค. 

์˜ค๋Š˜์€ ์ด ์ง€๋„์—์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๊ธธ์ด๋ž€ ํ•œ ํ–‰ ๋˜๋Š” ํ•œ ์—ด ์ „๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํ•œ์ชฝ ๋์—์„œ ๋‹ค๋ฅธ์ชฝ ๋๊นŒ์ง€ ์ง€๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. 

๋‹ค์Œ๊ณผ ๊ฐ™์€ N=6์ธ ๊ฒฝ์šฐ ์ง€๋„๋ฅผ ์‚ดํŽด๋ณด์ž.

์ด๋•Œ, ๊ธธ์€ ์ด 2N๊ฐœ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ธธ์„ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ๊ธธ์— ์†ํ•œ ๋ชจ๋“  ์นธ์˜ ๋†’์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•œ๋‹ค. ๋˜๋Š”, ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์•„์„œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฒฝ์‚ฌ๋กœ๋Š” ๋†’์ด๊ฐ€ ํ•ญ์ƒ 1์ด๋ฉฐ, ๊ธธ์ด๋Š” L์ด๋‹ค. ๋˜, ๊ฐœ์ˆ˜๋Š” ๋งค์šฐ ๋งŽ์•„ ๋ถ€์กฑํ•  ์ผ์ด ์—†๋‹ค. ๊ฒฝ์‚ฌ๋กœ๋Š” ๋‚ฎ์€ ์นธ๊ณผ ๋†’์€ ์นธ์„ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผํ•œ๋‹ค.

  • ๊ฒฝ์‚ฌ๋กœ๋Š” ๋‚ฎ์€ ์นธ์— ๋†“์œผ๋ฉฐ, L๊ฐœ์˜ ์—ฐ์†๋œ ์นธ์— ๊ฒฝ์‚ฌ๋กœ์˜ ๋ฐ”๋‹ฅ์ด ๋ชจ๋‘ ์ ‘ํ•ด์•ผ ํ•œ๋‹ค.
  • ๋‚ฎ์€ ์นธ๊ณผ ๋†’์€ ์นธ์˜ ๋†’์ด ์ฐจ์ด๋Š” 1์ด์–ด์•ผ ํ•œ๋‹ค.
  • ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์„ ๋‚ฎ์€ ์นธ์˜ ๋†’์ด๋Š” ๋ชจ๋‘ ๊ฐ™์•„์•ผ ํ•˜๊ณ , L๊ฐœ์˜ ์นธ์ด ์—ฐ์†๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์„ ์ˆ˜ ์—†๋‹ค.

  • ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์€ ๊ณณ์— ๋˜ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“๋Š” ๊ฒฝ์šฐ
  • ๋‚ฎ์€ ์นธ๊ณผ ๋†’์€ ์นธ์˜ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์ด ์•„๋‹Œ ๊ฒฝ์šฐ
  • ๋‚ฎ์€ ์ง€์ ์˜ ์นธ์˜ ๋†’์ด๊ฐ€ ๋ชจ๋‘ ๊ฐ™์ง€ ์•Š๊ฑฐ๋‚˜, L๊ฐœ๊ฐ€ ์—ฐ์†๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“๋‹ค๊ฐ€ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

L = 2์ธ ๊ฒฝ์šฐ์— ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ๋ถ€ํ„ฐ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ, 4๋ฒˆ ์˜ˆ์ œ๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, 1๋ฒˆ์€ ๋†’์ด ์ฐจ์ด๊ฐ€ 1์ด ์•„๋‹ˆ๋ผ์„œ, 2๋ฒˆ์€ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋ฐ”๋‹ฅ๊ณผ ์ ‘ํ•˜๊ฒŒ ๋†“์ง€ ์•Š์•„์„œ, 3๋ฒˆ์€ ๊ฒน์ณ์„œ ๋†“์•„์„œ, 4๋ฒˆ์€ ๊ธฐ์šธ์ด๊ฒŒ ๋†“์•„์„œ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์ด๋‹ค.

๊ฐ€์žฅ ์œ„์— ์ฃผ์–ด์ง„ ๊ทธ๋ฆผ ์˜ˆ์˜ ๊ฒฝ์šฐ์— ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์€ ํŒŒ๋ž€์ƒ‰์œผ๋กœ, ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ธธ์€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๊ฒฝ์‚ฌ๋กœ์˜ ๊ธธ์ด L = 2์ด๋‹ค.

์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ „์ฒด ์ฝ”๋“œ

import java.util.*;
import java.io.*;

public class Main {
	static int N;
	static int L;
	static int map[][];
	static int result;
	static int row[][];
	static int col[][];
	static char lr[][];
	public static void main(String[] args) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
		N = Integer.parseInt(st.nextToken());
		L = Integer.parseInt(st.nextToken());
		map = new int[N][N];
		row = new int[N][N];
		col = new int[N][N];
		lr = new char[N][N];
		for(int i=0; i<N; i++) {
			st = new StringTokenizer(bf.readLine(), " ");
			for(int j=0; j<N; j++)
				map[i][j] = Integer.parseInt(st.nextToken());
		}
		set_col();
		set_row();
		System.out.println(result);
	}
	static void set_col(){
		for(int i=0; i<N; i++) {
			f:for(int j=1; j<N; j++) {
				if(map[i][j-1] == map[i][j] + 1) {
					if(j+L>N) continue f;
					for(int k = j; k<j+L; k++) {
						if((k != j+L-1 && map[i][k+1] != map[i][k]) || col[i][k] == 1) {
							for(int u=k-1; u>=j; u--) {
								col[i][u] -= 1;
							}
							j = k;
							continue f;
						}
						col[i][k] += 1;
					}
					lr[i][j] = 'l';
					j = j+L-1;
					continue f;
				}
				else if(map[i][j-1] +1 == map[i][j]) {
					if(j-L < 0) continue f;
					for(int k = j-1; k>=j-L; k--) {
						if((k> 0 && k-1 >= j-L && map[i][k-1] != map[i][k]) || col[i][k] == 1) {
							for(int u=k+1; u<j; u++) {
								col[i][u] -= 1;
							}
							continue f;
						}
						col[i][k] += 1;
					}
					lr[i][j-1] = 'r';
					continue f;					
				}
			}
		}
		// ์ถœ๋ ฅ
		f: for(int i=0; i<N; i++) {
			for(int j=1; j<N; j++) {
				if(map[i][j-1] != map[i][j] && map[i][j-1] != map[i][j] + col[i][j] && map[i][j-1]+col[i][j-1] != map[i][j]) continue f;
				if(map[i][j-1] != map[i][j]) {
					if(map[i][j-1] == map[i][j] + col[i][j] && lr[i][j] != 'l') continue f;
					else if(lr[i][j-1] != 'r' && map[i][j-1]+col[i][j-1] == map[i][j]) continue f;
					}
				}
			result++;
		}
	}
	static void set_row(){
		for(int j=0; j<N; j++) {
			f:for(int i=1; i<N; i++) {
				if(map[i-1][j] == map[i][j] + 1) {
					if(i+L>N) continue f;
					for(int k = i; k<i+L; k++) {
						if((k != i+L-1 && map[k+1][j] != map[k][j]) || row[k][j] == 1) {
							for(int u=k-1; u>=j; u--) {
								row[u][j] -= 1;
							}
							i = k;
							continue f;
						}
						row[k][j] += 1;
					}
					lr[i][j] = 'l';
					i = i+L-1;
					continue f;
				}
				else if(map[i-1][j] +1 == map[i][j]) {
					if(i-L < 0) continue f;
					for(int k = i-1; k>=i-L; k--) {
						if((k> 0 && k-1 >= i-L && map[k-1][j] != map[k][j]) || row[k][j] == 1) {
							for(int u=k+1; u<i; u++) {
								row[u][j] -= 1;
							}
							continue f;
						}
						row[k][j] += 1;
					}
					lr[i-1][j] = 'r';
					continue f;					
				}
			}
		}
		f: for(int j=0; j<N; j++) {
			for(int i=1; i<N; i++) {
				if(map[i-1][j] != map[i][j] && map[i-1][j] != map[i][j] + row[i][j] && map[i-1][j]+row[i-1][j] != map[i][j]) continue f;
				if(map[i-1][j] != map[i][j]) {
					if(map[i-1][j] == map[i][j] + row[i][j] && lr[i][j] != 'l') continue f;
					else if(lr[i-1][j] != 'r' && map[i-1][j]+row[i-1][j] == map[i][j]) continue f;
					}
				}
			result++;
		}
	}
}

ํ•œ ์ค„ ์”ฉ ์‚ดํŽด๋ณด์ž!

static int N;
static int L;
static int map[][];
static int result;
static int row[][];
static int col[][];
static char lr[][];

N์—๋Š” ๋งต์˜ ํฌ๊ธฐ, L์€ ๊ฒฝ์‚ฌ๋กœ์˜ ๊ธธ์ด, map์—๋Š” ์ „์ฒด ์ง€๋„์˜ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. result์—๋Š” ๊ฒฐ๊ณผ๊ฐ’์„ ๋„ฃ์–ด ์ค„๊ฒƒ์ด๋‹ค. row๋Š” ํ–‰๋‹จ์œ„์˜ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ํ‘œ์‹œํ•˜๊ณ  col์€ ์—ด๋‹จ์œ„์˜ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ํ‘œ์‹œํ•ด์ค€๋‹ค. lr๋ฅผ ํ†ตํ•ด ๊ฒฝ์‚ฌ๋กœ์˜ ๋†’์€ ๋ถ€๋ถ„์ด ์„ค์น˜๋œ ์œ„์น˜๊ฐ€ right์ธ์ง€ left์ธ์ง€ ๊ตฌ๋ถ„ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

set_col๊ณผ set_row์€ ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ํ–‰๊ณผ ์—ด์˜ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋‘ ํ•จ์ˆ˜๋Š” ์—ญํ• ์ด ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋งŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ set_col๋งŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

static void set_col(){
	for(int i=0; i<N; i++) {
		f:for(int j=1; j<N; j++) {
			if(map[i][j-1] == map[i][j] + 1) {
				if(j+L>N) continue f;
				for(int k = j; k<j+L; k++) {
					if((k != j+L-1 && map[i][k+1] != map[i][k]) || col[i][k] == 1) {
						for(int u=k-1; u>=j; u--) {
							col[i][u] -= 1;
						}
						j = k;
						continue f;
					}
					col[i][k] += 1;
				}
				lr[i][j] = 'l';
				j = j+L-1;
				continue f;
			}

์ด์ค‘ for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๊ทธ ์ „๊ณผ ๋†’์ด๊ฐ€ 1์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ(๋†’์ด๊ฐ€ 1๋‚ฎ์€ ๊ฒฝ์šฐ) ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์•„์ค„ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ธธ์ด๊ฐ€ ๊ฒฉ์ž๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ continue ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“๋Š” ๊ณผ์ •์—์„œ ๊ธธ์ด ํ‰ํ‰ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜(๋†’์ด๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒฝ์šฐ) ์ด๋ฏธ ๊ฒฝ์‚ฌ๋กœ๊ฐ€ ๋†“์—ฌ์žˆ๋Š” ๊ฒฝ์šฐ, ๋†“์•˜๋˜ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“๊ธฐ ์œ„ํ•ด ํ™•์ธํ–ˆ๋˜ ๊ณณ๊นŒ์ง€๋Š” ๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ j๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์กฐ์‚ฌํ•˜์ง€ ์•Š๋„๋ก ํ•ด์ค€๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ์—†์ด ๊ฒฝ์‚ฌ๋กœ๊ฐ€ ์ž˜ ๋†“์—ฌ์กŒ๋‹ค๋ฉด lr๋ฐฐ์—ด์— ์™ผ์ชฝ์—์„œ ๋†“์•„์กŒ๋‹ค๋Š” lํ‘œ์‹œ๋ฅผ ํ•ด์ค€๋‹ค. ์ด ๊ฒฝ์šฐ๋„ ๊ฒฝ์‚ฌ๋กœ๊ฐ€ ๋†“์—ฌ์ง„ ๊ณณ์€ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ j๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

		else if(map[i-1][j] +1 == map[i][j]) {
			if(i-L < 0) continue f;
			for(int k = i-1; k>=i-L; k--) {
				if((k> 0 && k-1 >= i-L && map[k-1][j] != map[k][j]) || row[k][j] == 1) {
					for(int u=k+1; u<i; u++) {
						row[u][j] -= 1;
					}
					continue f;
				}
				row[k][j] += 1;
			}
			lr[i-1][j] = 'r';
			continue f;					
		}
	}
}

๊ทธ์ „๊ณผ ๋†’์ด๊ฐ€ 1๋†’์€ ๊ฒฝ์šฐ๋Š” ์•ž์œผ๋กœ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ๋†“์•„์ฃผ๊ฒŒ๋œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฒฝ์‚ฌ๋กœ๋ฅผ ์ž˜ ๋†“์•„์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  lr๋ฐฐ์—ด์—๋Š” rํ‘œ์‹œ๋ฅผ ํ•ด์ค€๋‹ค.

	f: for(int i=0; i<N; i++) {
		for(int j=1; j<N; j++) {
			if(map[i][j-1] != map[i][j] && map[i][j-1] != map[i][j] + col[i][j] && map[i][j-1]+col[i][j-1] != map[i][j]) continue f;
			if(map[i][j-1] != map[i][j]) {
				if(map[i][j-1] == map[i][j] + col[i][j] && lr[i][j] != 'l') continue f;
				else if(lr[i][j-1] != 'r' && map[i][j-1]+col[i][j-1] == map[i][j]) continue f;
				}
			}
		result++;
	}
}

๊ฒฝ์‚ฌ๋กœ์™€ map์˜ ๋†’์ด์˜ ํ•ฉ์ด ๊ทธ ์ „ map์˜ ๋†’์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ„๋‹ค. ์ด๋•Œ ์œ ์˜ํ•ด์•ผํ•  ๊ฒƒ์€ l๋กœ ๋†“์—ฌ์ง„ ๊ฒƒ์ธ์ง€ r๋กœ ๋†“์—ฌ์ง„ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!

๋ฌธ์ œ์˜ ์˜ˆ์ œ 4์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธธ์ธ๋ฐ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ธธ์€ ๊ฒฝ์‚ฌ๋กœ์˜ ๊ธธ์ด๊ฐ€ 1์ด์–ด์„œ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•ด์„œ ๋†“์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‘˜ ์ค‘ ํ•œ๊ฐ€์ง€๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค

Comments