문제: 로봇 청소기가 청소하는 칸의 개수를 출력하라.
문제 이해하기!!
전형적인 구현 문제입니다.
문제에 주어진대로 따라하면 코드를 작성하면 풀 수 있는데,
다만 얼마나 효율적으로 짜냐, 어떤 방식으로 짜냐가 중요하죠!!
저는 밑의 방식으로 풀게 되었습니다.
그 방식을 설명하자면!!
1. 각 방향으로 한 칸 전진하는 것을 함수로 만들어 줍니다.
2. 주어진 행동을 계속 반복하기 위해 while True로 반복문을 돌려줍니다.
3. 방향을 정할 때, 계속 왼쪽으로 돌기 때문에 (d-1)%4를 해주면 딱 왼쪽방향이 된다. (중요!!)
4. 4번돌아도 청소할 곳이 없다면 2-3, 2-4번으로 넘어가게 한다.
5. 청소하면서 res 값을 +1 해주고 출력하면 끝!
끝~~!!
코드:
from sys import stdin
input = stdin.readline
# 입력
n, m = map(int, input().split())
r, c, d = map(int, input().split())
board = [list(map(int, input().split())) for i in range(n)]
visit = [[False] * m for i in range(n)]
# 방향 한칸 전진
def direction(x, y, d):
# 북쪽
if d == 0:
return (x - 1, y)
# 동쪽
elif d == 1:
return (x, y + 1)
# 남쪽
elif d == 2:
return (x + 1, y)
# 서쪽
return (x, y - 1)
# 탐색
res = 1
visit[r][c] = True
while True:
for i in range(4):
d = (d - 1) % 4
rr, rc = direction(r, c, d)
if board[rr][rc] == 1 or visit[rr][rc]:
continue
r, c = rr, rc
visit[rr][rc] = True
res += 1
break
else:
r, c = direction(r, c, (d - 2) % 4)
if board[r][c] == 1:
break
print(res)
반응형
'Study > BOJ' 카테고리의 다른 글
[BOJ] 9694. 무엇을 아느냐가 아니라 누구를 아느냐가 문제다 (0) | 2021.06.19 |
---|---|
[BOJ] 1238. 파티 (0) | 2021.06.07 |
[BOJ] 9251, 15482. LCS, 한글 LCS (0) | 2021.04.25 |
[BOJ] 12015, 12738. 가장 긴 증가하는 부분 수열 2, 3 (0) | 2021.04.23 |
[BOJ] 20040. 사이클 게임 (0) | 2021.04.18 |