길이가 모두 같고, 알파벳과 '.'으로 이루어진 문자열들의 공통 패턴을 찾는 문제이다.
가능하면 '?'을 적게 써야 한다는 조건은.. 주어진 문자열들의 공통된 부분을 최대로 찾아서 패턴을 만들어야 한다는 의미이다.
주어진 모든 문자열을 일일이 비교해야 하므로 첫 번째로 주어진 문자열을 패턴(정답)으로 둔 뒤, 다른 문자열의 같은 위치에 있는 문자들과 하나씩 비교한다. 이때 비교하는 문자가 서로 다를 경우 패턴의 해당 문자를 '?'로 바꾼다.
이 과정을 주어진 문자열에 대해 반복하면 어렵지 않게 풀 수 있다.
import sys
n = int(sys.stdin.readline())
file_names = []
for _ in range(n):
file_names.append(list(sys.stdin.readline().rstrip()))
# print(file_names)
pattern = file_names[0]
# print(pattern)
for i in range(1, n):
for j in range(len(pattern)):
if pattern[j] != file_names[i][j]:
pattern[j] = '?'
if pattern == ['?'] * len(pattern):
break
print(''.join(pattern))
코드에서 file_names 리스트에 문자열이 아닌 리스트로 각 문자열을 저장한 이유는 패턴을 만들 때 서로 다른 문자의 위치에 '?'를 넣어야 하는데, 기본적으로 문자열은 대입이 불가능하기 때문이다.
그래서 리스트로 각 문자열을 저장했고, 패턴 역시 리스트로 탐색한 다음 파이썬의 join 함수를 통해 하나의 문자열로 출력했다.