BOJ 21610
๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ ์ฑ๊ณต
1 ์ด (์ถ๊ฐ ์๊ฐ ์์) 1024 MB 7537 3938 2693 50.783% ๋ฌธ์
๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด๋ณผ, ํ ๋ค์ด๋, ํ์ด์ด์คํฐ, ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ํ ์ ์๋ค. ์ค๋ ์๋ก ๋ฐฐ์ด ๋ง๋ฒ์ ๋น๋ฐ๋ผ๊ธฐ์ด๋ค. ๋น๋ฐ๋ผ๊ธฐ๋ฅผ ์์ ํ๋ฉด ํ๋์ ๋น๊ตฌ๋ฆ์ ๋ง๋ค ์ ์๋ค. ์ค๋์ ๋น๋ฐ๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์ฐ์ตํ๋ ค๊ณ ํ๋ค. ๊ฒฉ์์ ๊ฐ ์นธ์๋ ๋ฐ๊ตฌ๋๊ฐ ํ๋ ์๊ณ , ๋ฐ๊ตฌ๋๋ ์นธ ์ ์ฒด๋ฅผ ์ฐจ์งํ๋ค. ๋ฐ๊ตฌ๋์ ์ ์ฅํ ์ ์๋ ๋ฌผ์ ์์๋ ์ ํ์ด ์๋ค. (r, c)๋ ๊ฒฉ์์ rํ c์ด์ ์๋ ๋ฐ๊ตฌ๋๋ฅผ ์๋ฏธํ๊ณ , A[r][c]๋ (r, c)์ ์๋ ๋ฐ๊ตฌ๋์ ์ ์ฅ๋์ด ์๋ ๋ฌผ์ ์์ ์๋ฏธํ๋ค.
๊ฒฉ์์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์ (1, 1)์ด๊ณ , ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ์นธ์ (N, N)์ด๋ค. ๋ง๋ฒ์ฌ ์์ด๋ ์ฐ์ต์ ์ํด 1๋ฒ ํ๊ณผ N๋ฒ ํ์ ์ฐ๊ฒฐํ๊ณ , 1๋ฒ ์ด๊ณผ N๋ฒ ์ด๋ ์ฐ๊ฒฐํ๋ค. ์ฆ, N๋ฒ ํ์ ์๋์๋ 1๋ฒ ํ์ด, 1๋ฒ ํ์ ์์๋ N๋ฒ ํ์ด ์๊ณ , 1๋ฒ ์ด์ ์ผ์ชฝ์๋ N๋ฒ ์ด์ด, N๋ฒ ์ด์ ์ค๋ฅธ์ชฝ์๋ 1๋ฒ ์ด์ด ์๋ค.
๋น๋ฐ๋ผ๊ธฐ๋ฅผ ์์ ํ๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์ ๋น๊ตฌ๋ฆ์ด ์๊ธด๋ค. ๊ตฌ๋ฆ์ ์นธ ์ ์ฒด๋ฅผ ์ฐจ์งํ๋ค. ์ด์ ๊ตฌ๋ฆ์ ์ด๋์ M๋ฒ ๋ช ๋ นํ๋ ค๊ณ ํ๋ค. i๋ฒ์งธ ์ด๋ ๋ช ๋ น์ ๋ฐฉํฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ฐฉํฅ์ ์ด 8๊ฐ์ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ, 8๊ฐ์ ์ ์๋ก ํํํ๋ค. 1๋ถํฐ ์์๋๋ก ←, โ, ↑, โ, →, โ, ↓, โ ์ด๋ค. ์ด๋์ ๋ช ๋ นํ๋ฉด ๋ค์์ด ์์๋๋ก ์งํ๋๋ค.
- ๋ชจ๋ ๊ตฌ๋ฆ์ด di ๋ฐฉํฅ์ผ๋ก si์นธ ์ด๋ํ๋ค.
- ๊ฐ ๊ตฌ๋ฆ์์ ๋น๊ฐ ๋ด๋ ค ๊ตฌ๋ฆ์ด ์๋ ์นธ์ ๋ฐ๊ตฌ๋์ ์ ์ฅ๋ ๋ฌผ์ ์์ด 1 ์ฆ๊ฐํ๋ค.
- ๊ตฌ๋ฆ์ด ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
- 2์์ ๋ฌผ์ด ์ฆ๊ฐํ ์นธ (r, c)์ ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ์์ ํ๋ค. ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ์ฌ์ฉํ๋ฉด, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ ๋ฌผ์ด ์๋ ๋ฐ๊ตฌ๋์ ์๋งํผ (r, c)์ ์๋ ๋ฐ๊ตฌ๋์ ๋ฌผ์ด ์์ด ์ฆ๊ฐํ๋ค.
- ์ด๋๋ ์ด๋๊ณผ ๋ค๋ฅด๊ฒ ๊ฒฝ๊ณ๋ฅผ ๋์ด๊ฐ๋ ์นธ์ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ด ์๋๋ค.
- ์๋ฅผ ๋ค์ด, (N, 2)์์ ์ธ์ ํ ๋๊ฐ์ ์นธ์ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์์ ์ธ์ ํ ๋๊ฐ์ ์นธ์ (N-1, N-1)๋ฟ์ด๋ค.
- ๋ฐ๊ตฌ๋์ ์ ์ฅ๋ ๋ฌผ์ ์์ด 2 ์ด์์ธ ๋ชจ๋ ์นธ์ ๊ตฌ๋ฆ์ด ์๊ธฐ๊ณ , ๋ฌผ์ ์์ด 2 ์ค์ด๋ ๋ค. ์ด๋ ๊ตฌ๋ฆ์ด ์๊ธฐ๋ ์นธ์ 3์์ ๊ตฌ๋ฆ์ด ์ฌ๋ผ์ง ์นธ์ด ์๋์ด์ผ ํ๋ค.
M๋ฒ์ ์ด๋์ด ๋ชจ๋ ๋๋ ํ ๋ฐ๊ตฌ๋์ ๋ค์ด์๋ ๋ฌผ์ ์์ ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, M์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. r๋ฒ์งธ ํ์ c๋ฒ์งธ ์ ์๋ A[r][c]๋ฅผ ์๋ฏธํ๋ค.
๋ค์ M๊ฐ์ ์ค์๋ ์ด๋์ ์ ๋ณด di, si๊ฐ ์์๋๋ก ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ M๋ฒ์ ์ด๋์ด ๋ชจ๋ ๋๋ ํ ๋ฐ๊ตฌ๋์ ๋ค์ด์๋ ๋ฌผ์ ์์ ํฉ์ ์ถ๋ ฅํ๋ค.
์ ํ
- 2 ≤ N ≤ 50
- 1 ≤ M ≤ 100
- 0 ≤ A[r][c] ≤ 100
- 1 ≤ di ≤ 8
- 1 ≤ si ≤ 50
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 4 0 0 1 0 2 2 3 2 1 0 4 3 2 9 0 1 0 2 9 0 8 8 2 1 0 1 3 3 4 8 1 4 8
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
77
๊ตฌ๋ฆ์ด ์๋ ์นธ์ ๋นจ๊ฐ์์ผ๋ก ํ์ํ๊ณ , ๋ฌผ์ด ์ฆ๊ฐํ ์นธ์ ์ด๋ก์์ผ๋ก ํ์ํ๋ค.
0 0 1 0 2 2 3 2 1 0 4 3 2 9 0 1 0 2 9 0 8 8 2 1 0 ์ฒซ ๋ฒ์งธ ์ด๋์ ๊ตฌ๋ฆ์ด 1๋ฒ ๋ฐฉํฅ(←)์ผ๋ก 3์นธ ์ด๋ํด์ผ ํ๋ค. ๊ตฌ๋ฆ์ด ์ด๋ํ ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
0 0 1 0 2 2 3 2 1 0 4 3 2 9 0 1 0 2 9 0 8 8 2 1 0 ๊ตฌ๋ฆ์ด ์๋ ์นธ์ ๋น๊ฐ 1์ฉ ๋ด๋ฆฌ๊ณ , ๊ตฌ๋ฆ์ ์ฌ๋ผ์ง๋ค.
0 0 1 0 2 2 3 2 1 0 4 3 2 9 0 1 0 3 10 0 8 8 3 2 0 (4, 3)์ ๋๊ฐ์ 4๊ฐ์ ๋ฐฉํฅ ๋ชจ๋์ ๋ฌผ์ด ์๋ค. ๋ฐ๋ผ์, ๋ฌผ์ ์์ด 4 ์ฆ๊ฐํด 7์ด ๋๋ค. (4, 4)๋ ๋๊ฐ์ 2๊ฐ์ ๋ฐฉํฅ(โ, โ)์ ๋ฌผ์ด ์๋ค. ๋ฌผ์ ์์ 2 ์ฆ๊ฐํ๊ณ , 12๊ฐ ๋๋ค. (5, 3)์ ๋๊ฐ์ ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ด 2๊ฐ(โ, โ)์๊ณ , ์ด ์ค์์ 1๊ฐ(โ)๋ง ๋ฌผ์ด ์๋ค. ๋ฐ๋ผ์, ๋ฌผ์ ์์ 3์์ 4๋ก ๋ณํ๋ค. (5, 4)๋ ๋ฐฉํฅ 1๊ฐ(โ)๋ง ๋ฌผ์ด ์๊ธฐ ๋๋ฌธ์, ๋ฌผ์ ์์ด 3์ด ๋๋ค.
0 0 1 0 2 2 3 2 1 0 4 3 2 9 0 1 0 7 12 0 8 8 4 3 0 ์ด์ ๊ตฌ๋ฆ์ด ์์๋ ์นธ์ ์ ์ธํ ๋๋จธ์ง ์นธ ์ค์์ ๋ฌผ์ ์์ด 2 ์ด์์ธ ์นธ์ ๊ตฌ๋ฆ์ด ์๊ธด๋ค. ๊ตฌ๋ฆ์ด ์๊ธฐ๋ฉด ๋ฌผ์ ์์ด 2๋งํผ ์ค์ด๋ ๋ค.
0 0 1 0 0 0 1 0 1 0 2 1 0 7 0 1 0 7 12 0 6 6 4 3 0 ๋ ๋ฒ์งธ ์ด๋์ด ๋๋ ํ์ ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
2 1 1 0 0 0 1 0 1 2 5 4 5 5 0 4 5 12 15 0 4 4 2 1 0 ๋ค์์ ์ธ ๋ฒ์งธ ์ด๋์ด ๋๋ ํ์ ์ํ์ด๋ค.
4 2 4 0 2 0 1 0 1 0 3 2 3 3 0 2 3 17 13 0 2 2 0 1 0 ๋ชจ๋ ์ด๋์ด ๋๋ ์ต์ข ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
2 4 2 2 4 3 1 0 5 3 1 0 1 1 0 0 1 22 11 0 4 5 0 3 2
์ฃผ์ด์ง ์ง๋ฌธ์ ๋ฐ๋ผ ๊ทธ๋๋ก ์ฝ๋ฉํ๋ฉด ๋๋ค.
๋ค๋ง ๋ฐฉํฅ์ด ์ฃผ์ด์ง๊ณ S๋งํผ ์ด๋ํ๊ฒ ๋๋๋ฐ, ์ด ๋ฌธ์ ๋ ํ๋ฉด์ด ๊ณ์ ์ด์ด์ง ํํ์ด๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ ์ํ๋ฉฐ ๊ณ์ฐํด์ฃผ๋ฉด ๋๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int N, M, board[101][101], ans;
int dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1};
vector<pair<int,int>>clouds;
int main(){
cin>>N>>M;
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++)
cin>>board[i][j];
//initial cloud vector//
clouds.push_back({N,1});
clouds.push_back({N,2});
clouds.push_back({N-1,1});
clouds.push_back({N-1,2});
//////////////////////////
for(int i=0; i<M; i++){
int d,s,vis[101][101]={0};
cin>>d>>s;
for(int cloud = 0; cloud<clouds.size(); cloud++){
int nx = clouds[cloud].first + dx[d-1] * s;
int ny = clouds[cloud].second + dy[d-1] * s;
if(nx > N){
while(nx > N)
nx -= N;
}else if(nx < 1){
while(nx < 1)
nx += N;
}
if(ny > N){
while(ny >N)
ny -= N;
}else if(ny < 1){
while(ny < 1)
ny += N;
}
clouds[cloud] = {nx,ny};
board[nx][ny] += 1;
vis[nx][ny] = 1;
}
for(auto cloud : clouds){
int count = 0;
for(int dir=1; dir<=4; dir++){
int nx = cloud.first+dx[dir*2-1];
int ny = cloud.second + dy[dir*2-1];
if(nx < 1 || nx > N || ny < 1 || ny >N) continue;
if(board[nx][ny]) count += 1;
}
board[cloud.first][cloud.second] += count;
}
clouds.clear();
for(int row = 1; row<=N; row++)
for(int col = 1; col<=N; col++){
if(vis[row][col]) continue;
if(board[row][col] > 1){
clouds.push_back({row,col});
board[row][col] -= 2;
}
}
}
for(int i=1; i<=N; i++)
for(int j=1; j<=N; j++){
ans += board[i][j];
}
cout<<ans;
}