링크
https://www.acmicpc.net/problem/14503
문제
풀이
그냥 쓰여있는 문제를 구현하면 되는 문제.
조건에 따라 수행하는 액션에 대해 집중하고 구현하면 된다.
코드
import sys
N, M = map(int, input().split())
r, c, d = map(int, input().split())
arr = []
visit = [[0] * M for _ in range(N)]
for _ in range(N):
arr.append(list(map(int, sys.stdin.readline().strip().split())))
#북, 동, 남, 서
moves = [[-1, 0], [0, 1], [1, 0], [0, -1]]
turn_count = 0
ans = 1
visit[r][c] = 1
while True:
d = (d + 3) % 4
nr = r + moves[d][0]
nc = c + moves[d][1]
if nr >= N or nc >= M or nr < 0 or nc < 0:
turn_count += 1
continue
if arr[nr][nc] == 0 and visit[nr][nc] == 0:
visit[nr][nc] = 1
r = nr
c = nc
turn_count = 0
ans += 1
continue
else:
turn_count += 1
if turn_count == 4:
nr = r - moves[d][0]
nc = c - moves[d][1]
if nr >= N or nc >= M or nr < 0 or nc < 0:
break
elif arr[nr][nc] == 0:
r = nr
c = nc
turn_count = 0
else:
break
print(ans)
후기
너무 코드가 지저분한 것 같아서 다른 분들의 코드를 봤는데 다른 분들의 풀이를 보니
필요 없는 코드가 많아서 수정하다보니 아래와 같은 코드가 나왔다.
import sys
N, M = map(int, input().split())
r, c, d = map(int, input().split())
arr = []
visit = [[0] * M for _ in range(N)]
for _ in range(N):
arr.append(list(map(int, sys.stdin.readline().strip().split())))
#북, 동, 남, 서
moves = [[-1, 0], [0, 1], [1, 0], [0, -1]]
turn_count = 0
ans = 1
visit[r][c] = 1
while True:
d = (d + 3) % 4
nr = r + moves[d][0]
nc = c + moves[d][1]
if arr[nr][nc] == 0 and visit[nr][nc] == 0:
visit[nr][nc] = 1
r = nr
c = nc
turn_count = 0
ans += 1
continue
else:
turn_count += 1
if turn_count == 4:
nr = r - moves[d][0]
nc = c - moves[d][1]
if arr[nr][nc] == 0:
r = nr
c = nc
turn_count = 0
else:
break
print(ans)
나는 index가 넘어가서 생기는 에러를 발생하기 위해서 예외처리를 해주었는데,
위 코드는 그런거 없이 넘어갔다.
원래대로라면 nr, nc를 더하는 과정에서 배열을 넘어가는 것을 조회하게 되지 않나..?
라고 생각해서 그냥 테스트로 print에 넘어가는 배열 조회해봤는데 (이하생략)
3 3
1 1 0
1 1 1
1 0 1
1 0 1
하면 분명 통과된 코드도 index 에러 나서 뭐지.. 싶었는데,
문제에
요걸 못봤다.
구현 문제는 문제를 꼭 잘 읽도록하자.