아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

직소 퍼즐 맞추기

면접 대비

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

요약
각 퍼즐 조각에 위, 왼쪽, 아래, 오른쪽 정수 값이 주어지며, 서로 반대되는 값을 맞춰 N x N 격자의 제자리에 배치한 뒤 완성된 그림을 출력한다.
난이도

보통10점 중 5점

유형
구현, 완전 탐색, 행렬, 해시맵
정답자
아직 제출이 없습니다

문제

직소(조각) 퍼즐을 맞추는 프로그램을 작성한다. 입력에는 퍼즐의 크기, 조각의 크기, 그리고 모든 조각이 주어진다. 각 조각은 ASCII 문자로 그려져 있다. 프로그램은 조각들을 올바른 위치에 배치한 완성된 퍼즐을 출력해야 한다.

입력

첫째 줄에 세 정수 NN, HH, WW가 주어진다. 각각 퍼즐의 한 변에 놓인 조각 수(퍼즐은 항상 N×NN \times N 조각으로 이루어진 정사각형이다), 조각의 높이, 조각의 너비이다. 모든 조각의 크기는 같다. 범위는 2≤N≤102 \le N \le 10, 1≤H,W≤251 \le H, W \le 25이다. 예를 들어 2 2 3은 각 조각이 높이 22, 너비 33 문자인 2×22 \times 2 퍼즐을 뜻한다.

이어서 N×NN \times N개의 조각이 임의의 순서로 주어진다. 각 조각은 그 이미지(정확히 HH줄, 각 줄 WW문자)와 그다음 줄에 놓인, [−5,5][-5, 5] 범위의 네 정수로 이루어진다. 이 네 값은 순서대로 위, 왼쪽, 아래, 오른쪽 변의 모양이다. 값 00은 곧은(바깥쪽) 변을 뜻한다. 두 변은 값의 부호가 반대이고 합이 00일 때 정확히 맞물린다(예: +5+5는 −5-5와, +4+4는 −4-4와 맞물린다). 조각은 회전할 수 없으며, 네 변의 값이 모두 같은 두 조각은 존재하지 않는다(모든 조각은 서로 다르다). 조각과 조각 사이는 빈 줄 하나로 구분된다.

공백 문자(ASCII 32)도 조각을 이루는 유효한 문자이며, 줄 끝이나 한 줄 전체를 포함해 어디에나 나타날 수 있고, 해당 위치에 그대로 입력에 포함된다. 모든 조각은 문자(ASCII 32~127)로 채워진 직사각형 블록이므로, 공백도 다른 문자와 똑같이 취급한다.

출력

완성된 퍼즐을 출력한다. N×NN \times N개의 조각을 배치하는 방법은 유일하다. 모든 바깥쪽 변(값 00)은 퍼즐의 테두리에 놓이고, 각 조각의 오른쪽 변과 그 오른쪽 이웃 조각의 왼쪽 변의 합이 00이며, 각 조각의 아래쪽 변과 그 아래 조각의 위쪽 변의 합이 00이 되도록 맞춘다. 이렇게 완성된 그림, 즉 N⋅HN \cdot H줄, 각 줄 N⋅WN \cdot W문자를 출력한다. 입력에는 항상 정확히 하나의 해가 존재한다.

예제4

  1. 예제 1

    입력
    2 8 14
    88,           
    8888.         
    :8888b        
      8888        
    -.:888b       
    ' d8888       
     ,88888       
    ':88888       
    0 3 -1 0
    
             o8%88
           o88%888
          8'-    -
         8'       
        d8.-=. ,==
        >8 `~` :`~
        88        
        88b. `-~  
    0 0 -5 -3
    
    .:88888       
    :::8888       
    :' 8888b      
        8888b     
        ,%888b.   
        %%%8--'-. 
       _%-' ---  -
    .-'   =  --.  
    1 4 0 0
    
        888b ~==~ 
        88888o--:'
        `88888| ::
        8888^^'   
       d888       
      d88%        
     /88:.__ ,    
         '''::===.
    5 0 0 -4
    
    예상 출력
             o8%8888,           
           o88%8888888.         
          8'-    -:8888b        
         8'         8888        
        d8.-=. ,==-.:888b       
        >8 `~` :`~' d8888       
        88         ,88888       
        88b. `-~  ':88888       
        888b ~==~ .:88888       
        88888o--:':::8888       
        `88888| :::' 8888b      
        8888^^'       8888b     
       d888           ,%888b.   
      d88%            %%%8--'-. 
     /88:.__ ,       _%-' ---  -
         '''::===..-'   =  --.  
    
  2. 예제 2

    입력
    2 1 1
    ,
    0 0 5 4
    
    _
    -5 0 0 1
    
    8
    2 -1 0 0
    
    .
    0 -4 -2 0
    
    예상 출력
    ,.
    _8
    
  3. 예제 3

    입력
    2 3 5
    _8`~-
    @^,._
    b*,--
    0 -2 3 0
    
    b|8^b
    =|'8=
    =~,b'
    -3 2 0 0
    
    *.%|O
    .`*#%
    88O'@
    -2 0 0 -2
    
    8`.^,
    ,._~8
    b-|:|
    0 0 2 2
    
    예상 출력
    8`.^,_8`~-
    ,._~8@^,._
    b-|:|b*,--
    *.%|Ob|8^b
    .`*#%=|'8=
    88O'@=~,b'
    
  4. 예제 4

    입력
    3 2 4
    %-o%
    `.~/
    4 0 0 -3
    
    /=Ob
    _|*_
    5 0 -4 4
    
    O`@-
    =#:^
    0 1 -2 5
    
    |-%*
     @O|
    2 -2 5 0
    
    |b%|
    o^#O
    -5 3 0 2
    
    b#**
    |@'o
    2 -4 5 2
    
    *.b8
    ~@%8
    0 -5 -2 0
    
    -/o*
    _ .:
    0 0 -5 -1
    
    ~@%*
    8|#:
    -5 -2 0 0
    
    예상 출력
    -/o*O`@-*.b8
    _ .:=#:^~@%8
    /=Obb#**|-%*
    _|*_|@'o @O|
    %-o%|b%|~@%*
    `.~/o^#O8|#: