์ผ์ฑ SW ์ญ๋ํ ์คํธ 2022 ์๋ฐ๊ธฐ ๊ธฐ์ถ
์์ ์ฑ
์์ ๊ฐ Sam์ ๊ทธ๋ฆผ์ ๋ํ ์์ ์ฑ์ ํ๊ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ง๋ค์ด๋์ต๋๋ค. ๊ทธ๋ฆผ์ ํธ์์ n * n ํฌ๊ธฐ์ ๊ฒฉ์๋ก ์๊ฐํ๊ณ , ๊ฐ ์นธ์ ์๊น์ 1์ด์ 10์ดํ์ ์ซ์๋ก ํํํ์ฌ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด๋ณด๋ ค ํฉ๋๋ค.
๋ค์์ 5 * 5 ํฌ๊ธฐ์ ๊ทธ๋ฆผ์ ์์์ ๋๋ค.
๋จผ์ ์ด ๊ทธ๋ฆผ์์ ๋์ผํ ์ซ์๊ฐ ์ํ์ข์ฐ๋ก ์ธ์ ํด์๋ ๊ฒฝ์ฐ ๋์ผํ ๊ทธ๋ฃน์ด๋ผ ๋ณธ๋ค๋ฉด, ์ด 4๊ฐ์ ๊ทธ๋ฃน์ด ๋ง๋ค์ด์ง๊ฒ ๋ฉ๋๋ค.
์์ ์ ์๋ ๋ชจ๋ ๊ทธ๋ฃน ์์ ์กฐํ๋ก์์ ํฉ์ผ๋ก ์ ์๋ฉ๋๋ค. ๊ทธ๋ฃน a์ ๊ทธ๋ฃน b์ ์กฐํ๋ก์์ (๊ทธ๋ฃน a์ ์ํ ์นธ์ ์ + ๊ทธ๋ฃน b์ ์ํ ์นธ์ ์ ) x ๊ทธ๋ฃน a๋ฅผ ์ด๋ฃจ๊ณ ์๋ ์ซ์ ๊ฐ x ๊ทธ๋ฃน b๋ฅผ ์ด๋ฃจ๊ณ ์๋ ์ซ์ ๊ฐ x ๊ทธ๋ฃน a์ ๊ทธ๋ฃน b๊ฐ ์๋ก ๋ง๋ฟ์ ์๋ ๋ณ์ ์๋ก ์ ์๋ฉ๋๋ค.
์๋ก <Figure 2> ์์ ๋ ๊ทธ๋ฃน G2, G4์ ์กฐํ๋ก์์ (11 + 8) x 2 x 1 x 4 = 152๊ฐ ๋ฉ๋๋ค.
๊ทธ๋ฃน ์ ๊ฐ์ ์กฐํ๋ก์ ๊ฐ์ด 0๋ณด๋ค ํฐ ์กฐํฉ์ธ (G1, G2), (G2, G3), (G2, G4), (G3, G4) ์ ์กฐํ๋ก์ ๊ฐ์ ์ ๋ถ ๋ํ๋ฉด 48 + 192 + 152 + 156 = 548์ด ๋ฉ๋๋ค. ์ด๋ฅผ ์ด๊ธฐ ์์ ์ ์๋ผ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ธฐ ์์ ์ ์๋ฅผ ๊ตฌํ ๋ค์๋ ๊ทธ๋ฆผ์ ๋ํ ํ์ ์ ์งํํฉ๋๋ค.
ํ์ ์ ์ ์ค์ ๊ธฐ์ค์ผ๋ก ๋ ์ ์ ๊ทธ์ด ๋ง๋ค์ด์ง๋ ์ญ์ ๋ชจ์๊ณผ ๊ทธ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์งํ๋ฉ๋๋ค.
- ์ญ์ ๋ชจ์์ ๊ฒฝ์ฐ ํต์งธ๋ก ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90' ํ์ ํฉ๋๋ค.
- ์ญ์ ๋ชจ์์ ์ ์ธํ 4๊ฐ์ ์ ์ฌ๊ฐํ์ ๊ฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก 90'์ฉ ํ์ ์ด ์งํ๋ฉ๋๋ค.
๋ ๋ถ๋ถ์ ๋ํ ํ์ ์ด ๋์์ ์งํ๋๋ฏ๋ก ํ์ ์ดํ <Figure 4>๋ ๋ค์ ๋ชจ์ต์ด ๋ฉ๋๋ค.
์ด์ <Figure 7>์ ์์ ์ ์ ์ญ์ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋ฉด 442์ ์ด ๋ฉ๋๋ค. ์ด๋ 1ํ์ ์ดํ ์์ ์ ์๊ฐ ๋ฉ๋๋ค.
n * n ํฌ๊ธฐ์ ๊ทธ๋ฆผ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ์ด๊ธฐ ์์ ์ ์, 1ํ์ ์ดํ ์์ ์ ์, 2ํ์ ์ดํ ์์ ์ ์, ๊ทธ๋ฆฌ๊ณ 3ํ์ ์ดํ ์์ ์ ์์ ํฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์ธ์.
์ ๋ ฅ ํ์
์ฒซ ๋ฒ์งธ ์ค์ n์ด ์ฃผ์ด์ง๋๋ค. n์ ๋ฐ๋์ ํ์์
๋๋ค.
์ดํ n๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ํ์ ์น ํด์ ธ ์๋ ์๊น์ ๋ํ ์ ๋ณด์ธ ์ซ์๋ค์ด ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
- 3 ≤ n ≤ 29
- 1 ≤ ์ฃผ์ด์ง๋ ์ซ์ ≤ 10
์ถ๋ ฅ ํ์
์ฒซ ๋ฒ์งธ ์ค์ ์ด๊ธฐ ์์ ์ ์, 1ํ์ ์ดํ ์์ ์ ์, 2ํ์ ์ดํ ์์ ์ ์, ๊ทธ๋ฆฌ๊ณ 3ํ์ ์ดํ ์์ ์ ์๋ฅผ ๋ชจ๋ ํฉํ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
ํด์ค ์ฐธ๊ณ ํ๋ฉด์ ํ์๋๋ฐ๋
ํ๋ํ๋ ์ดํดํ๋ฉด์ ๋ค ๋ฐ์ ธ๊ฐ๋ฉด์ ํธ๋๋ผ ๋ฌธ์ ์ฝ๋๊ฒ๋ถํฐ ํ์ด ์ฑ๊ณต๊น์ง ์ด 3์๊ฐ์ด ๊ฑธ๋ฆฐ ๋ฌธ์ ....
์์ฆ ํ๊ต๋์๊ด์ด ๋ฐค 12์๊น์ง ์ด์ํ๋๋ฐ
์ค๋๋ 12์๊น์ง ๊ณต๋ถํ๋ค๊ฐ ์ด ๐ค
๋ฌธ์ ๊ฐ ๊ธธ๊ณ ์๊ตฌ์ฌํญ์ด ๋ง์ ์๋ฎฌ๋ ์ด์ ๋ฌธ์ ๊ฐ ์์ฆ ์ฝํ ํธ๋ ๋๋ผ๊ณ ํ๋ค์,,,
๋ง์ด ํ๋ฉด์ ์ตํ์ผ ์ค๋ ฅ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!
์์ ์ฑ ๋ฌธ์ ๋ ์ผ์ฑ ๊ธฐ์ถ ๋นก๊ตฌํ์ด๊ณ
dfs/bfs ์์ฉ๋ ฅ๊ณผ ์ฝ๊ฐ์ ๊ณต๊ฐ์ง๊ฐ๋ฅ๋ ฅ(?)์ด ํ์ํ ๋ฏ ํฉ๋๋ค
์ฒ์์ ์ ๋ ฅ๋ฐ๊ณ ๋์ ๊ทธ๋ฃน๋ฒํธ์ ๋ฐ๋ฅธ ๋งต์ ๋ง๋ค๊ณ , ์ด๋ค ๊ทธ๋ฃน์ ๋ช ๊ฐ์ ์๊ฐ ์๋์ง ๋ชจ๋ ์ ์ฅํด๋์ผ ํฉ๋๋ค.
ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์๋ ํ์ ๋ง๊ณ ์ด์ค๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํด์ผ ๋นผ๋จน์ง ์๊ณ ํฉ๊ณ๋ฅผ ๊ตฌํด๋ผ ์ ์์ต๋๋ค
๊ทธ๋ฆฌ๊ณ ์ค๋ณต๋๋ ๋ถ๋ถ์ด ์๊ธฐ๋ฏ๋ก 2๋ก ๋๋ ์ค์ผ ํจ
๋ง์ง๋ง์ ๋ต์ด ๊ณ์ ํ๋ ค์ ํค๋ฉจ๋๋ฐ, rotateํ ๋๋ง๋ค ์ ์ญ๋ณ์ visited ์ด๊ธฐํ๋ฅผ ์์์ผ์ค์ ํ๋ฆฐ๊ฑฐ์์!!
๊ทธ๋์ ๊ฒฐ๊ตญ ๊ทธ๊ฑฐ๊น์ง ๋ฐ๊ฒฌํด์ ๊ณ ์น๊ณ ์ฑ๊ณตํ๋ค์ใ
๋ฌธ์ ํ๋ ๊ณผ์ ๋ง๋ค Map์ ์ถ๋ ฅํด์ ๋ณด๋๊ฒ ํฐ ๋์์ด ๋ฉ๋๋ค!
๋์ ํ์ด
#include <iostream>
#include <queue>
using namespace std;
int n;
int map[30][30];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
int visited[30][30];
queue<pair<int,int>> q;
int groupMap[30][30]; // ๊ทธ๋ฃน๋ฒํธ ๋งต
int groupNumCnt[900]; // ์ธ๋ฑ์ค=๊ทธ๋ฃน๋ฒํธ, ๋ด์ฉ=๊ฐฏ์
int Sum = 0;
int rMap[30][30];
void findGroup(int x, int y, int groupNum){
int tmp = map[x][y];
int cnt=1;
q.push({x,y});
groupMap[x][y] = groupNum;
visited[x][y] = 1;
while(!q.empty()){
pair<int,int> a = q.front();
q.pop();
for(int i=0;i<4;++i){
int nx = a.first + dx[i];
int ny = a.second + dy[i];
if(nx<1 || ny<1 || nx>n || ny>n) continue; // ๋ฒ์ ์ฒดํฌ
if(visited[nx][ny] == 1) continue;
if(map[nx][ny] == tmp){
q.push({nx,ny});
groupMap[nx][ny] = groupNum;
visited[nx][ny] = 1;
cnt++;
}
}
}
groupNumCnt[groupNum] = cnt;
}
void SumCount(){ // ์ด๊ฑฐ ํ์์ผ๋ก ํ๋ฉด ์ฒดํฌ ๋ชปํ๋ ๊ฐ์ด ์๊ฒจ์ ๊ทธ๋ฅ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ๊ธฐ!!
int nearSum = 0;
for (int x = 1; x <= n; x++){
for(int y = 1; y <= n; y++){
for(int i=0;i<4;++i){ // ์์, ์๋ ์ด๋
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<1 || ny<1 || nx>n || ny>n) continue; // ๋ฒ์ ์ฒดํฌ
if (map[x][y] != map[nx][ny]){ // ์ธ์ ํ ๊ฐ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์
int num1 = map[x][y];
int num2 = map[nx][ny];
int cnt1 = groupNumCnt[groupMap[x][y]];
int cnt2 = groupNumCnt[groupMap[nx][ny]];
nearSum += (cnt1 + cnt2) * num1 * num2;
}
}
}
}
// cout << nearSum / 2;
Sum += (nearSum / 2);
}
void makeGroup(){
int group_cnt = 0;
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= n;++j){
if(visited[i][j]==0){
group_cnt++;
findGroup(i, j, group_cnt);
}
}
}
}
void rotateMini(int sx, int sy, int size){
for (int i = sx; i < sx + size; ++i){
for (int j = sy; j < sy + size; ++j){
// ์์์ขํ๋ฅผ 0,0๋ก ๋ฐ๊พธ๊ณ ๊ณ์ฐํ๋ค ๋ค์ ๋ณต๊ตฌ์์ผ์ ์ ์ฅ
int nx = i - sx;
int ny = j - sy;
int rx = ny;
int ry = size - nx - 1;
rMap[rx + sx][ry+sy] = map[i][j];
// cout << i << " " << j << " - " << rx + sx << " " << ry+sy << "\n";
}
}
}
void rotateMap(){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) { // ์๊ฐ๋ฌธ์ ๋ฐ
// ์ธ๋ก์ค์ (i, j) -> (j, i)
if(j == (n+1) / 2)
rMap[j][i] = map[i][j];
// ๊ฐ๋ก์ค์ (i, j) -> (n-j+1, i)?
else if(i == (n+1) / 2)
rMap[n - j + 1][i] = map[i][j];
}
}
int mini = (n-1) / 2;
rotateMini(1, 1, mini); // ์์์ขํx,y, ์ฌ์ด์ฆ
rotateMini(1, mini+2, mini);
rotateMini(mini+2, 1, mini);
rotateMini(mini+2, mini+2, mini);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) {
map[i][j] = rMap[i][j];
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++) {
visited[i][j] = 0;
}
}
}
int main() {
cin >> n;
for(int i=1; i<=n; ++i){
for(int j=1;j<=n;++j) cin >> map[i][j];
}
for (int i = 0; i < 4; ++i){
makeGroup();
SumCount();
if(i<3) rotateMap();
}
cout << Sum;
return 0;
}
์ฝํ ๊ธฐ์ถ๋ฌธ์ ์ฒ์ ๋ดค์๋๋ ๋ด๊ฐ ํ ์ ์๋ ์์ค์ด ์๋ ๊ฒ ๊ฐ์์ ๊ฒ๋ง ์๋ฉ ๋จน์๋๋ฐ,
๊ทธ๋๋ ๋๋ฌด ๋งํ๋๋ ํ์ด ์ฐธ๊ณ ํด๊ฐ๋ฉฐ ๋งค์ผ๋งค์ผ ํ์ด๋ณด๋๊น ์์ ๊ฐ์ด ์ข ๋ถ๋ ๊ฒ ๊ฐ์ต๋๋ค
์ด์ฌํ ํด์ผ๊ฒ ์ต๋๋ค~~
'๐ ์๊ณ ๋ฆฌ์ฆ > Code Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ํธ๋ฆฌ] ์ธ์๋ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
---|---|
[์ฝ๋ํธ๋ฆฌ] ๋๋ฌด๋ฐ๋ฉธ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๊ฐ ์ ์๋ ๊ณณ๋ค (0) | 2023.02.22 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๋ค ๋ฐฉํฅ ํ์ถ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋ณํ๊ธฐ (0) | 2023.02.22 |
[์ฝ๋ํธ๋ฆฌ] ์์ ํ์ / ์๋ฆฌ ์ ๋จ์๋ก ์ํ ์ฐ์ต๋ฌธ์ (0) | 2023.02.22 |