๐Ÿ’  BOJ

[BOJ][C++] ๋ฐฑ์ค€ 14503๋ฒˆ: ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

์„ ๋‹ฌ 2023. 11. 23. 22:45
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/14503

 

14503๋ฒˆ: ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

์ฒซ์งธ ์ค„์— ๋ฐฉ์˜ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ž…๋ ฅ๋œ๋‹ค. $(3 \le N, M \le 50)$โ€Š ๋‘˜์งธ ์ค„์— ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ $(r, c)$์™€ ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ $d$๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. $d$๊ฐ€ $0$์ธ ๊ฒฝ์šฐ ๋ถ์ชฝ

www.acmicpc.net

 

๋ฌธ์ œ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ์™€ ๋ฐฉ์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

(์ค‘๋žต)

  1. ํ˜„์žฌ ์นธ์ด ์•„์ง ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ˜„์žฌ ์นธ์„ ์ฒญ์†Œํ•œ๋‹ค.
  2. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์—†๋Š” ๊ฒฝ์šฐ,
    1. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•œ ์นธ ํ›„์ง„ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ๋’ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.
  3. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ,
    1. ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•œ๋‹ค.
    2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ ์นธ์ด ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ธ ๊ฒฝ์šฐ ํ•œ ์นธ ์ „์ง„ํ•œ๋‹ค.
    3. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
 

์ถœ๋ ฅ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ž‘๋™์„ ์‹œ์ž‘ํ•œ ํ›„ ์ž‘๋™์„ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋Š”๋Œ€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„ ๋ฌธ์ œ๋‹ค.

 

์šฐ์„  ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์„œ ๋ฒกํ„ฐ์— ์ €์žฅํ•ด์ค€ ๋’ค, ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ์˜ ๊ฒฝ๋กœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•˜์ž

1: ๋ฒฝ

0: ๋นˆ๊ณต๊ฐ„(์ฒญ์†Œ์•ˆํ•จ)

2: ๋นˆ๊ณต๊ฐ„(์ฒญ์†Œํ•จ)

 

 

1๋ฒˆ ์กฐ๊ฑด > ํ˜„์žฌ ์นธ์ด ์•„์ง ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ˜„์žฌ ์นธ์„ ์ฒญ์†Œํ•œ๋‹ค.

ํ˜„์žฌ ์œ„์น˜ v[r][c]์— ์ฒญ์†Œํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋กœ 2๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

1(๋ฒฝ์œผ)๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•˜์ž. ์ฒญ์†Œํ•œ ๊ณต๊ฐ„์€ ๋ฒฝ๊ณผ ๋‹ฌ๋ฆฌ ํ›„์ง„(3๋ฒˆ ์กฐ๊ฑด)ํ•  ๋•Œ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค

        if(v[r][c]==0) {
            ans++;
            v[r][c] = 2;
        }

 

 

3๋ฒˆ ์กฐ๊ฑด > ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ,

for๋ฌธ์„ ๋Œ๋ ค์„œ ๋„ค ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•œ๋‹ค.

"๋ฐ˜์‹œ๊ณ„" ๋ฐฉํ–ฅ์— ์œ ์˜ํ•˜์ž. ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ d๋Š” ๋ถ ์„œ ๋‚จ ๋™  ์ด์ง€๋งŒ

๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์€ ๋ถ ๋™ ์„œ ๋‚จ ์ด๋‹ค. ์ฆ‰ d๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์•ผํ•œ๋‹ค

 

๊ทธ๋ ‡๊ฒŒ ๋Œ๋ฆฐ ๋ฐฉํ–ฅ์˜ ์ขŒํ‘œ v[nx][ny] ๊ฐ€ ์ฒญ์†Œ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค

์ฒญ์†Œ๊ฐ€ ๋˜์–ด์žˆ๋‹ค๋ฉด(๊ฐ’์ด 0) ์ด๋™์‹œํ‚จ๋‹ค. r=nx, c=ny, d=nd

