๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

17779๋ฒˆ: ๊ฒŒ๋ฆฌ๋งจ๋”๋ง 2

์žฌํ˜„์‹œ์˜ ์‹œ์žฅ ๊ตฌ์žฌํ˜„์€ ์ง€๋‚œ ๋ช‡ ๋…„๊ฐ„ ๊ฒŒ๋ฆฌ๋งจ๋”๋ง์„ ํ†ตํ•ด์„œ ์ž์‹ ์˜ ๋‹น์—๊ฒŒ ์œ ๋ฆฌํ•˜๊ฒŒ ์„ ๊ฑฐ๊ตฌ๋ฅผ ํš์ •ํ–ˆ๋‹ค. ๊ฒฌ์ œํ•  ๊ถŒ๋ ฅ์ด ์—†์–ด์ง„ ๊ตฌ์žฌํ˜„์€ ๊ถŒ๋ ฅ์„ ๋งค์šฐ ๋ถ€๋‹นํ•˜๊ฒŒ ํ–‰์‚ฌํ–ˆ๊ณ , ์‹ฌ์ง€์–ด๋Š” ์‹œ์˜ ์ด๋ฆ„

www.acmicpc.net


1. ๋ฌธ์ œ ์š”์•ฝ

๊ธฐ์ค€์  (x,y)์— ๋Œ€ํ•˜์—ฌ ๊ฒฝ๊ณ„์„ ์„ ๊ตฌํ•˜๊ณ , ๊ฒฝ๊ณ„์„ ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ์œ„ 1, ์˜ค๋ฅธ์ชฝ ์œ„ 2, ์™ผ์ชฝ ์•„๋ž˜ 3, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ 4,

๊ทธ๋ฆฌ๊ณ  ๊ฒฝ๊ณ„์„  ํฌํ•จ ๋‚ด๋ถ€๋ฅผ 5๊ตฌ์—ญ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

* ๊ฐ ์นธ์€ 5๊ตฌ์—ญ ์ค‘ ํ•œ ๊ตฌ์—ญ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋ฉฐ, ํ•˜๋‚˜์˜ ๊ตฌ์—ญ์€ ๋ชจ๋‘ ์นธ๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

* ์ธ์ ‘ํ•œ ๊ตฌ์—ญ์€ 0๊ฐœ ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.(์นธ 1๊ฐœ๊ฐ€ ํ•˜๋‚˜์˜ ๊ตฌ์—ญ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.)

 

2. ํ’€์ด

์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ํ’€์—ˆ๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ

๋ฒ”์œ„๊ฐ€ ๋‹ค ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ๊ฐ€๋Šฅํ•˜์˜€๋‹ค.

์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ์•ˆ๊ฑธ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ๋‹ค

 

์šฐ์„  ๊ฐ€์žฅ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์€ ๋ฌธ์ œ์— ์ขŒํ‘œ๊ฐ€ (x,y)๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด์žˆ๋‹ค.

x๋ฅผ ์„ธ๋กœ, y๋ฅผ ๊ฐ€๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ํ’€์—ˆ๋Š”๋ฐ ์ž๊พธ ํ—ท๊ฐˆ๋ ค์„œ ArrayIndexOutOfBounds ์˜ค๋ฅ˜๋ฅผ ๊ฝค๋‚˜ ์ž์ฃผ ๋ดค๋‹ค.

 

๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋“  d1, d2์˜ ์กฐํ•ฉ์„ ์‹œ๋„ํ•˜์—ฌ ๋‹ค์Œ์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

1. ๊ฒฝ๊ณ„์„ ์„ ๊ตฌํ•œ๋‹ค.

2. 1๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค. => (1,1) ๋ถ€ํ„ฐ ์‹œ์ž‘

3. 2๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค. => (1,N) ๋ถ€ํ„ฐ ์‹œ์ž‘

4. 3๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค. => (N,1) ๋ถ€ํ„ฐ ์‹œ์ž‘

5. 4๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค. => (N,N) ๋ถ€ํ„ฐ ์‹œ์ž‘

