algorithm

๋ฐฑ์ค€ 14499

rkawk 2025. 4. 3. 22:47

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

Intuition

๋ฌธ์ œ ์ž์ฒด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง„ ์•Š์•„์„œ ์ฃผ์‚ฌ์œ„๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋งŒ ์ž˜ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Approach

์–ด๋А๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๋”๋ผ๋„ ํŠน์ • ๋ฉด์ด ์•„๋ž˜์— ์žˆ์„๋•Œ ๋™์„œ๋‚จ๋ถ์— ์˜ค๋Š” ๋ฉด์ด ๊ณ ์ •๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์•„๋‹ˆ์—ˆ๋‹ค. ์ด๊ฑธ๋กœ 30๋ถ„ ๋‚ ๋ ธ๋‹ค

top_n์ด ํ•˜๋Š˜์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฉด, ns ๊ฐ€ top_n ๊ธฐ์ค€์œผ๋กœ ๋ถ์ชฝ์— ์žˆ๋Š” ๋ฉด์œผ๋กœ ํ•œ๋‹ค.

ํŠน์ • ๋ฉด์„ ๊ธฐ์ค€์œผ๋กœ ๋ถ์ชฝ์— ์–ด๋–ค ๋ฉด์— ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋™ ์„œ์— ์˜ค๋Š” ๋ฉด์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ด๋ฅผ ๋„ฃ์—ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด top_n = 1, ns = 2๋ผ๋ฉด ๋™์ชฝ์œผ๋กœ ์›€์ง์ผ๋•Œ top_n์ด 4, 6, 3, 1 ~~ ์›ํ˜•์œผ๋กœ ๋ณ€ํ•œ๋‹ค.

 

// 1 -> 5 4 2 3
// 2 -> 1 4 6 3
// 3 -> 5 1 2 6
// 4 -> 6 2 1 5
// 5 -> 3 6 4 1
// 6 -> 3 2 4 5

์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์„œ ์ด์ฐจ์› ๋ฐฐ์—ด์— ๋„ฃ์—ˆ๋‹ค. (ns -> ๋™์ชฝ์œผ๋กœ ๊ฐˆ๋•Œ ๋‚˜์˜ค๋Š” ๋ฉด)

 

๋ถ์ชฝ์œผ๋กœ ์›€์ง์ด๋ฉด top_n = ์ฃผ์‚ฌ์œ„ ๊ธฐ์ค€ ns์˜ ๋ฐ˜๋Œ€์ชฝ ๋ฉด, ns = top_n

๋‚จ์ชฝ์œผ๋กœ ์›€์ง์ด๋ฉด top_n = ns, ns = top_n์˜ ๋ฐ˜๋Œ€์ชฝ ๋ฉด

๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐํ•ด์„œ ๋„ฃ์–ด์คฌ๋‹ค.

Complexity

- Time complexity : O(K)

- Space complexity : O(NM + a)

Code

#include <iostream>

using namespace std;
int N,M, x, y, K, board[21][21], dice[7], dice_r[7]={0,6,5,4,3,2,1}, dx[5]={0,0,0,-1,1}, dy[5]={0,1,-1,0,0};
int d[7][4] = {
{0,0,0,0},{5,4,2,3}, {1,4,6,3},{5,1,2,6},{6,2,1,5},{3,6,4,1},{3,2,4,5}};
// 1 -> 5 4 2 3
// 2 -> 1 4 6 3
// 3 -> 5 1 2 6
// 4 -> 6 2 1 5
// 5 -> 3 6 4 1
// 6 -> 3 2 4 5


int main(){
    //initiate
     cin>>N>>M>>x>>y>>K;
     for (int i=0; i<N; i++)
         for (int j=0; j<M; j++)
             cin>>board[i][j];


    int top_n = 1, ns = 2;
    // ๋™์„œ๋กœ ์›€์ง์ด๋ฉด ns ๊ทธ๋Œ€๋กœ
    // ๋ถ์œผ๋กœ ์›€์ง์ด๋ฉด top_n = dice_r[ns], ns = top_n
    // ๋‚จ์œผ๋กœ ์›€์ง์ด๋ฉด top_n = ns, ns = dice_r[top_n]
    for (int i=0; i<K; i++) {
        int dir; cin>>dir;
        int nx = x + dx[dir], ny = y + dy[dir];
        if (nx >= N || nx < 0 || ny >= M || ny < 0) continue;
        x = nx; y = ny;
        if (dir == 3) {
            int top_n_tmp = top_n;
            top_n = dice_r[ns];
            ns = top_n_tmp;
        }else if (dir == 4) {
            int ns_tmp = ns;
            ns = dice_r[top_n];
            top_n = ns_tmp;
        }else {
            for (int i=0; i<4; i++) {
                if (top_n == d[ns][i]) {
                    if (dir == 1) {
                        i += 1;
                        i %= 4;
                        top_n = d[ns][i];
                    }
                    if (dir == 2) {
                        i -= 1;
                        if (i == -1) i += 4;
                        top_n = d[ns][i];
                    }
                    break;
                }
            }
        }
        cout<<dice[top_n]<<endl;
        if (board[x][y]) {
            dice[dice_r[top_n]] = board[x][y];
            board[x][y] = 0;
        }else {
            board[x][y] = dice[dice_r[top_n]];
        }
    }

}