algorithm

BOJ 21610

rkawk 2022. 10. 4. 14:24
๋”๋ณด๊ธฐ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ๋น„๋ฐ”๋ผ๊ธฐ ์„ฑ๊ณต

 
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๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ←, โ†–, ↑, โ†—, →, โ†˜, ↓, โ†™ ์ด๋‹ค. ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋œ๋‹ค.

  1. ๋ชจ๋“  ๊ตฌ๋ฆ„์ด di ๋ฐฉํ–ฅ์œผ๋กœ si์นธ ์ด๋™ํ•œ๋‹ค.
  2. ๊ฐ ๊ตฌ๋ฆ„์—์„œ ๋น„๊ฐ€ ๋‚ด๋ ค ๊ตฌ๋ฆ„์ด ์žˆ๋Š” ์นธ์˜ ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 1 ์ฆ๊ฐ€ํ•œ๋‹ค.
  3. ๊ตฌ๋ฆ„์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง„๋‹ค.
  4. 2์—์„œ ๋ฌผ์ด ์ฆ๊ฐ€ํ•œ ์นธ (r, c)์— ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‹œ์ „ํ•œ๋‹ค. ๋ฌผ๋ณต์‚ฌ๋ฒ„๊ทธ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์— ๋ฌผ์ด ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ˆ˜๋งŒํผ (r, c)์— ์žˆ๋Š” ๋ฐ”๊ตฌ๋‹ˆ์˜ ๋ฌผ์ด ์–‘์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
    • ์ด๋•Œ๋Š” ์ด๋™๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด๊ฐ€๋Š” ์นธ์€ ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์œผ๋กœ ๊ฑฐ๋ฆฌ๊ฐ€ 1์ธ ์นธ์ด ์•„๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, (N, 2)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์—์„œ ์ธ์ ‘ํ•œ ๋Œ€๊ฐ์„  ์นธ์€ (N-1, N-1)๋ฟ์ด๋‹ค.
  5. ๋ฐ”๊ตฌ๋‹ˆ์— ์ €์žฅ๋œ ๋ฌผ์˜ ์–‘์ด 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;
}