백준 - 3987번 : 보이저 1호 (C++)

RoundAbout·2024년 7월 17일
0

BaekJoon

목록 보기
75/90

풀이 방법 : 구현? 시뮬레이션?

좌표 정보들이 주어지면, 시작 위치에서부터 각 방향으로 출발하는 경우 4가지를 다 시뮬레이션을 돌려보면 된다. 문제에서 주어진 대로 방향만 변경해주는 것만 신경쓰면 딱히 어려울게 없는 문제였다.

무한히 전파될 수 있다면 "Voyager"를 출력하라고 했다. 무한히 전파되는 경우는 같은 방향으로 이미 지나간 적이 있는 좌표가 있었는지를 보면 검출해낼 수 있다.

문제에서 URDL 순서로 앞서는 것을 출력하라고 했으므로 해당 순서대로 검사해주면 된다.


#include <iostream>

using namespace std;

//U , R, D,  L
int DirY[4] = { -1,0,1,0 };
int DirX[4] = { 0,1,0,-1 };
char Map[501][501] = {};
int MaxSec = 0;
int MaxDirIdx = -1;

int main()
{
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    int N, M;
    cin >> N >> M;

    for (int i = 1; i <= N; ++i)
    {
        for (int j = 1; j <= M; ++j)
            cin >> Map[i][j];
    }

    int StartY, StartX;
    cin >> StartY >> StartX;

    for (int i = 0; i < 4; ++i)
    {
        bool Check[501][501][4] = {};

        int CurDir = i;
        int CurrentY = StartY;
        int CurrentX = StartX;
        int CurSec = 1;

        while (true)
        {
            ++CurSec;
            CurrentY += DirY[CurDir];
            CurrentX += DirX[CurDir];

            if (CurrentY < 1 || CurrentY > N
                || CurrentX < 1 || CurrentX > M)
                break;

            if (Check[CurrentY][CurrentX][CurDir])
            {
                switch (i)
                {
                case 0:
                    cout << 'U' << '\n';
                    break;
                case 1:
                    cout << 'R' << '\n';
                    break;
                case 2:
                    cout << 'D' << '\n';
                    break;
                case 3:
                    cout << 'L' << '\n';
                    break;
                }

                cout << "Voyager";
                return 0;
            }

            Check[CurrentY][CurrentX][CurDir] = true;

            if(Map[CurrentY][CurrentX] == 'C')
            {
                break;
            }

            else if (Map[CurrentY][CurrentX] == '\\')
            {
                //
                //U , R, D,  L
                switch (CurDir)
                {
                case 0:
                    CurDir = 3;
                    break;
                case 1:
                    CurDir = 2;
                    break;
                case 2:
                    CurDir = 1;
                    break;
                case 3:
                    CurDir = 0;
                    break;
                }


            }

            else if (Map[CurrentY][CurrentX] == '/')
            {
                //URDL
                switch (CurDir)
                {
                case 0:
                    CurDir = 1;
                    break;
                case 1:
                    CurDir = 0;
                    break;
                case 2:
                    CurDir = 3;
                    break;
                case 3:
                    CurDir = 2;
                    break;
                }

            }

            if (CurSec > MaxSec)
            {
                MaxSec = CurSec;
                MaxDirIdx = i;
            }
        }

    }

    switch (MaxDirIdx)
    {
    case 0:
        cout << 'U' << '\n';
        break;
    case 1:
        cout << 'R' << '\n';
        break;
    case 2:
        cout << 'D' << '\n';
        break;
    case 3:
        cout << 'L' << '\n';
        break;
    }

    cout << MaxSec;
}

어우 코드 너무 더럽다.

profile
게임하고 피자 좋아함

0개의 댓글

관련 채용 정보