[c++] BOJ 9019 :: DSLR

๋‚œ์ด๋„ : ๊ณจ๋“œ 5

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 1์‹œ๊ฐ„ 30๋ถ„

 

๋ฌธ์ œ

DSLR ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

ํ’€์ด

  • DSLR์ด๋ผ๋Š” 4๊ฐ€์ง€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  bfs

 

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <string>

using namespace std;

struct point
{
    int prev;
    char state;
    int visited = -1;
};

char dslrArr[4] = { 'D', 'S', 'L', 'R' };

int dslrResult(int type, int num) {
    int tmp;
    switch (type) {
    case 0 :
        return (num* 2) % 10000;
    case 1 :
        if (num == 0)
            return 9999;
        else
            return num - 1;
    case 2 :
        tmp = num / 1000; // pow ์‚ฌ์šฉ x => ์‹œ๊ฐ„์ดˆ๊ณผ
        return (num - tmp * 1000) * 10 + tmp;
    case 3 :
        return (num % 10) * 1000 + num / 10;
    }
}

void getAnswer(vector<char>& ans, point* memo, int a, int b) { // string์„ ๋ถ™์ด๋Š” ์‹์œผ๋กœ => ์‹œ๊ฐ„์ดˆ๊ณผ
    int idx = b;
    while (1){
        if (idx == a) break;
        ans.push_back(memo[idx].state);
        idx = memo[idx].prev;
    }
}

int main() {
    int T; cin >> T;
    while (T--) {
        int A; int B;
        cin >> A >> B;

        int flag = 0;
        vector<char> answer;
        point memo[10001];
        queue<int> que; 

        que.push(A); // ์ดˆ๊ธฐํ™” ์ˆ˜ ๋„ฃ๊ธฐ
        memo[A].visited = 1;
        while (!que.empty()) {
            int tmp = que.front(); que.pop();
            for (int i = 0; i < 4; i++) {
                if (tmp == 0 && i != 1) // 0์— ๊ณฑ์…ˆ ์—ฐ์‚ฐ ์˜๋ฏธ x => ์‹œ๊ฐ„ ๊ฐœ์„ 
                    continue;

                int res = dslrResult(i, tmp);
                if (memo[res].visited != -1) { // ์ด๋ฏธ ๋“ค๋ฅธ ๊ณณ
                    continue;
                }

                memo[res].prev = tmp;
                memo[res].state = dslrArr[i];
                memo[res].visited = 1;

                if (res == B) {
                    // B๊ฐ€ ๋‚˜์˜ด
                    getAnswer(answer, memo, A, B);
                    flag = 1;
                    break;
                } else {
                    que.push(res);
                }
            }
            if (flag)
                break;
        }
        for (int i=answer.size()-1; i >= 0; i--) {
            cout << answer[i];
        }
        cout << '\n';
    }
}

 

์ฃผ์˜ํ•  ์ 

  • pow ์—ฐ์‚ฐ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค => ์ƒ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ƒ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์ž.
  • string ์ด์–ด๋ถ™์ด๊ธฐ ์—ฐ์‚ฐ์€ ์ƒ๊ฐ๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค => vector๋ฅผ ์ด์šฉํ•˜์—ฌ ์ €์žฅํ•˜๊ณ  ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๋‹ค.
    • ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค ๋ณด๋‹ˆ๊นŒ string ์ด์–ด๋ถ™์ด๊ธฐ ์—ฐ์‚ฐ์€ ๊ดœ์ฐฎ์€ ๋“ฏํ•˜๋‹ค.
  • ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์ดˆ๊ธฐํ™”์— ์‹ ๊ฒฝ์“ฐ์ž.

 

๊ฒฐ๊ณผ

์•„์ด๋”” ๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„ ์–ธ์–ด ์ฝ”๋“œ ๊ธธ์ด
gmldms784 2024 1512 C++17 / ์ˆ˜์ • 1843
๋ฐ˜์‘ํ˜•