← 실전 문제

이동과 되돌리기

C++완성형

격자에서 U·D·L·R 명령으로 상하좌우 한 칸씩 이동해요. .은 열린 칸, #는 벽이에요. 벽이나 격자 밖으로 가려 하면 제자리에 남고 실패 횟수를 1 늘려요.

Z는 아직 되돌리지 않은 가장 최근의 성공한 이동 하나를 취소해 그 이동 직전 위치로 돌아가요. 실패한 이동은 되돌림 기록에 남기지 않아요. 취소할 이동이 없으면 변화가 없고, Z 자체는 실패 횟수를 바꾸지 않아요.

vector<int> solution(vector<string> board, int row, int col, string commands)를 작성해 [최종 행, 최종 열, 실패 횟수]를 반환해 주세요. 행·열은 0부터 세요.

격자 행·열은 15, 모든 행 길이는 같고 문자는 . 또는 #예요. 시작 행·열은 유효한 열린 칸이에요. 명령 길이는 0100, 문자는 UDLRZ 중 하나예요. 격자는 비어 있지 않고 명령은 비어 있을 수 있어요. 반환 배열 길이는 3예요.

예시 1: board = {"...", ".#."}, row = 0, col = 0, commands = "RDRZ" → {0, 1, 1}. 오른쪽 이동 성공, 아래는 벽이라 실패, 오른쪽 이동 성공 뒤 Z로 마지막 성공만 취소해요.

예시 2: board = {"..."}, row = 0, col = 1, commands = "RZL" → {0, 0, 0}. 오른쪽 이동을 취소해 시작으로 돌아온 뒤 왼쪽으로 가요.

실행 입력은 R C 시작행 시작열, 다음 R줄의 격자, 마지막 줄의 명령이에요. 빈 명령은 빈 줄로 전달해요. 하네스가 결과 세 값을 공백으로 구분해 출력해요.

예시 입력

2 3 0 0
...
.#.
RDRZ

예상 결과

0 1 1

예시 입력

1 3 0 1
...
RZL

예상 결과

0 0 0
핵심 개념
  • simulation-2d: 좌표 변환과 반복 뒤의 상태를 추적해요.
  • stack-queue: 가장 최근 상태와 먼저 들어온 상태를 구분해요.
  • array-2d: 행·열과 이동 가능한 칸을 구분해요.

코드 작성과 채점은 로그인 후 이용해요

로그인하고 풀기