링크

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 에러 나서 뭐지.. 싶었는데,

문제에

요걸 못봤다.

구현 문제는 문제를 꼭 잘 읽도록하자.

+ Recent posts