BOJ 14620. ๊ฝ๊ธธ
๐โโ๏ธ[Silver II] ๊ฝ๊ธธ - 14620
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2028 KB, ์๊ฐ: 36 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ
์ ์ถ ์ผ์
2024๋ 11์ 21์ผ 15:44:20
๋ฌธ์ ์ค๋ช
2017๋ 4์ 5์ผ ์๋ชฉ์ผ์ ๋ง์ดํ ์ง์๋ ๋๋ฌด๋ฅผ ์ฌ๋ ๋์ ํ์ดํ ํฌ๊ด ์ ํ๋จ์ ๊ฝ์ ์ฌ์ด ๋ฑ๊ตํ ๋ ๋ง๋ค ๊ฝ๊ธธ์ ๊ฑท๊ณ ์ถ์๋ค.
์ง์๊ฐ ๊ฐ์ง ๊ฝ์ ์จ์์ ๊ฝ์ ์ฌ๊ณ ๋๋ฉด ์ ํํ 1๋ ํ์ ๊ฝ์ด ํผ๋ฏ๋ก ์ง์๋ ๋ค์ํด ์๋ชฉ์ผ ๋ถํฐ ๊ฝ๊ธธ์ ๊ฑธ์ ์ ์๋ค.
ํ์ง๋ง ์ง์์๊ฒ๋ ๊ฝ์ ์จ์์ด ์ธ๊ฐ๋ฐ์ ์์์ผ๋ฏ๋ก ์ธ ๊ฐ์ ๊ฝ์ด ํ๋๋ ์ฃฝ์ง ์๊ณ 1๋ ํ์ ๊ฝ์์ด ๋ง๊ฐํ๊ธธ ์ํ๋ค.
๊ฝ๋ฐญ์ N*N์ ๊ฒฉ์ ๋ชจ์์ด๊ณ ์ง์๋ ์จ์์ (1,1)~(N,N)์ ์ง์ ์ค ํ๊ณณ์ ์ฌ์ ์ ์๋ค. ๊ฝ์ ์จ์์ ๊ทธ๋ฆผ (a)์ฒ๋ผ ์ฌ์ด์ง๋ฉฐ 1๋ ํ ๊ฝ์ด ํผ๋ฉด ๊ทธ๋ฆผ (b)๋ชจ์์ด ๋๋ค.
๊ฝ์ ์ฌ์ ๋๋ ์ฃผ์ํ ์ ์ด์๋ค. ์ด๋ค ์จ์์ด ๊ฝ์ด ํ ๋ค ๋ค๋ฅธ ๊ฝ์(ํน์ ๊ฝ์ )๊ณผ ๋ฟ๊ฒ ๋ ๊ฒฝ์ฐ ๋ ๊ฝ ๋ชจ๋ ์ฃฝ์ด๋ฒ๋ฆฐ๋ค. ๋ ํ๋จ ๋ฐ์ผ๋ก ๊ฝ์์ด ๋๊ฐ๊ฒ ๋๋ค๋ฉด ๊ทธ ๊ฝ์ ์ฃฝ์ด๋ฒ๋ฆฌ๊ณ ๋ง๋ค.
๊ทธ๋ฆผ(c)๋ ์ธ ๊ฝ์ด ์ ์์ ์ผ๋ก ํ ๋ชจ์์ด๊ณ ๊ทธ๋ฆผ(d)๋ ๋ ๊ฝ์ด ์ฃฝ์ด๋ฒ๋ฆฐ ๋ชจ์์ด๋ค.
ํ์ดํ ํฌ ์ ํ๋จ์ ๋์ฌ ๊ฐ๊ฒฉ์ ๊ฒฉ์์ ํ ์ ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ง์๋ ์๋ก ๋ค๋ฅธ ์ธ ์จ์์ ๋ชจ๋ ๊ฝ์ด ํผ๊ฒํ๋ฉด์ ๊ฐ์ฅ ์ผ ๊ฐ๊ฒฉ์ ํ๋จ์ ๋์ฌํ๊ณ ์ถ๋ค.
๋จ ํ๋จ์ ๋์ฌํ ๋๋ ๊ฝ์์ด ํ ๋ชจ์์ ๊ธฐ์ค์ผ๋ก ๋์ฌ๋ฅผ ํด์ผํ๋ฏ๋ก ๊ฝ ํ๋๋น 5ํ์ ๋ ์ ๋์ฌํด์ผ๋ง ํ๋ค.
๋์ด ๋ง์ง ์์ ์ง์๋ฅผ ์ํ์ฌ ์ง์๊ฐ ๊ฝ์ ์ฌ๊ธฐ ์ํด ํ์ํ ์ต์๋น์ฉ์ ๊ตฌํด์ฃผ์!
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ํ๋จ์ ํ ๋ณ์ ๊ธธ์ด N(6โคNโค10)์ด ๋ค์ด์จ๋ค.
์ดํ N๊ฐ์ ์ค์ N๊ฐ์ฉ ํ๋จ์ ์ง์ ๋น ๊ฐ๊ฒฉ(0โคGโค200)์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฝ์ ์ฌ๊ธฐ ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
3๊ฐ์ ์ขํ๋ฅผ ์ ํํ๊ณ ๊ฝ์์ด ๊ณ์น๋์ง ํ์ธํ๋ค.
๊ณ์น์ง ์๋๋ค๋ฉด ๊ฐ ๋น์ฉ์ ๊ณ์ฐํ๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ณ ์ต์์ ๋น์ฉ์ ๊ตฌํ๋ค.
๋จผ์ 3๊ฐ์ ์ขํ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์ 2์ฐจ์ ๋ฐฐ์ด์ 1์ฐจ์ ๋ฐฐ์ด๋ก ์๊ฐํ๋ค.
nn๋ฐฐ์ด์ด๋ฏ๋ก ์ขํ๋ฅผ nn๋งํผ ์ํํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ 3๊ฐ์ ์ขํ๋ฅผ ์ ํํด์ผํ๋ฏ๋ก 3์ค for๋ฌธ์ ์ฌ์ฉํ๋ค.
// 3๊ฐ ์ ํ
for (int i = 0; i < n * n - 2; ++i)
{
for (int j = i + 1; j < n * n - 1; ++j)
{
for (int k = j + 1; k < n * n; ++k)
{
// 1์ฐจ์ ์ธ๋ฑ์ค๋ฅผ 2์ฐจ์ ์ขํ๋ก ๋ณํ
int row1 = i / n;
int col1 = i % n;
int row2 = j / n;
int col2 = j % n;
int row3 = k / n;
int col3 = k % n;
}
}
}
์ด๋ ๊ฒ ํ๋ฉด 3๊ฐ์ ์ขํ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฝ์ด ๊ฐ์ฅ ์๋ฆฌ์ ์์ ๊ฒฝ์ฐ๋ ๊ฝ์์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฏ๋ก ์ด ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์คฌ๋ค.
if (row1 == 0 || col1 == 0 || row1 == n - 1 || col1 == n - 1)
continue;
if (row2 == 0 || col2 == 0 || row2 == n - 1 || col2 == n - 1)
continue;
if (row3 == 0 || col3 == 0 || row3 == n - 1 || col3 == n - 1)
continue;
๊ฝ์์ด ๊ณ์น๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๊ธฐ ์ํด์ check๋ฐฐ์ด์ ๋ฐ๋ก ๋ง๋ค์ด์ ์ฌ์ฉํ ์๋ ์์ง๋ง set์ ์ด์ฉํด์ ์ค๋ณต์ ์ฒดํฌํ๋ค.
๋์์ temp์ ๋น์ฉ์ ๊ณ์ฐ๋ ํด์คฌ๋ค.
// ์กฐํฉ ์ ์ฅ
set<pair<int, int>> s;
int temp = 0;
s.insert({ row1, col1 }); temp += board[row1][col1];
s.insert({ row2, col2 }); temp += board[row2][col2];
s.insert({ row3, col3 }); temp += board[row3][col3];
for (int dir = 0; dir < 4; ++dir)
{
pair<int, int> n1 = { row1 + dy[dir], col1 + dx[dir] };
pair<int, int> n2 = { row2 + dy[dir], col2 + dx[dir] };
pair<int, int> n3 = { row3 + dy[dir], col3 + dx[dir] };
s.insert(n1);
s.insert(n2);
s.insert(n3);
temp += board[n1.first][n1.second];
temp += board[n2.first][n2.second];
temp += board[n3.first][n3.second];
}
// ๊ฝ์์ด ๊ณ์น๋๊ฐ?
if (s.size() != 15)
continue;
set์ ๊ฐ์๊ฐ 15๊ฐ๊ฐ ์๋๋ผ๋ฉด ์ค๋ณต๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ์ด๋ฏ๋ก ๋์ด๊ฐ๋ค.
์ต์ข
์ ์ผ๋ก ์ต์์ ๋น์ฉ์ ํ์ธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ๋ค.
res = min(res, temp);
3๊ฐ์ ์ขํ๋ผ๊ณ ๋ช ์๋ ๋ฌธ์ ์ฌ์ 3์ค for๋ฌธ๋ ๋์์ง ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ง์ฝ์ ๊ฝ์ ๊ฐ์๊น์ง ๋ฌธ์ ์์ ๋ฌ๋ผ์ง ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด for๋ฌธ์ด ์๋๋ผ ์์ด์ ์ง์ ๊ตฌํด์ผ ํ ํ์๊ฐ ์๊ธด๋ค.
์์ด์ ๋ง๋ค์ด๋ณธ ๊ฒฝํ์ด ์์ด์ ๊ทธ๊ฑธ ๋ค์ ๋ณต์ตํด๋ณด์๋ฉด ์๋์ ๊ฐ์ด ์งฐ๋ค.
int n, r, ch[20];
void DFS(int s, int L)
{
if (L == r)
{
for (int i = 0; i < L; ++i)
{
cout << ch[i] << " ";
}
cout << endl;
}
else
{
for (int i = s; i < n; ++i)
{
ch[L] = i;
DFS(i + 1, L + 1);
}
}
}
2์ฐจ์ ๋ฐฐ์ด์์ 3๊ฐ๋ฅผ ์ ํํด์ผํ๋๋ฐ pair<int, int>๋ฅผ ๋ด๋ vector๋ฅผ ๋ค์ ๋ง๋ค์ด์ ํ๋์ ์ธ๋ฑ์ค๋ก ์ขํ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ๋ง๋ค๋ฉด ์ ๋ฐฉ๋ฒ์ ํตํด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์์๊ฑฐ๊ฐ๋ค.
๐์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int n, res = INT_MAX;
vector<vector<int>> board;
pair<int, int> coordi;
int dy[] = { 0, 1, 0, -1 };
int dx[] = { 1, 0, -1, 0 };
void solve()
{
cin >> n;
board = vector<vector<int>>(n, vector<int>(n));
for (int y = 0; y < n; ++y)
{
for (int x = 0; x < n; ++x)
{
cin >> board[y][x];
}
}
// 3๊ฐ ์ ํ
for (int i = 0; i < n * n - 2; ++i)
{
for (int j = i + 1; j < n * n - 1; ++j)
{
for (int k = j + 1; k < n * n; ++k)
{
// 1์ฐจ์ ์ธ๋ฑ์ค๋ฅผ 2์ฐจ์ ์ขํ๋ก ๋ณํ
int row1 = i / n;
int col1 = i % n;
int row2 = j / n;
int col2 = j % n;
int row3 = k / n;
int col3 = k % n;
if (row1 == 0 || col1 == 0 || row1 == n - 1 || col1 == n - 1)
continue;
if (row2 == 0 || col2 == 0 || row2 == n - 1 || col2 == n - 1)
continue;
if (row3 == 0 || col3 == 0 || row3 == n - 1 || col3 == n - 1)
continue;
// ์กฐํฉ ์ ์ฅ
set<pair<int, int>> s;
int temp = 0;
s.insert({ row1, col1 }); temp += board[row1][col1];
s.insert({ row2, col2 }); temp += board[row2][col2];
s.insert({ row3, col3 }); temp += board[row3][col3];
for (int dir = 0; dir < 4; ++dir)
{
pair<int, int> n1 = { row1 + dy[dir], col1 + dx[dir] };
pair<int, int> n2 = { row2 + dy[dir], col2 + dx[dir] };
pair<int, int> n3 = { row3 + dy[dir], col3 + dx[dir] };
s.insert(n1);
s.insert(n2);
s.insert(n3);
temp += board[n1.first][n1.second];
temp += board[n2.first][n2.second];
temp += board[n3.first][n3.second];
}
// ๊ฝ์์ด ๊ณ์น๋๊ฐ?
if (s.size() != 15)
continue;
// ๋น์ฉ ์ฒดํฌ
res = min(res, temp);
}
}
}
cout << res;
}
int main()
{
FILE* stream;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen_s(&stream, "input.txt", "rt", stdin);
solve();
return 0;
}