๊ทธ๋ฆฌ๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. -> ๋ฐฉํ–ฅ ํƒ์ƒ‰์šฉ for๋ฌธ break

        bool isMoved = false;
        for(int i=0; i<4; i++) {
            // 3-1. ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „
            int nd = (d-i+3)%4; 
            int nx = r+dx[nd];
            int ny = c+dy[nd];
            
            // 3-2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ ์นธ์ด ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ธ ๊ฒฝ์šฐ ํ•œ ์นธ ์ „์ง„ํ•œ๋‹ค.
            if(v[nx][ny] == 0) { 
                r = nx;
                c = ny;
                d = nd;
                isMoved = true;
                break; // 3-3. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
            }

 

 

3๋ฒˆ ์กฐ๊ฑด > ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ,

์•„๋ž˜ ์ฝ”๋“œ์— ์ง„์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋‘๊ฐ€์ง€๋‹ค

1) ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ์นธ์„ ๋ฐœ๊ฒฌํ•ด์„œ ํ•œ ์นธ ์ „์ง„ํ•˜๊ณ  break๋กœ ๋„๋‹ฌ. isMoved = true;

2) ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ์นธ์ด ์ฃผ๋ณ€์— ์—†์–ด์„œ for๋ฌธ์„ ๋‹ค ๋Œ๊ณ  ๋„๋‹ฌ. isMoved = false;

๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด 2๋ฒˆ ๊ฒฝ์šฐ์—๋งŒ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค (1๋ฒˆ ๊ฒฝ์šฐ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ 1๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ„๋‹ค #while)

 

ํ˜„์žฌ ๋ฐฉํ–ฅ d๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋’ค๋กœ ๊ฐ€๋Š” ๋ฐฉํ–ฅ(back = (d+2)%4;)์œผ๋กœ ์ด๋™ํ•œ๋‹ค(r += dx[back]; c += dy[back];) 

ํ›„์ง„ํ•œ ์œ„์น˜๊ฐ€ ๋ฒฝ์ด๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค. -> while๋ฌธ break

๋ฒฝ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ž˜ ํ›„์ง„ํ•œ๊ฑฐ๋‹ˆ ์Šค๋ฌด์Šคํ•˜๊ฒŒ while ๋”ฐ๋ผ 1๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ„๋‹ค

 

        if(!isMoved) {
            // 3-1. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•œ ์นธ ํ›„์ง„ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
            int back = (d+2)%4;
            r += dx[back];
            c += dy[back];
            
            // 3-2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ๋’ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.
            if(v[r][c] == 1) break;
        }

 

์ฝ”๋“œ

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

// ๋ถ, ์„œ, ๋‚จ, ๋™
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};

int main() {
    // ์ž…๋ ฅ
    int n,m, r,c,d;
    cin >> n >> m >> r >> c >> d;
    vector<vector<int>> v(n, vector<int>(m));
    for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
            cin >> v[i][j];
        }
    }
    
    int ans=0; // ์ฒญ์†Œ ์นด์šดํŠธ
    while(true) {
        // 1. ํ˜„์žฌ ์นธ์ด ์•„์ง ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ํ˜„์žฌ ์นธ์„ ์ฒญ์†Œํ•œ๋‹ค.
        if(v[r][c]==0) {
            ans++;
            v[r][c] = 2;
        }
        
        // 3. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
        bool isMoved = false;
        for(int i=0; i<4; i++) {
            // 3-1. ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „
            int nd = (d-i+3)%4; 
            int nx = r+dx[nd];
            int ny = c+dy[nd];
            
            // 3-2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž์ชฝ ์นธ์ด ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ธ ๊ฒฝ์šฐ ํ•œ ์นธ ์ „์ง„ํ•œ๋‹ค.
            if(v[nx][ny] == 0) { 
                r = nx;
                c = ny;
                d = nd;
                isMoved = true;
                break; // 3-3. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
            }
        }
        
        // 2. ํ˜„์žฌ ์นธ์˜ ์ฃผ๋ณ€ 4์นธ ์ค‘ ์ฒญ์†Œ๋˜์ง€ ์•Š์€ ๋นˆ ์นธ์ด ์—†๋Š” ๊ฒฝ์šฐ
        if(!isMoved) {
            // 3-1. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ•œ ์นธ ํ›„์ง„ํ•˜๊ณ  1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
            int back = (d+2)%4;
            r += dx[back];
            c += dy[back];
            
            // 3-2. ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์˜ ๋’ค์ชฝ ์นธ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.
            if(v[r][c] == 1) break;
        }
    }
    
    cout << ans;
}

 

