회문인지 판단하는 함수 palindrome
input: word(단어), m(단어의 길이)
output: True
or False
단어의 앞쪽 인덱스와 뒷쪽 인덱스의 값을 비교하며 일치 여부 확인
가로줄을 확인하기 위한 배열 words
세로줄을 확인하기 위한 배열 words_h
words
를 활용하여 생성
words
의 각 문자열의 같은 인덱스들을 합쳐 하나의 문자로 만들고, 저장(zip
과 *
활용)
단어의 길이 m
을 변수로 설정
최대길이인 100부터 시작하여 1씩 줄이며 확인(회문을 찾는 경우 즉시 종료하게 하기 위함)
가로줄, 세로줄에서 슬라이싱한 단어가 회문이라는 것이 확인되면, flag
를 통해 for문 밖으로 나오게 만듦, res
에 해당 길이 저장 후 for문 마친 상태에서 출력
# 회문인지 확인하는 함수
def palindrome(word, m):
for i in range(m//2):
if word[i] != word[-1-i]:
return False
return True
for _ in range(1, 11):
tc = int(input())
n = 100
words = []
# 가로를 분석하기 위한 words
# 세로를 쉽게 분석하기 위한 words_h
for _ in range(n):
words.append(input())
words_h = [''.join(i) for i in zip(*words)]
res = 1
flag = False
#효율을 위해 큰 값에서 작은값으로 진행
for m in range(100, 1, -1):
for i in range(n):
for j in range(n-m+1):
# 가로 또는 세로에 회문이 있다면, 저장 후 for문 종료
if palindrome(words[i][j:j+m], m) or palindrome(words_h[i][j:j+m], m) :
res, flag = m, True
break
if flag :
break
if flag :
break
print(f'#{tc} {res}')
투박하게 짰다가 에러가 떴었던 문제였다. 세로줄을 그냥 for문을 확인해서 하면 된다고 생각했는데, 메모리 에러가 떠서 그냥 세로줄을 위한 배열을 새로 생성하여 구현하였다. 배열이 길어지면서 효율을 고려할 수 있는 문제였고, 여러 효율적인 코드를 짜는 방안을 생각할 수 있어서 좋은 문제라고 생각한다.