문제
민영이는 십자말풀이 퍼즐을 푸는 것을 좋아한다. 그런데 지현이가 실수로 민영이의 십자말풀이 책에 우유를 쏟아 단어의 시작 위치를 나타내는 번호들이 번지고 말았다. 민영이를 도와 번호를 다시 매겨주자.
격자 형태의 십자말풀이 판은 크기이며 (), 각 칸은 비어 있거나 (보통 흰색) 막혀 있다 (보통 검은색). 번호를 매기는 과정은 다음과 같은 두 단계로 이루어진다.
1단계: 각 칸이 가로 또는 세로 단어의 시작점인지 확인한다.
- 가로 단어의 시작점이 되려면, 현재 칸은 비어 있어야 하고, 현재 칸의 왼쪽 칸은 격자 밖이거나 막혀 있어야 하며, 현재 칸의 오른쪽으로 연속한 두 칸은 모두 비어 있어야 한다. 즉, 가로 단어는 최소 글자 이상이어야 한다.
- 세로 단어의 시작점이 되려면, 현재 칸은 비어 있어야 하고, 현재 칸의 위쪽 칸은 격자 밖이거나 막혀 있어야 하며, 현재 칸의 아래쪽으로 연속한 두 칸은 모두 비어 있어야 한다. 즉, 세로 단어는 최소 글자 이상이어야 한다.
2단계: 단어의 시작점이 되는 각 칸에 번호를 부여한다. 번호는 번부터 시작하여 책을 읽는 순서와 동일하게 부여한다. 즉, 첫 번째 행의 왼쪽에서 오른쪽으로 훑고, 그다음 두 번째 행을 훑는 식이다. 가로 또는 세로 단어의 시작점인 칸에만 번호를 부여하며, 한 칸이 가로와 세로 단어의 시작점을 겸하더라도 번호는 하나만 부여한다.
예를 들어, 비어 있는 칸을 .으로, 막힌 칸을 #으로 나타낸 다음과 같은 격자를 생각해보자.
...
#..
...
..#
.##
가로 또는 세로 단어의 시작점이 될 수 있는 칸을 !로 표시하면 다음과 같다.
!!!
#..
!..
..#
.##
이 칸들에 번호를 부여하면 다음과 같다.
123
#..
4..
..#
.##
입력으로 주어지는 십자말풀이 데이터는 실제 출판되는 십자말풀이의 일반적인 제약 조건을 만족하지 않을 수도 있음에 유의한다. 예를 들어, 어떤 비어 있는 칸은 어떤 단어에도 포함되지 않을 수 있다.
입력
첫째 줄에 과 이 공백으로 구분되어 주어진다. ()
이어서 개의 줄에 격자의 각 행을 나타내는 개의 문자가 주어진다. 각 문자는 비어 있는 칸을 나타내는 . 또는 막힌 칸을 나타내는 # 중 하나이다.
출력
첫째 줄에 단어의 시작점이 되는 칸의 총 개수를 출력한다.
이어서 각 줄에 단어 시작점의 위치를 나타내는 행과 열 번호를 공백으로 구분하여 출력한다. 출력 순서는 위에서 설명한 번호 부여 순서를 따른다. 제일 왼쪽 위 칸의 위치는 이며, 제일 오른쪽 아래 칸의 위치는 이다.
예제 입력 1
5 3
...
#..
...
..#
.##
예제 출력 1
4
1 1
1 2
1 3
3 1
코드를 제출하려면 로그인이 필요합니다.
로그인| # | 순위 | 사용자 | 언어 | 시간 | 메모리 | 코드 길이 | |
|---|---|---|---|---|---|---|---|
| 5508 | 🥇 | 조서현 | Python | 8ms | 8456KB | 557B |
| # | 사용자 | 문제 | 결과 | 언어 | 시간 | 메모리 | 코드 길이 | 제출 시간 | |
|---|---|---|---|---|---|---|---|---|---|
| 5508 | 맞았습니다 | Python | 8ms | 8456KB | 557B | 2026. 04. 20. 07:11 |