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

2022. 8. 17. 01:21·Algorithm/Solution
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
저작자표시 비영리 (새창열림)

'Algorithm > Solution' 카테고리의 다른 글

[백준] 1406 에디터(C++)  (0) 2022.09.20
[백준] 2792 보석 상자(C++)  (0) 2022.08.22
[백준] 15686 치킨 배달(C++)  (0) 2022.07.28
[백준] 2623 음악 프로그램(C++)  (0) 2022.07.15
[백준] 14502 연구소(C++)  (0) 2022.06.25
'Algorithm/Solution' 카테고리의 다른 글
  • [백준] 1406 에디터(C++)
  • [백준] 2792 보석 상자(C++)
  • [백준] 15686 치킨 배달(C++)
  • [백준] 2623 음악 프로그램(C++)
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    lisp
    프로그래머스
    react
    C++
    Algorithm
    데브코스
    파일처리
    백준
    리팩토링
    자료구조
  • hELLO· Designed By정상우.v4.10.2
BeNI
[백준] 14503 로봇 청소기 (C++)
상단으로

티스토리툴바