์˜ˆ์ œ๊ฐ€ ํ‹€๋ ธ๋‚˜์š”?

์˜ˆ์ œ2์˜ ๋‹ต์ด 57์ด ์•„๋‹Œ 52๋กœ ๋‚˜์™”๋‹ค๋ฉด

๋กœ๋ด‡์˜ 4๋ฐฉํ–ฅ ์ค‘ ํ•œ ๊ณณ์ด๋ผ๋„ ์ฒญ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌด.์กฐ.๊ฑด ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „์ด ๋จผ์ € ์ด๋ฃจ์–ด์ ธ์•ผ ํ•จ.

์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์ž.

์ง์ง„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ง์ง„ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค !!!

 

์˜ˆ๋ฅผ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ฐ„๋‹ค๋ฉด (์•ŒํŒŒ๋ฒณ ์ˆœ์„œ๋Œ€๋กœ ์ฒญ์†Œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ)

๋กœ๋ด‡์ด ์ง์ง„์ด ๊ฐ€๋Šฅํ•˜๋ฉด ์ง์ง„ ๋จผ์ € ๋˜๋Š” ๊ฒฝ์šฐ๋กœ ์ž˜๋ชป ๋œ ๊ฒฝ์šฐ๋‹ค

1 1 1 1 1 1 1 1 1 1 
1 r q p o n m l k 1 
1 s 0 0 1 1 1 1 j 1 
1 t 0 1 1 0 0 0 i 1 
1 u 1 1 d e f g h 1 
1 v ๏ฟฝ ๏ฟฝ c ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ 1 
1 w ๏ฟฝ ๏ฟฝ b ๏ฟฝ 0 1 ๏ฟฝ 1 
1 x ๏ฟฝ ๏ฟฝ a ๏ฟฝ 1 1 ๏ฟฝ 1 
1 y ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ 1 1 ๏ฟฝ 1 
1 z a b c d e ๏ฟฝ ๏ฟฝ 1 
1 1 1 1 1 1 1 1 1 1

 

์ œ๋Œ€๋กœ ๋œ ๊ฒฝ์šฐ๋Š” ์•„๋ž˜ ์ˆœ์„œ๋กœ ๊ฐ€์•ผํ•œ๋‹ค

1 1 1 1 1 1 1 1 1 1 
1 ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ 1 
1 ๏ฟฝ ๏ฟฝ ๏ฟฝ 1 1 1 1 ๏ฟฝ 1 
1 ๏ฟฝ ๏ฟฝ 1 1 ๏ฟฝ ๏ฟฝ ๏ฟฝ ๏ฟฝ 1 
1 ๏ฟฝ 1 1 ๏ฟฝ ๏ฟฝ f e 0 1 
1 ๏ฟฝ ๏ฟฝ l k ๏ฟฝ ๏ฟฝ d c 1 
1 ๏ฟฝ n m j i 0 1 b 1 
1 p o b a h 1 1 z 1 
1 q r c d g 1 1 y 1 
1 u s t e f v w x 1 
1 1 1 1 1 1 1 1 1 1
๋ฐ˜์‘ํ˜•