[BOJ 33562] shapex

View as PDF

Submit solution

Points: 4
Time limit: 1.0s
Memory limit: 1G

Problem types
Allowed languages
Assembly, Awk, C, C++, Java, Pascal, Perl, Python, Sed, Text

shapex는 각 사분면에 원형, 사각형, 풍차, 별 모양이 배치된 도형들을 자르고, 합치고, 색칠하여 복잡하고 다채로운 도형들을 만들어내는 것이 목표인 게임이다.</p>

도형들과 그 도형들에 대한 조작이 주어졌을 때 만들어지는 도형을 구하는 프로그램을 작성해 보자.

shapex에서는 도형을 쉽게 나타내기 위해 도형 코드를 사용한다. 다음은 도형 코드에 대한 설명이다.

  • 기본 도형
    • 기본 도형은 총 네 가지로 종류와 코드는 다음과 같다.
      • 원형(, Circle): C
      • 사각형(, Rectangle): R
      • 풍차(, Windmill): W
      • 별(, Star): S
      </li> </ul> </li>
    • 색상
      • 색상은 총 여덟 가지로 종류와 코드는 다음과 같다.
        • 빨강(, Red): r
        • 초록(, Green): g
        • 파랑(, Blue): b
        • 노랑(, Yellow): y
        • 보라(, Purple): p
        • 시안(, Cyan): c
        • 색칠되지 않음(, Uncolored): u
        • 하양(, White): w
        • </ul> </li> </ul> </li>
        • 도형
          • 기본 도형과 색상을 조합하여 하나의 완전한 도형을 만들 수 있다.
          • 도형 한 층은 북동쪽, 남동쪽, 남서쪽, 북서쪽 사분면으로 나뉜다.
          • 한 사분면에는 하나의 기본 도형이 존재하거나 비어 있을 수 있다.
          • 하나의 기본 도형은 하나의 색상을 가진다.
          • 이런 층들을 최소 1층부터 최대 4층까지 쌓아 한 도형을 만들 수 있다.
          • 최고층 이하에 모든 사분면이 비어 있는 층이 있는 도형은 올바르지 않은 도형이다.
          • 그림에서 높은 층의 도형은 아래층보다 작게 보인다. 도형의 크기는 그림에만 나타나며 문제 풀이와 관련이 없다.
          • </ul> </li>
          • 도형 코드
            • 기본 도형과 색상의 코드를 조합하여 도형을 코드로 나타낼 수 있다.
            • 도형 한 층의 코드는 '(기본 도형)(색상)(기본 도형)(색상)(기본 도형)(색상)(기본 도형)(색상)'의 형식으로 나타낼 수 있다. 이때 (기본 도형)(색상) 쌍은 순서대로 북동쪽, 남동쪽, 남서쪽, 북서쪽 사분면의 정보를 나타낸다.
            • 비어 있는 사분면의 코드는 '--'으로 나타낸다.
            • 1층부터 가장 높은 층까지 각 층의 코드를 ':'로 구분하여 나타낸다.
            • 다음은 문제 상단에 있는 도형들의 코드 예시이다.
            • </ul> </li> </ul>
              도형 도형 코드
              CuCuCuCu
              CbCbCbRb:CwCwCwCw
              RuCw--Cw:----Ru--
              CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw

              도형을 조작하는 여러 가지 기계로 더욱 복잡한 도형을 만들 수 있다. 다음은 도형 조작을 위한 기계들에 대한 설명이다.

              • 절단기
                • 한 도형을 서쪽 절반과 동쪽 절반으로 나눈다.
                • 절단 후 어떤 층이 완전히 빈 경우, 즉 '--------'이 되는 경우에는 그 층이 사라지고 그 층보다 높은 층들을 한 층씩 내린다.
                • 절단 후 모든 층이 완전히 빈 경우, 아무런 도형도 생성되지 않는다.
                </li>
              • 회전기
                • 한 도형을 정해진 각도(90도, 180도, 270도)만큼 시계방향으로 회전시킨다.
                • </ul> </li>
                • 결합기
                  • 두 도형을 하나의 도형으로 결합한다.
                  • 즉, 두 번째로 입력된 도형을 첫 번째로 입력된 도형의 위에서부터, 두 도형에 포함된 기본 도형이 서로 겹쳐 더이상 내리지 못하거나 가장 낮은 층이 1층에 도달할 때까지 내린 후 한 도형으로 합친다.
                  • 결합 후 도형이 4층을 초과할 경우, 초과한 층은 사라진다.
                  • </ul> </li>
                  • 색칠기
                    • 한 도형의 비어 있지 않은 모든 층, 모든 사분면에 색을 칠한다.
                    • 기존에 있던 색은 모두 새로운 색으로 덮어씌워진다.
                    • '색칠되지 않음'으로는 색칠할 수 없다.
                    • </ul> </li> </ul>

                      다음은 기계의 작동 예시이다.

                      절단기
                      입력 서쪽 절반 출력 동쪽 절반 출력
                      CrRwWu-- ----Wu-- CrRw----
                      CuCu----:--RuRu--:Wu------ ----Ru-- CuCu----:--Ru----:Wu------
                      --Rc----:Sw------ 생성되지 않음 --Rc----:Sw------
                      회전기
                      입력 회전 각도 출력
                      CrRwWu-- 90도 --CrRwWu
                      CuCu----:--RuRu--:Wu------ 180도 ----CuCu:Ru----Ru:----Wu--
                      CuCu----:--RuRu--:Wu------ 270도 Cu----Cu:RuRu----:------Wu
                      결합기
                      첫 번째 입력 두 번째 입력 출력
                      CuCu---- ----RuRu CuCuRuRu
                      CuCu---- --RuRu-- CuCu----:--RuRu--
                      Ru----Ru:Ru----Ru:RuRuRuRu --CuCu--:--CuCu-- Ru----Ru:Ru----Ru:RuRuRuRu:--CuCu--
                      RuRuRuRu:RuRuRuRu:RuRu----:RuRu---- ----CuCu:CuCuCuCu:CuCuCuCu RuRuRuRu:RuRuRuRu:RuRu----:RuRuCuCu
                      색칠기
                      입력 색상 출력
                      CrRwWu-- c CcRcWc--
                      CuCw----:--RyRg--:Wb------ b CbCb----:--RbRb--:Wb------

                      도형 조작을 위해 레지스터를 사용한다. 다음은 레지스터에 대한 설명이다.

                      • 도형 조작을 위해 $100$개의 레지스터를 사용할 수 있다.
                      • 레지스터에는 순서대로 $R_1$, $R_2$, $\cdots$, $R_{100}$으로 이름이 매겨져 있다.
                      • 처음 주어지는 $N$개의 도형은 $R_1$, $R_2$, $\cdots$, $R_N$에 저장되어 있다.
                      • 나머지 $100−N$개의 레지스터에는 None이 저장되어 있다.
                      • 레지스터에 저장된 값은 다른 값이 저장되지 않는 이상 유지된다.
                      ## 입력 형식

                      첫 번째 줄에 처음 주어지는 도형의 개수 $N$($1 \le N \le 10$)과 조작의 개수 $M$($1 \le M \le 10\,000$)이 공백으로 구분되어 주어진다.

                      다음 $N$개의 줄에 처음 주어지는 도형의 코드가 순서대로 주어진다. 주어지는 도형들은 모두 1층만 있다. 올바른 도형 코드만 입력으로 주어진다.

                      다음 $M$개의 줄에 조작이 다음과 같은 형식으로 순서대로 주어진다. 주어지는 모든 레지스터 번호는 $1$ 이상 $100$ 이하의 정수이다.

                      • $1$ $i$ $j$ $k$ $(j \neq k)$
                        • $R_i$에 저장된 도형을 절단기에 넣어 서쪽 절반을 $R_j$에, 동쪽 절반을 $R_k$에 저장한다.
                        • $R_i$에 저장된 값이 None일 경우 $R_j$, $R_k$에 저장되는 값도 None이다.
                        • 어느 쪽 절반에서 도형이 생성되지 않을 경우 그 절반에 해당하는 레지스터에 저장되는 값도 None이다.
                        </li>
                      • $2$ $i$ $j$ $k$ ($k \in$ {$1$, $2$, $3$})
                        • $R_i$에 저장된 도형을 $k \times 90$도 회전기에 넣어 생성되는 도형을 $R_j$에 저장한다.
                        • $R_i$에 저장된 값이 None일 경우 $R_j$에 저장되는 값도 None이다.
                        • </ul> </li>
                        • $3$ $i$ $j$ $k$
                          • $R_i$, $R_j$에 저장된 도형을 순서대로 결합기에 넣어 생성되는 도형을 $R_k$에 저장한다.
                          • $R_i$, $R_j$에 저장된 값 중에 None이 있을 경우 $R_k$에 저장되는 값도 None이다.
                          • </ul> </li>
                          • $4$ $i$ $j$ $k$ ($k \in$ {'r', 'g', 'b', 'y', 'p', 'c', 'w'})
                            • $R_i$에 저장된 도형을 색칠기에 넣어 색상 $k$로 칠해서 $R_j$에 저장한다.
                            • $R_i$에 저장된 값이 None일 경우 $R_j$에 저장되는 값도 None이다.
                            • </ul> </li> </ul> ## 출력 형식

                              모든 조작을 완료한 후 $R_{100}$에 저장된 값을 출력한다. 도형일 경우 도형 코드를 출력하고, None일 경우 None을 출력한다.

                              예제 입력 1

                            1 7
                            CuRuWuSu
                            1 1 2 3
                            2 3 4 1
                            1 4 5 6
                            2 6 7 3
                            3 6 7 8
                            2 8 9 2
                            3 8 9 100

                            예제 출력 1

                            CuCuCuCu

                            예제 입력 2

                            2 1
                            CbCbCbRb
                            CwCwCwCw
                            3 1 2 100

                            예제 출력 2

                            CbCbCbRb:CwCwCwCw

                            예제 입력 3

                            2 2
                            CbCbCbRb
                            CwCwCwCw
                            3 1 2 100
                            3 2 3 100

                            예제 출력 3

                            None

                            예제 입력 4

                            2 12
                            ----Cw--
                            RuRuRuRu
                            1 2 3 4
                            2 4 3 3
                            3 4 3 3
                            3 1 3 5
                            1 5 5 6
                            2 4 4 1
                            1 4 4 100
                            2 4 4 1
                            3 1 4 1
                            2 1 1 2
                            3 1 5 100
                            2 100 100 3

                            예제 출력 4

                            RuCw--Cw:----Ru--

                            예제 입력 5

                            4 6
                            CbCuCbCu
                            ----SrCr
                            --Cr--Wb
                            Sr----Rp
                            3 4 3 10
                            1 10 11 12
                            4 1 20 w
                            3 2 20 21
                            3 1 12 30
                            3 30 21 100

                            예제 출력 5

                            CbCuCbCu:Sr------:--CrSrCr:CwCwCwCw

Comments

There are no comments at the moment.