https://www.acmicpc.net/problem/14503
<문제 해설>
구현 시뮬레이션 문제이다. 시키는 데로 코드를 작성하기만 하면 되서 편했다.
2차원 room배열을 만들어서 벽, 청소하지 않은 공간을 표시해 둔다.
문제어서 신경써야하는 부분은 일단 90도록 방향을 틀고 0을 찾는 다는 점과 후진을 하기 때문에 로봇이 바라보고있는 방향을 기록해야한다.
나는 배열로 관리했다. 북을 기준으로 90도씩 시계 반대로 회전함으로 다음과 같은 방향을 가진다.
move = [[-1,0],[0,-1],[1,0],[0,1]]
북 서 남 동
이런방식으로 설정했기에 처음 d값을 받을 때 d가 1일 경우 동으로설정되도록 d가 3일경우 서로 설정되도록 했다.
작동방식은 다음을 따른다.
- 현재 로봇이 위치한 배열의 칸이 0일경우 2로 표시해서 벽은 아니지만 청소가 완료됐다는 것을 알린다.
또한 청소했다는 것을 count변수에 기록한다. - 우선 주변에 빈칸이 있는지 알아보기 위해서 90도로 4번 회전시킨다. 회전시키는 동안 바라본 방향에 0 이있다면 바라본 뱡향과 현제 좌표를 더해서 기록하고 빈칸이 있다는걸 기록한다. 회전또한 중지시킨다.
- 만약 주변에 없다면 지금좌표에서 방향을 빼준다. 만약 후진한 좌표가 1 즉 벽이라면 중지한다.
- 중지되지 않았다면 다음좌표를 가지고 1번부터 다시 진행한다.
<예시>
예제 입력 2에서의 room배열은 다음과 같은 모습이 된다.
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 2, 2, 2, 2, 2, 2, 2, 2, 1]
[1, 2, 2, 2, 1, 1, 1, 1, 2, 1]
[1, 2, 2, 1, 1, 2, 2, 2, 2, 1]
[1, 2, 1, 1, 2, 2, 2, 2, 0, 1]
[1, 2, 2, 2, 2, 2, 2, 2, 2, 1]
[1, 2, 2, 2, 2, 2, 0, 1, 2, 1]
[1, 2, 2, 2, 2, 2, 1, 1, 2, 1]
[1, 2, 2, 2, 2, 2, 1, 1, 2, 1]
[1, 2, 2, 2, 2, 2, 2, 2, 2, 1]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
<코드>
def search(y,x):
global d,count
if room[y][x] == 0:
room[y][x] = 2
count += 1
check = 0
for i in range(1,5):
d = (d + 1)%4
my = move[d][0] + y
mx = move[d][1] + x
if room[my][mx] == 0:
check = 1
break
if check == 0:
my = y - move[d][0]
mx = x - move[d][1]
if room[my][mx] == 1:
return
search(my,mx)
import sys
sys.setrecursionlimit(10**7)
move = [[-1,0],[0,-1],[1,0],[0,1]]
N, M = map(int,sys.stdin.readline().split())
r,c,d = map(int,sys.stdin.readline().split())
if d == 1 or d == 3:
d = (d+2)%4
room = []
for n in range(N):
room.append(list(map(int,sys.stdin.readline().split())))
count = 0
search(r,c)
print(count)
<코드 설명>
global d,count //d는 방향 count는 2의 개수이다.
if room[y][x] == 0: //현제 위치한 곳이 청소가 안된 0 일 경우
room[y][x] = 2 //청소했다는 표시인 2로 기록
count += 1 //청소했으니 count 증가
check = 0 //빈곳을 찾았는지 기록할 변수
for i in range(1,5): //현제 보고있는 방향에서 90도로 4번 돌리면서 0이있는지 확인
d = (d + 1)%4 //d가 0에서 시작할 경우 1,2,3,0이 된다.
my = move[d][0] + y //0이있는지 확인할 좌표
mx = move[d][1] + x
if room[my][mx] == 0: //빈칸이면 중지시켜서 mx, my좌표를 남기고
check = 1 //빈칸을 찾았다는걸 기록한다.
break
if check == 0: //만약 빈칸이 주변에 없으면
my = y - move[d][0] //바라보고있는 방향에서 뒤로 후진하고
mx = x - move[d][1]
if room[my][mx] == 1: //후진한곳이 1이라면 함수 반복 종료
return
search(my,mx) //아닌경우 함수 기록된 곳으로 반복
import sys
sys.setrecursionlimit(10**7)
move = [[-1,0],[0,-1],[1,0],[0,1]] //방향 저장
N, M = map(int,sys.stdin.readline().split()) //값 받아오기
r,c,d = map(int,sys.stdin.readline().split())
if d == 1 or d == 3: //1은 서 3은 동으로 배열을 만들었음으로 바꿔주기
d = (d+2)%4
room = [] //방위 정보를 저장할 배열
for n in range(N): //N만큼 반복하면서
room.append(list(map(int,sys.stdin.readline().split())))
count = 0
search(r,c)
print(count) //2의 개수 출력
'Coding Test > Python' 카테고리의 다른 글
[Python/백준] 14891_톱니바퀴 (0) | 2023.12.05 |
---|---|
[Python/백준] 3190_뱀 (1) | 2023.12.03 |
[Python/백준] 20055 컨베이어 벨트 위의 로봇 (0) | 2023.11.27 |
[Python/백준] 10026 적록색약 (0) | 2023.03.19 |
[Python/백준] 7576 토마토 (0) | 2023.03.08 |
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간