본문 바로가기
BaekJoon/C++

5011 : Robots on a grid (C++)

by GrayChoi 2021. 2. 26.
반응형

 

5011번: Robots on a grid

You have recently made a grid traversing robot that can find its way from the top left corner of a grid to the bottom right corner. However, you had forgotten all your AI programming skills, so you only programmed your robot to go rightwards and downwards

www.acmicpc.net


영어 문제라 읽는데 시간을 보내고

대충읽고 문제를 푼 후(사실 못 읽은것)

틀린다음에야 제대로 읽어보고

5번만에야 맞은 문제다.

사실 문제만 제대로 읽고 이해했으면 한번에 맞췄을 것 같다.

이따가 다른방법으로 한번 더 풀어봐야겠다.

여담으로 아직 학생증이 안나와 github educational account를 거절당했다.

빨리 학생증 나왔으면 좋겠다

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

using namespace std;

/* 
    1시도 메모리 초과 발생함 답은 제대로 나오는 것 같음.
    2시도 bool 타입을 제거 했음에도 메모리 초과 발생
    3시도 queue를 쓰지 않고 해야할 것 같음. Dynamic Programming을 해야할 것 같다.
    4시도 영어 문제라 꼼꼼히 읽지 못하였었다. 빠진부분을 추가함.
    5시도 영어 해석이 부족했던 것 같다. modulo : 나머지연산
    영어문제는 두번 세번 꼼꼼히 읽자.
    2번 틀렸을 걸 4번이나 틀렸다.
*/

const int MOD = INT_MAX;
typedef long long ll;

char map[1000][1000];
bool visit[1000][1000];
ll result[1000][1000];

int N;

int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};

queue<pair<int, int>> q;

void bfs(int x, int y) {
    visit[x][y] = true;

    while(!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();

        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx >= 0 && nx < N && ny >= 0 && ny < N) {
                if(map[nx][ny] != '#' && visit[nx][ny] == false) {
                    q.push({nx, ny});
                    visit[nx][ny] = true;
                    map[nx][ny] = 'C';
                    /*
                    .에서 C로 바꾸는 이유는 맨 마지막 칸이 C일때는
                    마지막 칸에 도달할 수 있으므로 결과값 또는 'THE GAME ...'을 출력 할 수 있다.
                    마지막칸이 C가 아닐경우 'INCONCEIVABLE'을 출력하면 된다.
                    */
                
                }
            }
                
            
        }
    }
}

int main() {
    scanf("%d", &N);

    for(int x = 0; x < N; x++) {
        string temp;
        cin >> temp;
        for(int y = 0; y < N; y++) {
            map[x][y] = temp[y];
        }
    }

    q.push({0, 0});
    bfs(0, 0);
    
    /*
    위쪽과 아래쪽 두가지 방법으로만 목적지에 도달해야 한다.
    확인하려는 위치를 몇가지 방법으로 갈 수 있는지 알고 싶은 경우
    바로 위쪽 위치의 갈 수 있는 방법과 왼쪽 위치의 갈 수 있는 방법을 더하면 된다.
    결과값을 2^31 - 1로 나눈 나머지 값을 도출하라 했으므로 나머지 연산을 한다.
    */

    result[0][0] = 1;   // 시작 위치에 갈 수 있는 방법은 한가지 뿐이다.

    //  경우의 수 계산 시작
    for(int x = 0; x < N; x++) {
        for(int y = 0; y < N; y++) {
            if(map[x][y] != '#') {
                // 벽을 통과할 수 없으므로 벽이 아닐때만 실행한다.
                if(x == 0 && y == 0) { continue; };
                // 0, 0의 위치일 경우 바로 다음 탐색으로 넘어감

                if(x == 0) {    
                // x가 0인 경우 시작위치에서 오른쪽으로만 갔으므로 바로 왼쪽의 경우의 수와 동일하다.
                    result[x][y] = result[x][y-1] % MOD;
                } else if(y == 0) {
                // y가 0인 경우 시작위치에서 아래쪽으로만 갔으므로 바로 위쪽의 경우의 수와 동일하다.
                    result[x][y] = result[x-1][y] % MOD;
                } else {
                // x와 y가 둘다 0이 아닌 경우 바로 위쪽의 경우의 수와 왼쪽의 경우의 수를 더해준다.
                    result[x][y] = (result[x][y-1] + result[x-1][y]) % MOD;
                }
            }
        }
    }

    if(result[N-1][N-1] == 0 && map[N-1][N-1] == 'C') {
        /*
        마지막 칸의 값이 0인 경우 와 동시에 map의 마지막 값이 C인 경우
        4방향 탐색으로는 도달할 수 있지만 2방향(오른쪽, 아래)방향으로는 도달할 수 없는 경우이다.
        */
        printf("THE GAME IS A LIE\n");
    } else if(map[N-1][N-1] == 'C') {
        // 2방향으로만 갈 수 있는 경우 경우의 수 결과값 출력
        printf("%lld\n", result[N-1][N-1]);
    } else {
        // 벽으로 막혀있어 4방향으로도 갈 수 없다면
        printf("INCONCEIVABLE\n");
    }

    return 0;
}
반응형

'BaekJoon > C++' 카테고리의 다른 글

6764 : Sounds fishy! (C++)  (0) 2021.02.26
6186 : Best Grass (C++)  (0) 2021.02.26
11286 : 절댓값 힙 (C++)  (0) 2021.02.25
5928 : Contest Timing (C++)  (0) 2021.02.24
2589 : 보물섬 (C++)  (0) 2021.02.24

댓글