일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- AI Tech 4기
- 풀스택
- P Stage
- 4기
- 웹 프로그래밍
- 프로그래머스
- 장고
- cs50
- QNA 봇
- 서블릿
- Customer service 구현
- 부스트캠프
- 서버
- 파이썬
- 백엔드
- boostcourse
- Django
- Naver boostcourse
- sts
- 레벨2
- 2021 Dev-matching 웹 백엔드 개발자
- Naver boostcamp
- AI Tech
- 프로그래밍
- 웹
- 네이버
- 백준
- 대회
- 구현
- BOJ
- Today
- Total
daniel7481의 개발일지
[BOJ] 2174 로봇 시뮬레이션 본문
https://www.acmicpc.net/problem/2174
풀이
재밌는 시뮬레이션 문제다. 처음에 문제에서 로봇이 명령을 내린다는 부분에서 헷갈렸는데, 간단히 그 로봇이 명령을 수행한다라고 이해하면 되겠다. 명령은 순서대로 실행되며, 한 명령이 실행 중일 때는 다른 명령을 실행 할 수 없다라고 이해하였다. 외국 문제를 번역했다보니 설명이 다소 부족하지만 각 로봇에 대하여 처음에 입력 받은 로봇을 1번 로봇이라 하고, 그 뒤로도 N번 로봇이라고 칭하면 되겠다. 로봇에 대하여 좌표, 방향을 해싱을 사용하여 할당하였다. 입력 받은 로봇의 좌표에 대하여 격자 위에 로봇의 번호를 할당해주었다. 나중에 부딪혔을 때 어떤 로봇이랑 부딪혔는지 확인하기 위함이다. 딕셔너리 자료구조를 사용하여 N을 키로 가지고 x, y, 방향을 value 값을 가지는 딕셔너리 dic을 선언하여 주었고, 일단 모든 명령을 입력 받아 commands 리스트에 할당해준 후, 순차적으로 탐색하며 반복 횟수만큼 명령(L, R, F)에 따라 반복해주었다. 여기서 만약 벽에 부딪혔다면(x, y가 0부터 A-1, B-1 안에 포함되지 않는다면) wall_flag를 True로 업데이트하고 wall_robot에 벽에 부딪힌 로봇의 번호를 할당해주었다. 만약 이동할려고 하는 좌표에 다른 로봇이 있다면 현재 로봇의 번호와 부딪힌 로봇의 번호를 robot_crash 리스트에 할당해주었다. 마지막에는 벽에 부딪혔는지, 다른 로봇이랑 부딪혔는지, 이상이 없는지를 조건으로 if문을 사용하여 출력해주었다.
import sys
input = lambda: sys.stdin.readline().rstrip()
A, B = map(int, input().split())
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0] # N, W, S, E
n, m = map(int, input().split())
wall_flag = False
robot_flag = False
mtr = [[0 for _ in range(B)]for _ in range(A)]
robot_hash = {}
for i in range(n):
x, y, dir = input().split()
x, y = int(x), int(y)
x -= 1
y -= 1
if dir == "N":
dir = 0
elif dir == "W":
dir = 1
elif dir == "S":
dir = 2
elif dir == "E":
dir = 3
robot_hash[i+1] = [x, y, dir]
mtr[x][y] = i+1
wall_robot = 0
robot_crash = []
commands = []
for _ in range(m):
commands.append(list(input().split()))
for comman in commands:
robot = comman[0]
com = comman[1]
lit = comman[2]
robot, lit = int(robot), int(lit)
if com == 'F':
mtr[robot_hash[robot][0]][robot_hash[robot][1]] = 0
for _ in range(lit):
robot_hash[robot][0] += dx[robot_hash[robot][2]]
robot_hash[robot][1] += dy[robot_hash[robot][2]]
if robot_hash[robot][0] < 0 or robot_hash[robot][1] < 0 or robot_hash[robot][0] >= A or robot_hash[robot][1] >= B:
wall_flag = True
wall_robot = robot
break
if mtr[robot_hash[robot][0]][robot_hash[robot][1]] != 0:
robot_flag = True
robot_crash = [robot, mtr[robot_hash[robot][0]][robot_hash[robot][1]]]
break
if wall_flag or robot_flag:
break
mtr[robot_hash[robot][0]][robot_hash[robot][1]] = robot
elif com == "L":
for _ in range(lit):
robot_hash[robot][2] += 1
if robot_hash[robot][2] == 4:
robot_hash[robot][2] = 0
else:
for _ in range(lit):
robot_hash[robot][2] -= 1
if robot_hash[robot][2] == -1:
robot_hash[robot][2] = 3
if wall_flag:
print('Robot {0} crashes into the wall'.format(wall_robot))
elif robot_flag:
print('Robot {0} crashes into robot {1}'.format(robot_crash[0], robot_crash[1]))
else:
print('OK')
'BOJ' 카테고리의 다른 글
[BOJ]18428 감시 피하기 (0) | 2022.07.14 |
---|---|
[프로그래머스]2020 KAKAO BLIND RECRUITMENT - 문자열 압축 (0) | 2022.07.11 |
[BOJ]1935 후위표기식2 (0) | 2022.07.08 |
[BOJ]1918 후위 표기식 (0) | 2022.07.08 |
[BOJ]8972 미친 아두이노 (0) | 2022.07.08 |