[SWEA][Python]#1216. 회문2

📌풀이


내가 쓴 풀이(성공)

  • 회문인지 판단하는 함수 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문을 확인해서 하면 된다고 생각했는데, 메모리 에러가 떠서 그냥 세로줄을 위한 배열을 새로 생성하여 구현하였다. 배열이 길어지면서 효율을 고려할 수 있는 문제였고, 여러 효율적인 코드를 짜는 방안을 생각할 수 있어서 좋은 문제라고 생각한다.

좋은 웹페이지 즐겨찾기