백준 1032

justhaza.log·2024년 1월 23일

알고리즘: BOJ

목록 보기
24/125

문제 해석

길이가 모두 같고, 알파벳과 '.'으로 이루어진 문자열들의 공통 패턴을 찾는 문제이다.

가능하면 '?'을 적게 써야 한다는 조건은.. 주어진 문자열들의 공통된 부분을 최대로 찾아서 패턴을 만들어야 한다는 의미이다.

주어진 모든 문자열을 일일이 비교해야 하므로 첫 번째로 주어진 문자열을 패턴(정답)으로 둔 뒤, 다른 문자열의 같은 위치에 있는 문자들과 하나씩 비교한다. 이때 비교하는 문자가 서로 다를 경우 패턴의 해당 문자를 '?'로 바꾼다.

이 과정을 주어진 문자열에 대해 반복하면 어렵지 않게 풀 수 있다.

코드

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 함수를 통해 하나의 문자열로 출력했다.

참고

https://blockdmask.tistory.com/468

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글