6. ์ „์ฒด ๊ตฌ์—ญ์˜ ํ•ฉ - (1,2,3,4 ๊ตฌ์—ญ์˜ ํ•ฉ) ์œผ๋กœ 5๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค.

7. max๊ตฌ์—ญ - min๊ตฌ์—ญ์„ ๊ตฌํ•œ๋‹ค.

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์— ๋Œ€ํ•ด max๊ตฌ์—ญ-min๊ตฌ์—ญ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

 

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class BOJ_17779_๊ฒŒ๋ฆฌ๋ฉ˜๋”๋ง2 {

	static int[] people;
	static int[][] map;
	static int N, ans, total;
	static boolean[][] line; //๊ฒฝ๊ณ„์„ 
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		N = Integer.parseInt(br.readLine());
		map = new int[N+1][N+1];
		
		for (int i=1; i<=N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j=1; j<=N; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				total += map[i][j];
			}
		} //์ž…๋ ฅ ๋
		
		ans = Integer.MAX_VALUE;
		solution();
		System.out.println(ans);
	}
	
	static void solution() {
		//๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•ด์„œ ์‹œ๋„
		for (int i=1; i<=N; i++) {
			for (int j=1; j<=N; j++) {
				
				for (int d1=1; d1<N; d1++) {
					for (int d2=1; d2<N; d2++) {
						if ((i==1&&j==1) || (i==N&&j==1) || (i==N&&j==1) || (i==N&&j==N)) continue;
						if (j-d1 >= 1 && j+d2 <= N && i+d1+d2 <= N) { //๊ฒฝ๊ณ„์„  ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๋•Œ
							int res = solution(i, j, d1, d2);
							ans = Math.min(ans, res);
						}
						
					}
				}
				
			}
		}
	}
	
	static int solution(int sy, int sx, int d1, int d2) {
		
		people = new int[6];
		line = new boolean[N+1][N+1];
		int res = 0;
		
		//๊ฒฝ๊ณ„์„  ๊ตฌํ•จ
		for (int d = 0; d<=d1; d++) {
			line[sy+d][sx-d] = true;
		}
		for (int d = 0; d<=d2; d++) {
			line[sy+d][sx+d] = true;
		}
		for (int d = 0; d<=d2; d++) {
			line[sy+d1+d][sx-d1+d] = true;
		}
		for (int d = 0; d<=d1; d++) {
			line[sy+d2+d][sx+d2-d] = true;
		}
		
		//1๋ฒˆ๊ตฌ์—ญ
		for (int y=1; y<sy+d1; y++) {
			for (int x=1; x<=sx; x++) {
				if (line[y][x]) break;
				people[1] += map[y][x];
			}
		}
		
		//2๋ฒˆ๊ตฌ์—ญ
		for (int y=1; y<=sy+d2; y++) {
			for (int x=N; x>=sx+1; x--) {
				if (line[y][x]) break;
				people[2] += map[y][x];
			}
		}
		
		// 3๋ฒˆ๊ตฌ์—ญ
		for (int y = N; y >=sy+d1 ; y--) {
			for (int x =1; x <sx-d1+d2 ; x++) {
				if (line[y][x]) break;
				people[3] += map[y][x];
			}
		}
		
		// 4๋ฒˆ๊ตฌ์—ญ
		for (int y = N; y >= sy+d2+1; y--) {
			for (int x = N; x >= sx - d1+d2; x--) {
				if (line[y][x]) break;
				people[4] += map[y][x];
			}
		}

		//5๋ฒˆ๊ตฌ์—ญ
		int sum=0;
		for (int i=1; i<=4; i++) {
			sum+=people[i];
		}
		people[5] = total - sum;
		
		//max, min ์ฐพ๊ธฐ
		int max=0;
		int min=Integer.MAX_VALUE;
		for (int i=1; i<=5; i++) {
			max = Math.max(max, people[i]);
			min = Math.min(min, people[i]);
		}
		return max-min;
	}
	
}