2017_상_P_1_L11

Nitroblue 1·2025년 8월 19일

삼성 기출 풀이

목록 보기
7/73

자율주행 자동차

Simulation

평균 98'
sol : 117'

  • 수행 시간 : 48ms
  • 메모리 : 16MB
n, m = map(int, input().split())
# 자동차 초기 좌표 x, y / 초기 방향 d
x, y, d = map(int, input().split())
road = [list(map(int, input().split())) for _ in range(n)]

# 북 : 0 / 동 : 1 / 남 : 2 / 서 : 3
NORTH, EAST, SOUTH, WEST = 0, 1, 2, 3

# 문제상 좌회전만 존재한다.
def rotate():
    if d == NORTH:
        return WEST
    else:
        return d - 1

# 주어진 방향으로 이동. 방문한 도로는 -1로 변경하여 재방문 제한.
def can_move(di, r):
    if di == NORTH and x - r >= 0 and road[x - r][y] == 0:
        return True
    elif di == SOUTH and x + r < n and road[x + r][y] == 0:
        return True
    elif di == EAST and y + r < m and road[x][y + r] == 0:
         return True
    elif di == WEST and y - r >= 0 and road[x][y - r] == 0:
          return True
    else:
        return False

def can_roll_back():
    if d == NORTH and x + 1 >= 0 and road[x + 1][y] != 1:
        return True
    elif d == SOUTH and x - 1 < n and road[x - 1][y] != 1:
        return True
    elif d == EAST and y - 1 < m and road[x][y - 1] != 1:
         return True
    elif d == WEST and y + 1 >= 0 and road[x][y + 1] != 1:
          return True
    else:
        return False


def move(r):
    global x, y
    if d == NORTH:
        x -= r
        road[x][y] = -1
    elif d == SOUTH:
        x += r
        road[x][y] = -1
    elif d == EAST:
        y += r
        road[x][y] = -1
    elif d == WEST:
        y -= r
        road[x][y] = -1
    else:
        return False

road[x][y] = -1
area = 1
while True:
    count = 0
    d = rotate()
    # 현재 방향으로 전진할 수 있거나 4방향 다 탐색했을 때 탈출
    while not can_move(d, 1) and count < 3:
        d = rotate()
        count += 1
    if can_move(d, 1):
        move(1)
        area += 1
    else:
        if can_roll_back():
            move(-1)
        else:
            break

print(area)
  • directions에 대해서 deque() 활용해서 계속 돌아가게 만들고 싶기는했다.
  • 아.. 내가 난독증이 심한가....

0개의 댓글