728x90
[사용한 알고리즘]
구현
[문제 접근]
주어진 시뮬레이션을 수행하면서 충돌이 발생하면 어떻게 충돌이 발생했는지 출력해야 합니다. 따라서 로봇들의 정보를 딕셔너리로 관리하였고 이외의 시뮬레이션은 특별한 알고리즘을 사용하지 않고 문제에서 주어진대로 구현하였습니다.
[알고리즘]
1. 입력받은 로봇들의 정보를 딕셔너리에 저장합니다.
2. 각 명령을 반복 횟수만큼 수행합니다.
3. 충돌이 일어났다면 충돌이 일어난 상황을 출력하고 충돌이 일어나지 않으면 OK를 출력합니다.
[코드]
import sys
def rotation_left(d): # 왼쪽으로 90도 회전
if d == "N":
return "W"
elif d == "W":
return "S"
elif d == "S":
return "E"
elif d == "E":
return "N"
def rotation_right(d): # 오른쪽으로 90도 회전
if d == "N":
return "E"
elif d == "E":
return "S"
elif d == "S":
return "W"
elif d == "W":
return "N"
def check(x, y):
if d == "N":
if x - 1 < 0:
return 'wall'
elif maps[x - 1][y]:
return 'robot'
else:
return True
elif d == "W":
if y - 1 < 0:
return 'wall'
elif maps[x][y - 1]:
return 'robot'
else:
return True
elif d == "S":
if x + 1 >= B:
return 'wall'
elif maps[x + 1][y]:
return 'robot'
else:
return True
elif d == "E":
if y + 1 >= A:
return 'wall'
elif maps[x][y + 1]:
return 'robot'
else:
return True
def move(x, y, d):
if d == "N":
return x - 1, y, d
elif d == "W":
return x, y - 1, d
elif d == "S":
return x + 1, y, d
elif d == "E":
return x, y + 1, d
if __name__ == "__main__":
A, B = map(int, sys.stdin.readline().split())
N, M = map(int, sys.stdin.readline().split())
maps = [[None] * A for _ in range(B)]
robot = dict()
for i in range(N): # 로봇의 초기 위치 및 방향 입력
x, y, d = sys.stdin.readline().split()
x, y = int(x), int(y)
maps[B - y][x - 1] = [d, i + 1]
robot[i + 1] = [B - y, x - 1, d]
flag = True
for i in range(M): # 명령 수행
if flag:
number, order, cnt = sys.stdin.readline().split()
number, cnt = int(number), int(cnt)
for _ in range(cnt):
if flag:
x, y, d = robot[number]
if order == "L":
d = rotation_left(d)
robot[number] = [x, y, d]
elif order == "R":
d = rotation_right(d)
robot[number] = [x, y, d]
elif order == "F":
temp = check(x, y)
if temp == 'wall':
print("Robot {} crashes into the wall".format(number))
flag = False
break
elif temp == 'robot':
x, y, d = move(x, y, d)
print("Robot {} crashes into robot {}".format(number, maps[x][y][1]))
flag = False
break
else:
maps[x][y] = None
x, y, d = move(x, y, d)
robot[number] = x, y, d
maps[x][y] = [d, number]
# 출력
if flag:
print("OK")
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 3655] 최종 순위 - Python (0) | 2021.01.11 |
---|---|
[백준 6497] 전력난 - Python (0) | 2021.01.10 |
[백준 10159] 저울 - Python (0) | 2021.01.05 |
[백준 1254] 팰린드롬 만들기 - Python (0) | 2021.01.05 |
[백준 1600] 말이 되고픈 원숭이 - Python (0) | 2021.01.03 |