알고리즘 문제 풀이/이코테

[이코테] CH04 구현 실전문제 3번 게임 개발

파란색 가운 2023. 11. 22. 18:35
import sys
# sys.stdin.readline()
from collections import deque
sys.setrecursionlimit(100000000)
import heapq
INF = 1e9

        
def findpath(x,y,way):
    count = 1
    graph[x][y] = -1
    flag = 0
    way +=200
    while True:
        visitcount = 0
        for _ in range(4):
            nx = x + dx[(way-1)%4]
            ny = y + dy[(way-1)%4]
            if graph[nx][ny] == 0:
                graph[nx][ny] = -1 # 방문 처리
                count +=1
                flag = 1
                visitcount +=1
                x,y = nx,ny 
            way -=1
        if flag == 0: # 가보지 않은 칸이 없는 경우
            way = (way -1) % 4 # 방향만 회전 후 1단계로 복귀
            continue
        if visitcount == 0: # 인접한 부분이 다 바다거나 이미 방문한 칸이라는 뜻
            way = (way + 2) % 4
            x += dx[(way-1)%4]
            y += dy[(way-1)%4]
            if graph[x][y] == 1:
                return count
                break

N,M = map(int,sys.stdin.readline().split())
x,y,way = map(int,sys.stdin.readline().split())
graph = []
for _ in range(N):
    graph.append(list(map(int,sys.stdin.readline().split())))

dx = [-1,0,1,0]
dy = [0,1,0,-1] # 북 동 남 서

print(findpath(x,y,way))

볼때마다 느끼지만

코드를 너무 힘들게 짠다

way가 0->3->2->1 이렇게 가길래 

하나씩 감소시키면서 4로 나눈 나머지를 쓰자는 아이디어로 했는데

답안에는 함수를 아예 만들어서

3,2,1,0 감소시키다가 -1이 되는 순간 3으로 하는 전역변수 함수를 썼다

역시 책이라 그런지 똑똑하다.

그냥 있는대로 구현했는데 발문 이해하는게 너무 힘들었다

국어를 잘해야 해 역시...

way를 200으로 해준 이유는 N,M이 곱하면 150 이내의 수가 나오고

어차피 4로 나눈 나머지를 사용할거기 때문에 적절한 4의 배수를 더해줬다 .

way = (way+2 ) % 4가 나온 이유는 현재 바라보는 반대방향으로 움직여야 하므로

이건 그림 그려보면 알 것 같다 !