Algorithm/Solution

[백준] 14503 로봇 청소기 (C++)

BeNI 2022. 8. 17. 01:21
728x90

14503번: 로봇 청소기 (acmicpc.net)

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net


난이도 : 골드 5

 

풀이 과정 :

와.. 그냥 빡구현으로 풀었슴... ㅋ ㅋ ㅋ 

푼다음에 다른 사람꺼 풀이 보니까 dy dx 배열 선언해서 4방향으로 돌수 있게 반복문으로 처리한거같았는데

나는 그 방향 바뀔 때 dy dx가 규칙성 있게 바뀔 거라는 건 예상이 가지만 수식이 도저히 생각이 안나서....

그냥 동서남북 조건 나눠서 일일히 x랑 y값 선언해주면서 했음.. 

위에 chk함수는 청소하고자 하는 (r,c)가 배열의 범위를 벗어났을때를 판별하기위해 선언해줬습니다..

1을 리턴할때는 청소가능한거, 2를 리턴한건 청소했던 구역을 의미

하 , , ,  지금까지 푼 것중에 코드길이 제일 김.. 리팩토링 오지게 마려운 코드다

 

#include <iostream>

using namespace std;

int n, m, r, c, d, arr[55][55], ans;

int chk(int r, int c) {
    if (r >= 0 && c >= 0 && r < n && c < m && arr[r][c] == 0) return 1;
    else if (r >= 0 && c >= 0 && r < n && c < m && arr[r][c] == 2) return 2;
    else return 0;
}

int main()
{
    cin >> n >> m >> r >> c >> d;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> arr[i][j];
        }
    }

    while (true) {  
         arr[r][c] = 2;
         ans++;
  /*       cout << endl;
             for (int i = 0; i < n; i++) {
                 for (int j = 0; j < m; j++) {
                    cout << arr[i][j] << " ";
                 }
                 cout << endl;
             }
             cout << r << " " << c << " " << d << endl;*/
         
 
        if (d == 0) {          
             if (chk(r, c - 1)==1) { // 서
                 c--;
                 d = 3;
             }
             else {
                 if (chk(r + 1, c) == 1) { // 남
                     r++;
                     d = 2;
                 }
                 else if (chk(r, c + 1) == 1) { // 동
                     c++;
                     d = 1;
                 }
                 else if (chk(r - 1, c) == 1) { //북
                     r--;
                     d = 0;
                 }
                 else {
                     if (chk(r + 1,c) == 2) {
                         r++;
                         ans--;
                     }
                     else break;
                 }
             }
        }
        else if (d == 1) {
            if (chk(r - 1, c) == 1) { //북
                r--;
                d = 0;
            }
            else {
                if (chk(r, c - 1) == 1) { // 서
                    c--;
                    d = 3;
                }         
                else if (chk(r + 1, c) == 1) { // 남
                    r++;
                    d = 2;
                }
                else if (chk(r, c + 1) == 1) { // 동
                    c++;
                    d = 1;
                }
                else {
                    if (chk(r,c - 1) == 2) {
                        c--;
                        ans--;
                    }
                    else break;
                }
            }
        }
        else if (d == 2) {
            if (chk(r, c + 1) == 1) { // 동
                c++;
                d = 1;
            }            
            else {
                if (chk(r - 1, c) == 1) { //북
                    r--;
                    d = 0;
                }
                else if (chk(r, c - 1) == 1) { // 서
                    c--;
                    d = 3;
                }
                else if (chk(r + 1, c) == 1) { // 남
                    r++;
                    d = 2;
                }               
                else {
                    if (chk(r - 1,c) == 2) {
                        r--;
                        ans--;
                    }
                    else break;
                }
            }
        }
        else if (d == 3) {
            if (chk(r + 1, c) == 1) { // 남
                r++;
                d = 2;
            }          
            else {
                if (chk(r, c + 1) == 1) { // 동
                    c++;
                    d = 1;
                }
                else if (chk(r - 1, c) == 1) { //북
                    r--;
                    d = 0;
                }
                else if (chk(r, c - 1) == 1) { // 서
                    c--;
                    d = 3;
                }
                else {
                    if (chk(r,c+1) == 2) {
                        c++;
                        ans--;
                    }
                    else break;
                }
            }
        }

    }

    cout << ans;
}
728x90