돌 던지기

시간 제한1초메모리 제한128 MB

요약
벽이 있는 격자에서 돌이 하나씩 떨어지며 막히면 좌우로 미끄러지는 과정을 시뮬레이션해 최종 보드를 출력합니다.
난이도

보통10점 중 6점

유형
시뮬레이션, 행렬, 구현
정답자
아직 제출이 없습니다

문제

R × C 보드가 세워져 있다. 각 칸은 빈 칸 . 또는 벽 X이다. 이후 여러 개의 돌을 하나씩 떨어뜨린다. 각 돌은 지정된 열의 맨 윗칸에서 시작하며, 입력은 항상 그 칸이 비어 있도록 주어진다.

돌은 멈출 때까지 다음 규칙을 반복한다.

  1. 바로 아래 칸이 보드 밖이거나 벽이면 현재 칸에 멈춘다.
  2. 바로 아래 칸이 빈 칸이면 한 칸 아래로 이동한다.
  3. 바로 아래 칸에 다른 돌이 있으면 먼저 왼쪽으로 미끄러질 수 있는지 확인한다. 현재 칸의 왼쪽 칸과 왼쪽 아래 칸이 모두 빈 칸이면 왼쪽 아래로 이동한다.
  4. 왼쪽으로 이동할 수 없고, 현재 칸의 오른쪽 칸과 오른쪽 아래 칸이 모두 빈 칸이면 오른쪽 아래로 이동한다.
  5. 어느 쪽으로도 미끄러질 수 없으면 현재 칸에 멈춘다.

보드 밖의 칸은 빈 칸으로 보지 않는다. 한 돌이 완전히 멈춘 뒤에야 다음 돌을 떨어뜨린다. 모든 돌을 떨어뜨린 뒤의 보드를 출력하라.

입력

첫째 줄에 보드의 크기 R과 C가 주어진다. (1 ≤ R ≤ 30,000, 1 ≤ C ≤ 30)

다음 R개 줄에는 보드의 초기 상태가 주어진다. 각 줄은 길이 C의 문자열이며, .는 빈 칸, X는 벽을 뜻한다.

다음 줄에는 돌을 떨어뜨리는 횟수 N이 주어진다. (1 ≤ N ≤ 100,000)

다음 N개 줄에는 돌을 떨어뜨릴 열의 번호가 순서대로 주어진다. 가장 왼쪽 열의 번호는 1이다.

출력

게임이 모두 끝난 뒤의 보드를 위에서부터 R줄에 걸쳐 출력한다. 돌이 놓인 칸은 O로 출력한다.

예제2

  1. 예제 1

    입력
    5 4
    ....
    ....
    X...
    ....
    ....
    4
    1
    1
    1
    1
    
    예상 출력
    ....
    O...
    X...
    ....
    OOO.
    
  2. 예제 2

    입력
    7 6
    ......
    ......
    ...XX.
    ......
    ......
    .XX...
    ......
    6
    1
    4
    4
    6
    4
    4
    
    예상 출력
    ......
    ...O..
    ...XX.
    ......
    .OO...
    .XX...
    O..O.O