본문 바로가기

코딩테스트/SWEA

[Python, 파이썬] SWEA 1215. [S/W 문제해결 기본] 3일차 - 회문1

거꾸로 읽어도 똑같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.
8x8 평면 글자판에서 제시된 길이를 가진 회문의 개수를 구하는 문제.

 

 

def palindrome(word): # 회문인지 확인하는 함수

    N = len(word) // 2

    for i in range(N):
        if(word[i]!=word[-(i+1)]): # 데칼코마니 검사
            return False
    
    return True

T = 10 # 테스트케이스 수 10개

for test_case in range(1, T+1):

    length = int(input()) # 회문의 길이
    board = [] # 8x8 크기의 글자판
    answer = 0 # 찾은 회문의 개수

    # 글자판 입력받기
    for i in range(8):
        board.append(list(input().strip()))

    transpose_board = list(zip(*board))

    N = 8-length+1 # 반복변수

    for i in range(8):
        for j in range(N):

            if(palindrome(board[i][j:j+length])): # 회문이면
                
                answer += 1 # 회문 +1

            if(palindrome(transpose_board[i][j:j+length])): # 회문이면
                answer += 1 # 회문 +1


    print("#%d %d" %(test_case, answer))    
 

 


[문제풀이]


 

회문이란 결국 데칼코마니인지 검사하면 된다.

행과 열을 모두 검사해야 하므로 전치행렬로 만들어 원 행렬 전치 행렬 각각 검사한다.

 transpose_board = list(zip(*board))
 

 

이때 데칼코마니 검사는 음수 인덱스를 사용하였다.

for i in range(N):
    if(word[i]!=word[-(i+1)]): # 데칼코마니 검사
        return False
return True
 

앞 인덱스와 그에 대치되는 위치의 음수 인덱스의 값이 모두 같을 경우 회문이고, 하나라도 틀릴 시 아웃!