문제 해석
NxM 크기의 직사각형 안에 있는 로봇청소기가 청소한 칸의 개수를 구하는 문제이다.
청소기는 특정 알고리즘에 따라 움직이므로 해당 알고리즘을 그대로 구현하여 시뮬레이션 해야한다.
코드
문제 풀이
처음 변수 선언 부분부터 설명하자면 arr는 NxM의 직사각형이 들어갈 list이고 0은 빈칸, 1은 벽, 2는 이미 청소한 칸을 나타낸다.
flag는 로봇청소기가 해야할 알고리즘 단계를 나타내며 0은 문제의 1번, 1은 문제의 2번을 나타낸다.
count는 청소한 칸의 개수를 나타낸다.
이제 while문 안을 살펴보면 처음 if문은 1번 단계를 실행하는 코드이며 arr[r][c]를 2로 바꾸고 청소한 칸의 개수(count)에 1 추가, count2를 0으로 초기화해준다. 여기서 count2는 4방향 모두 청소할 공간이 없는 경우를 count해주기 위해서 만든 변수이다. 마지막으로 flag를 1로 바꾸어 2번 단계를 실행하게 한다.
다음 if문인 'if(count2 == 4):'을 설명하기 앞서 그다음 if문인 'if(flag == 1)'를 설명하자면 2번 단계 중 1, 2번을 실행하는 단계로 각 방향마다 따로 구현해주었다. 각 방향의 if문을 설명하면 방향의 왼쪽에 청소할 공간이 있으면 방향을 바꾸고 좌표 (r, c)를 옮겨준다음 flag를 0으로 하여 1번 단계를 다시 실행하게하고 만약 청소할 공간이 없다면 방향을 바꾸고 count2에 1을 더해준다음 flag를 1로 유지하여 다시 2번 단계를 실행한다.
여기서 count2가 4가 된다면 4 방향 모두 청소할 공간이 없다는 말이기 때문에 'if(count2 == 4):'이 실행되는데 이 경우도 각 방향별로 뒤 공간을 확인 후 벽이 있다면 break하여 종료, 없다면 좌표를 뒤로 옮기고 flag를 1로하여 2번 단계를 다시 실행하게 한다. 그리고 count2도 0으로 초기화한다.
'Koala - 7기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 19951번 태상이의 훈련소 생활 (0) | 2022.07.26 |
---|---|
[BOJ / Python] 1644 - 소수의 연속합 (0) | 2022.07.25 |
[백준 / c++ ] 7795 먹을 것인가 먹힐 것인가 (0) | 2022.07.24 |
[백준 / Python] 21608번 상어 초등학교 (0) | 2022.07.24 |
[백준/C++] 14465 소가 길을 건너간 이유 5 (0) | 2022.07.24 |