๋ฐฑ์ค 17779๋ฒ : ๊ฒ๋ฆฌ๋ฉ๋๋ง2 with C++
๋ฌธ์
์ฌํ์์ ์์ฅ ๊ตฌ์ฌํ์ ์ง๋ ๋ช ๋ ๊ฐ ๊ฒ๋ฆฌ๋งจ๋๋ง์ ํตํด์ ์์ ์ ๋น์๊ฒ ์ ๋ฆฌํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ค. ๊ฒฌ์ ํ ๊ถ๋ ฅ์ด ์์ด์ง ๊ตฌ์ฌํ์ ๊ถ๋ ฅ์ ๋งค์ฐ ๋ถ๋นํ๊ฒ ํ์ฌํ๊ณ , ์ฌ์ง์ด๋ ์์ ์ด๋ฆ๋ ์ฌํ์๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋ฒ ์ ๊ฑฐ์์๋ ์ต๋ํ ๊ณตํํ๊ฒ ์ ๊ฑฐ๊ตฌ๋ฅผ ํ์ ํ๋ ค๊ณ ํ๋ค.
์ฌํ์๋ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฒฉ์์ ๊ฐ ์นธ์ ๊ตฌ์ญ์ ์๋ฏธํ๊ณ , rํ c์ด์ ์๋ ๊ตฌ์ญ์ (r, c)๋ก ๋ํ๋ผ ์ ์๋ค. ๊ตฌ์ญ์ ๋ค์ฏ ๊ฐ์ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ์ผ ํ๊ณ , ๊ฐ ๊ตฌ์ญ์ ๋ค์ฏ ์ ๊ฑฐ๊ตฌ ์ค ํ๋์ ํฌํจ๋์ด์ผ ํ๋ค. ์ ๊ฑฐ๊ตฌ๋ ๊ตฌ์ญ์ ์ ์ด๋ ํ๋ ํฌํจํด์ผ ํ๊ณ , ํ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋์ด ์๋ ๊ตฌ์ญ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ๊ตฌ์ญ A์์ ์ธ์ ํ ๊ตฌ์ญ์ ํตํด์ ๊ตฌ์ญ B๋ก ๊ฐ ์ ์์ ๋, ๋ ๊ตฌ์ญ์ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ๋ค. ์ค๊ฐ์ ํตํ๋ ์ธ์ ํ ๊ตฌ์ญ์ 0๊ฐ ์ด์์ด์ด์ผ ํ๊ณ , ๋ชจ๋ ๊ฐ์ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ๊ตฌ์ญ์ด์ด์ผ ํ๋ค.
์ ๊ฑฐ๊ตฌ๋ฅผ ๋๋๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ธฐ์ค์ (x, y)์ ๊ฒฝ๊ณ์ ๊ธธ์ด d1, d2๋ฅผ ์ ํ๋ค. (d1, d2 ≥ 1, 1 ≤ x < x+d1+d2 ≤ N, 1 ≤ y-d1 < y < y+d2 ≤ N)
- ๋ค์ ์นธ์ ๊ฒฝ๊ณ์ ์ด๋ค.
- (x, y), (x+1, y-1), ..., (x+d1, y-d1)
- (x, y), (x+1, y+1), ..., (x+d2, y+d2)
- (x+d1, y-d1), (x+d1+1, y-d1+1), ... (x+d1+d2, y-d1+d2)
- (x+d2, y+d2), (x+d2+1, y+d2-1), ..., (x+d2+d1, y+d2-d1)
- ๊ฒฝ๊ณ์ ๊ณผ ๊ฒฝ๊ณ์ ์ ์์ ํฌํจ๋์ด์๋ ๊ณณ์ 5๋ฒ ์ ๊ฑฐ๊ตฌ์ด๋ค.
- 5๋ฒ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋์ง ์์ ๊ตฌ์ญ (r, c)์ ์ ๊ฑฐ๊ตฌ ๋ฒํธ๋ ๋ค์ ๊ธฐ์ค์ ๋ฐ๋ฅธ๋ค.
- 1๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r < x+d1, 1 ≤ c ≤ y
- 2๋ฒ ์ ๊ฑฐ๊ตฌ: 1 ≤ r ≤ x+d2, y < c ≤ N
- 3๋ฒ ์ ๊ฑฐ๊ตฌ: x+d1 ≤ r ≤ N, 1 ≤ c < y-d1+d2
- 4๋ฒ ์ ๊ฑฐ๊ตฌ: x+d2 < r ≤ N, y-d1+d2 ≤ c ≤ N
์๋๋ ํฌ๊ธฐ๊ฐ 7×7์ธ ์ฌํ์๋ฅผ ๋ค์ฏ ๊ฐ์ ์ ๊ฑฐ๊ตฌ๋ก ๋๋ ๋ฐฉ๋ฒ์ ์์์ด๋ค.
x = 2, y = 4, d1 = 2, d2 = 2 | x = 2, y = 5, d1 = 3, d2 = 2 | x = 4, y = 3, d1 = 1, d2 = 1 |
๊ตฌ์ญ (r, c)์ ์ธ๊ตฌ๋ A[r][c]์ด๊ณ , ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ๋ ์ ๊ฑฐ๊ตฌ์ ํฌํจ๋ ๊ตฌ์ญ์ ์ธ๊ตฌ๋ฅผ ๋ชจ๋ ํฉํ ๊ฐ์ด๋ค. ์ ๊ฑฐ๊ตฌ๋ฅผ ๋๋๋ ๋ฐฉ๋ฒ ์ค์์, ์ธ๊ตฌ๊ฐ ๊ฐ์ฅ ๋ง์ ์ ๊ฑฐ๊ตฌ์ ๊ฐ์ฅ ์ ์ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฌํ์์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ N๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. rํ c์ด์ ์ ์๋ A[r][c]๋ฅผ ์๋ฏธํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ธ๊ตฌ๊ฐ ๊ฐ์ฅ ๋ง์ ์ ๊ฑฐ๊ตฌ์ ๊ฐ์ฅ ์ ์ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ํ
- 5 ≤ N ≤ 20
- 1 ≤ A[r][c] ≤ 100
๊ตฌํ ๋ฐฉ๋ฒ
๊ฒฝ๊ณ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์์ ๊ฐ ์ ๊ฑฐ๊ตฌ๋ณ ์ธ๊ตฌ์๋ฅผ ๊ตฌํ ๋ค, ์ต๋ ์ธ๊ตฌ ์์ ์ต์ ์ธ๊ตฌ ์์ ์ฐจ์ด๋ฅผ ๊ตฌํ์ฌ ๊ทธ ์ต์๊ฐ์ ๊ตฌํ์๋ค.
** 5๋ฒ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์๋ฅผ ๊ฐ์ฅ ๋จผ์ ๊ตฌํ ๋ค 5๋ฒ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ๋ฅผ ๋ชจ๋ 0์ผ๋ก ์ค์ ํ์ฌ 1~4๋ฒ ์ ๊ฑฐ๊ตฌ์ ์ธ๊ตฌ ์๋ฅผ ์ฌ๊ฐํ ํํ๋ก ์ฝ๊ฒ ๊ณ์ฐํ ์ ์๋๋ก ํ์๋ค.
๊ตฌํ ์๊ฐ
4ms
#include <iostream>
#include <algorithm>
using namespace std;
int A[21][21]; // ๊ฐ ๊ตฌ์ญ๋ณ ์ธ๊ตฌ ์
int people_gap(int r, int c, int d1, int d2, int N) {
int map[21][21]; // ๊ฐ ๊ตฌ์ญ๋ณ ์ธ๊ตฌ ์ ๋ณต์
std::copy(&A[0][0], &A[0][0] + 21 * 21, &map[0][0]);
int people[5] = { 0, }; // ๊ฐ ์ ๊ฑฐ๊ตฌ์ ์ด ์ธ๊ตฌ ์
// 5๋ฒ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ๊ตฌํ ๋ค ๊ฐ ๊ตฌ์ญ ์ธ๊ตฌ๋ฅผ 0์ผ๋ก ์ค์
for (int d = 0; d <= d2; d++) {
for (int dd = 0; dd <= d1; dd++) {
people[4] += map[r + d - dd][c + d + dd];
map[r + d - dd][c + d + dd] = 0;
}
}
for (int d = 0; d < d2; d++) {
for (int dd = 0; dd < d1; dd++) {
people[4] += map[r + d - dd][c + 1 + d + dd];
map[r + d - dd][c + 1 + d + dd] = 0;
}
}
// 1๋ฒ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ๊ตฌํ๊ธฐ
for (int i = 0; i < r; i++) {
for (int j = 0; j <= c + d1; j++) {
people[0] += map[i][j];
}
}
// 2๋ฒ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ๊ตฌํ๊ธฐ
for (int i = 0; i <= r - d1 + d2; i++) {
for (int j = c + d1 + 1; j < N; j++) {
people[1] += map[i][j];
}
}
// 3๋ฒ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ๊ตฌํ๊ธฐ
for (int i = r; i < N; i++) {
for (int j = 0; j < c + d2; j++) {
people[2] += map[i][j];
}
}
// 4๋ฒ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ๊ตฌํ๊ธฐ
for (int i = r - d1 + d2 + 1; i < N; i++) {
for (int j = c + d2; j < N; j++) {
people[3] += map[i][j];
}
}
sort(people, people + 5); // ๊ฐ ์ ๊ฑฐ๊ตฌ ์ธ๊ตฌ ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
return (people[4] - people[0]); // ์ต๋ ์ธ๊ตฌ ์ - ์ต์ ์ธ๊ตฌ ์
}
int main() {
int N;
int min = 10000;
cin >> N;
// ๊ฐ ๊ตฌ์ญ๋ณ ์ธ๊ตฌ ์ ์
๋ ฅ
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> A[i][j];
}
}
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
for (int d1 = 1; d1 < N; d1++) {
for (int d2 = 1; d2 < N; d2++) {
if (c + d1 + d2 >= N || r - d1 < 0 || r + d2 >= N)
{ // ๊ฒฝ๊ณ๊ฐ ๊ทธ๋ ค์ง์ง ์๋ ๊ฒฝ์ฐ
break;
}
int gap = people_gap(r, c, d1, d2, N);
if (gap < min) { // ์ธ๊ตฌ ์ฐจ์ด์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
min = gap;
}
}
}
}
}
cout << min;
return 0;
}