728x90
https://www.acmicpc.net/problem/14503
문제에 나와있는 순서대로 ( 북, 동, 남, 서 )로 dx,dy를 설정해준다.
1. 왼쪽으로 회전한다. ( 왼쪽에 청소공간이 있든 말든 어쨌든 회전하기 때문이다.)
2-1. 청소할 공간이 있다면 청소하고 그곳으로 위치로 간다. [turn 횟수를 초기화]
2-2. 청소할 공간이 없다면 turn의 횟수만 증가 시킨다.
3. 만약 turn 횟수가 4라면 (주변에 모두 청소가 되어있거나 벽일 경우 )
3-1 . 후진한다.
3-2. 후진한곳이 벽이라면 break
3-3. 벽이 아니라면 후진한다.
💻 코드 :
n,m = map(int,input().split())
vis = [[0]*m for i in range(n)]
x,y,direction = map(int,input().split()) # 현재 좌표와 내가 보는 방향
vis[x][y] = 1 # 현재 위치 청소
mp = [list(map(int,input().split())) for i in range(n)]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
# 0 : 북(위) , 1 : 동(오), 2 : 남(아래), 3 : 서(왼)
def turn_left() :
global direction
direction-=1 # 왼쪽을 본다.
if direction < 0 : direction = 3 # 0 보다 작아지면 3으로 초기화
count = 1 # 청소한 영역의 갯수 # 처음 주어진 영역을 청소했다고 생각하므로 1로 초기화
turn_time = 0
while True :
turn_left()
nx = x + dx[direction]
ny = y + dy[direction]
if 0<=nx<n and 0<=ny<m and vis[nx][ny] == 0 and mp[nx][ny] == 0 : # 가본적 없고 벽이 아니여야함
vis[nx][ny] = 1
x = nx
y = ny
count+=1 # 하나 청소
turn_time =0
continue # 다시 While 문 처음으로
else :
turn_time+=1
if turn_time == 4 : # 4번 돌았다면 뒤를 확인
nx = x - dx[direction]
ny = y - dy[direction]
if mp[nx][ny] == 0 : # 벽이 아니라면
x,y = nx,ny
turn_time = 0
else :
break # while문 종료
print(count)
vis 배열을 사용하지 않은 코드
< 네 방향 모두 청소가 되어있을 때 뒤에 벽이 있는지 확인해야하므로 if 문에 조건을 하나 더 추가해주면 된다. >
# 북 동 남 서
dx = [-1,0,1,0]
dy = [0,1,0,-1]
def turn_left() :
global d
d -=1
if d <0 : d = 3
if __name__=="__main__" :
n,m = map(int,input().split())
x,y,d = map(int,input().split())
mp = [list(map(int,input().split())) for _ in range(n)]
mp[x][y] = 2
ans = 1
turn_time = 0
while True :
turn_left()
nx,ny = dx[d] + x, dy[d] + y
if 0 <=nx< n and 0<=ny<m and mp[nx][ny] ==0 :
mp[nx][ny] = 2
x,y = nx,ny
ans +=1
turn_time = 0
continue
else :
turn_time +=1
if turn_time == 4 :
nx,ny = x - dx[d] , y - dy[d]
if mp[nx][ny] == 0 or mp[nx][ny] == 2 :
x,y = nx,ny
else : break
turn_time = 0
print(ans)
참고 블로그 :
https://wewinserv.tistory.com/173
복습 :
✅ 20220701
✅ 20220914
반응형
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[삼성SW역량][Python/BOJ] 백준 14889 스타트와 링크(DFS, 백트레킹) (0) | 2022.06.30 |
---|---|
[삼성SW역량][Python/BOJ] 백준 14888 연산자 끼워넣기(DFS) (0) | 2022.06.30 |
[삼성SW역량][Python/BOJ] 백준 14502 연구소(DFS+BFS) (0) | 2022.06.30 |
[삼성SW역량][Python/BOJ] 백준 14501 퇴사(DFS) (0) | 2022.06.29 |
[삼성SW역량][Python/BOJ] 백준 14500 테트로미노(DFS) (0) | 2022.06.29 |