월리를 찾아라

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

요약
base64 방식으로 인코딩된 이미지와 정사각형 패턴을 비트로 복원한 뒤, 회전 및 대칭까지 고려해 패턴과 일치하는 이미지 내 부분 사각형의 개수를 세는 문제입니다.
난이도

보통10점 중 6점

유형
행렬, 문자열 매칭, 완전 탐색, 구현
정답자
아직 제출이 없습니다

문제

「월리를 찾아라(Where's Wally)」라는 유명한 아동 도서 시리즈를 아는가? 각 책에는 수백 명의 사람이 등장하는 다양한 그림이 담겨 있고, 독자는 그 군중 속에서 월리라는 인물을 찾아야 한다.

「월리를 찾아라」는 이차원 그래픽 이미지에 대한 일종의 패턴 매칭이라고 볼 수 있다. 그림 속에서 월리의 모습을 찾는 것이다. 「월리를 찾아라」를 푸는 컴퓨터 프로그램을 작성하면 흥미롭겠지만, 그림 속 월리의 모습이 조금씩 다를 수 있어 쉬운 일이 아니다. 그래서 그 생각은 접고 문제를 훨씬 풀기 쉽게 바꾸었다. 여러분은 이 그래픽 패턴 매칭 문제의 더 쉬운 버전을 풀면 된다.

이미지 하나와 패턴 하나가 주어진다. 둘 다 비트로 이루어진 직사각형 행렬이다(단, 패턴은 항상 정사각형이다). 00은 흰색, 11은 검은색을 뜻한다. 이 문제에서는 이미지 안에 패턴이 몇 번 나타나는지, 즉 패턴과 정확히 일치하는 정사각형 영역이 이미지 안에 몇 개 있는지를 센다. 9090도의 배수만큼 회전하거나, 뒤집어서 거울상이 된 형태로 나타나는 패턴도 모두 고려해야 한다.

입력

입력은 여러 개의 데이터셋으로 이루어지며, 각 데이터셋의 형식은 다음과 같다.

w h p
이미지 데이터
패턴 데이터

데이터셋의 첫째 줄에는 세 양의 정수 ww, hh, pp가 주어진다. ww는 이미지의 너비, hh는 이미지의 높이이며, 둘 다 비트 수로 센다. pp는 패턴의 너비이자 높이로, 패턴은 항상 정사각형이다. 1≤w≤10001 \le w \le 1000, 1≤h≤10001 \le h \le 1000, 1≤p≤1001 \le p \le 100이라고 가정해도 된다.

이어지는 hh개의 줄은 이미지를 나타낸다. 각 줄은 ⌈w/6⌉\lceil w/6 \rceil개(⌊(w+5)/6⌋\lfloor (w + 5)/6 \rfloor과 같다)의 문자로 이루어지며, 이미지의 한 가로줄에 대응한다. 각 문자는 이미지 한 줄의 여섯 비트를 왼쪽에서 오른쪽 순서로 나타내며, BASE64 인코딩의 변형 방식을 따른다. 인코딩 규칙은 아래 표와 같다. 표에 있는 값의 최상위 비트가 이미지의 가장 왼쪽 비트에 대응한다. 마지막 문자는 이미지 너비를 넘어서는 몇 개의 비트를 나타낼 수도 있는데, 이 비트들은 무시해야 한다.

문자값 (여섯 비트)
A–Z0–25
a–z26–51
0–952–61
+62
/63

마지막 pp개의 줄은 패턴을 나타낸다. 각 줄은 ⌈p/6⌉\lceil p/6 \rceil개의 문자로 이루어지며, 이미지와 같은 방식으로 인코딩된다.

세 개의 00으로 이루어진 줄은 입력의 끝을 나타낸다. 입력 전체의 크기는 22메가바이트를 넘지 않는다.

출력

입력의 각 데이터셋에 대해, 이미지 안에서 일치하는 정사각형의 개수를 한 줄에 출력한다. 출력 줄에는 다른 문자가 포함되어서는 안 된다.

일치하는 정사각형 두 개 이상이 서로 겹칠 수 있다. 이 경우에는 각각 따로 센다. 반면, 하나의 정사각형은 예를 들어 원래 패턴과 그 회전 형태 모두에 일치하더라도 두 번 이상 세지 않는다.

예제1

  1. 예제 1

    입력
    48 3 3
    gAY4I4wA
    gIIgIIgg
    w4IAYAg4
    g
    g
    w
    153 3 3
    kkkkkkkkkkkkkkkkkkkkkkkkkg
    SSSSSSSSSSSSSSSSSSSSSSSSSQ
    JJJJJJJJJJJJJJJJJJJJJJJJJI
    g
    Q
    I
    1 1 2
    A
    A
    A
    384 3 2
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
    BCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/A
    CDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/AB
    A
    A
    0 0 0
    
    예상 출력
    8
    51
    0
    98