#179
Silver III
십자말풀이 번호 매기기
원문: English
시간 제한
2s
메모리 제한
1024MB
제출
1
정답
1
맞힌 사람
1
정답 비율
100.0%

문제

민영이는 십자말풀이 퍼즐을 푸는 것을 좋아한다. 그런데 지현이가 실수로 민영이의 십자말풀이 책에 우유를 쏟아 단어의 시작 위치를 나타내는 번호들이 번지고 말았다. 민영이를 도와 번호를 다시 매겨주자.

격자 형태의 십자말풀이 판은 N×MN \times M 크기이며 (3N,M503 \le N, M \le 50), 각 칸은 비어 있거나 (보통 흰색) 막혀 있다 (보통 검은색). 번호를 매기는 과정은 다음과 같은 두 단계로 이루어진다.

1단계: 각 칸이 가로 또는 세로 단어의 시작점인지 확인한다.

  • 가로 단어의 시작점이 되려면, 현재 칸은 비어 있어야 하고, 현재 칸의 왼쪽 칸은 격자 밖이거나 막혀 있어야 하며, 현재 칸의 오른쪽으로 연속한 두 칸은 모두 비어 있어야 한다. 즉, 가로 단어는 최소 33글자 이상이어야 한다.
  • 세로 단어의 시작점이 되려면, 현재 칸은 비어 있어야 하고, 현재 칸의 위쪽 칸은 격자 밖이거나 막혀 있어야 하며, 현재 칸의 아래쪽으로 연속한 두 칸은 모두 비어 있어야 한다. 즉, 세로 단어는 최소 33글자 이상이어야 한다.

2단계: 단어의 시작점이 되는 각 칸에 번호를 부여한다. 번호는 11번부터 시작하여 책을 읽는 순서와 동일하게 부여한다. 즉, 첫 번째 행의 왼쪽에서 오른쪽으로 훑고, 그다음 두 번째 행을 훑는 식이다. 가로 또는 세로 단어의 시작점인 칸에만 번호를 부여하며, 한 칸이 가로와 세로 단어의 시작점을 겸하더라도 번호는 하나만 부여한다.

예를 들어, 비어 있는 칸을 .으로, 막힌 칸을 #으로 나타낸 다음과 같은 격자를 생각해보자.

...
#..
...
..#
.##

가로 또는 세로 단어의 시작점이 될 수 있는 칸을 !로 표시하면 다음과 같다.

!!!
#..
!..
..#
.##

이 칸들에 번호를 부여하면 다음과 같다.

123
#..
4..
..#
.##

입력으로 주어지는 십자말풀이 데이터는 실제 출판되는 십자말풀이의 일반적인 제약 조건을 만족하지 않을 수도 있음에 유의한다. 예를 들어, 어떤 비어 있는 칸은 어떤 단어에도 포함되지 않을 수 있다.

입력

첫째 줄에 NNMM이 공백으로 구분되어 주어진다. (3N,M503 \le N, M \le 50)

이어서 NN개의 줄에 격자의 각 행을 나타내는 MM개의 문자가 주어진다. 각 문자는 비어 있는 칸을 나타내는 . 또는 막힌 칸을 나타내는 # 중 하나이다.

출력

첫째 줄에 단어의 시작점이 되는 칸의 총 개수를 출력한다.

이어서 각 줄에 단어 시작점의 위치를 나타내는 행과 열 번호를 공백으로 구분하여 출력한다. 출력 순서는 위에서 설명한 번호 부여 순서를 따른다. 제일 왼쪽 위 칸의 위치는 (1,1)(1, 1)이며, 제일 오른쪽 아래 칸의 위치는 (N,M)(N, M)이다.

예제 입력 1

5 3
...
#..
...
..#
.##

예제 출력 1

4
1 1
1 2
1 3
3 1
코드 제출

코드를 제출하려면 로그인이 필요합니다.

로그인
내 제출
제출 내역이 없습니다.
맞은 사람
#순위사용자언어시간메모리코드 길이
5508🥇
조서현
Python8ms8456KB557B
난이도 투표
Silver III1명 투표· 약 2개월 전
로그인 후 AC 받으면 투표할 수 있습니다.
전체 제출
#사용자문제결과언어시간메모리코드 길이제출 시간
5508
맞았습니다
Python8ms8456KB557B2026. 04. 20. 07:11