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;
}
}
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 1094 ๋ง๋๊ธฐ - Java (0) | 2022.10.29 |
---|---|
[BOJ] 17471 ๊ฒ๋ฆฌ๋งจ๋๋ง - Java (1) | 2022.10.28 |
[BOJ] 17140 ์ด์ฐจ์ ๋ฐฐ์ด๊ณผ ์ฐ์ฐ - Java (0) | 2022.10.27 |
[BOJ] 16236 ์๊ธฐ์์ด - Java (0) | 2022.10.23 |
[BOJ] 17143 ๋์์ - Java (0) | 2022.10.23 |