게임 개발 (구현, 시뮬레이션)

‘풀이시간 40분 , 시간제한 1초, 메모리제한 128MB (취코테 with Python 118p 실전문제)’

삼성전자에서 자주나오는 유형의 구현, 시뮬레이션 문제이다.

문제에서 나온 것을 그대로 구현하기만 하면 되지만 보통 지문이 장황하고, 그대로 구현한다고 해도 코드 길이가 길어져서 꽤나 고려할 요소가 많고 피지컬이 필요하다고 항상 느낀다;;
이 문제에서는 방문 여부를 확인하는 동일한 n X m 2차원 배열로 생성해서 0으로 초기화하고 방문하면 해당 좌표를 1로 처리하는것과, 왼쪽으로 회전할때의 순서대로의 좌표로 dx, dy를 정의하는것, 그리고 왼쪽으로 회전하는 turn_left() 함수가 관건이라고 생각한다.

# N, M을 공백을 기준으로 구분하여 입력받기
n, m = map(int, input().split())

# 방문한 위치를 저장하기 위한 맵을 생성하여 0으로 초기화
d = [[0] * m for _ in range(n)]
# 현재 캐릭터의 X 좌표, Y 좌표, 방향을 입력받기
x, y, direction = map(int, input().split())
d[x][y] = 1 # 현재 좌표 방문 처리

# 전체 맵 정보를 입력받기
array = []
for i in range(n):
    array.append(list(map(int, input().split())))

# 북, 동, 남, 서 방향 정의
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# 왼쪽으로 회전
def turn_left():
    global direction
    direction -= 1
    if direction == -1:
        direction = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True:
    # 왼쪽으로 회전
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue
    # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
    else:
        turn_time += 1
    # 네 방향 모두 갈 수 없는 경우
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        # 뒤로 갈 수 있다면 이동하기
        if array[nx][ny] == 0:
            x = nx
            y = ny
        # 뒤가 바다로 막혀있는 경우
        else:
            break
        turn_time = 0

# 정답 출력
print(count)