추상화
시간 제한2초메모리 제한512 MB
격자의 색칠된 칸에서 서로 다른 색이 인접하지 않도록 최소 개수의 칸을 #으로 바꾸고, 그 최소 개수로 남길 수 있는 색을 구합니다.
문제
Peter는 여러 칸으로 이루어진 독특한 그림을 그렸다. 하지만 그는 그림이 그다지 마음에 들지 않는다. 그림의 일부 색들이 서로 맞닿아 있는데, 그것이 싫다. 그래서 수정액을 조금 발라 맞닿은 서로 다른 색을 떼어 놓고 싶어 한다.
그림은 격자로 이루어져 있고, 각 칸은 어떤 색으로 칠해져 있다. 두 칸이 변을 공유하면 맞닿은 것으로 본다. 꼭짓점만 공유하는 칸은 맞닿은 것으로 보지 않는다.
색은 소문자 알파벳으로 나타낸다. Peter는 일부 칸을 수정액을 뜻하는 '#'으로 바꿀 수 있다. 예를 들면 다음과 같다.
aaab aa#b
aabb a#bb
aaab aa#b
cccc ##c#
Peter는 수정액 6번만으로 모든 색을 떼어 놓았다. 수정액을 아끼기 위해 Peter는 수정액을 바르는 칸 수를 최소로 줄이려 한다.
그런데 그림을 살리려다 실수로 가장 좋아하는 색을 덮어 버릴 수도 있다. 따라서 수정액을 최소로 쓰면서, 그림에 남길 수 있는 색이 무엇인지 알고 싶다.
예를 들어 다음 그림은
bab
bbb
수정액 1번으로 고칠 수 있다.
b#b
bbb
수정액 1번으로 색 b는 남길 수 있지만, 1번만 써서 색 a를 남기는 것은 불가능하다.
입력
입력은 하나의 테스트 케이스로 이루어진다. 프로그램은 서로 다른 입력에 대해 여러 번 실행될 수 있다.
첫 줄에는 공백으로 구분된 두 정수 과 ()가 주어진다. 은 행의 수이고, 는 열의 수이다.
이어지는 개의 줄에는 길이가 정확히 인 문자열이 주어진다. 문자열은 소문자 알파벳 또는 이미 수정액으로 가려진 칸을 뜻하는 '#'만으로 이루어진다.
출력
두 줄을 출력한다. 첫 줄에는 이미 가려진 칸을 제외하고, 추가로 수정액을 발라야 하는 칸의 최소 개수를 정수로 출력한다. 둘째 줄에는 최소 횟수의 수정액으로 남길 수 있는 색을 알파벳 오름차순으로 이어 붙인 문자열을 출력한다.
힌트
첫 번째 예시에서 수정액 2번으로 a를 남길 수 있다.
a#
#a
또한 수정액 2번으로 b를 남길 수 있다.
#b
b#
따라서 a와 b는 각각 수정액 2번으로 남길 수 있지만, 둘을 동시에 남길 수는 없다.