4861 - 회문

박재현·2022년 2월 17일
0

알고리즘 부수기

목록 보기
29/43
post-thumbnail

문제 설명

링크

문제 풀이

  1. index = 0 부터 palindrome길이 M하면서 str과 str을 뒤집은 string을 비교한다.
  2. palindrome이 아니면 index++ 해서 다시 탐색한다.
  3. 못찾을 경우, palindrome을 찾을 때까지 100까지 1,2번 과정을 반복한다.
  4. 못찾을 경우, 좌 -> 우 방향으로 1,2,3번 과정을 반복한다.

파이썬의 슬라이싱 문법을 잘 활용하지 못했다. str == str[::-1] 하면 뒤집은 값끼리 비교할 수 있는 문법을 너무 돌아갔다.

코드

def checkPalindrome(i, j, M, arr, isCol):
    for k in range(0, M // 2 + 1):
        if isCol:
            if arr[i][j + k] != arr[i][j + M - k - 1]:
                return False
        else:
            if arr[i + k][j] != arr[i + M - k - 1][j]:
                return False
        if k == M // 2:
            return True

T = int(input())
for tc in range(1, T + 1):
    result = ""

    isChecked = False

    N, M = map(int, input().split())
    arr = [list(input()) for _ in range(N)]

    for i in range(N):
        for j in range(N - M + 1):
            if checkPalindrome(i, j, M, arr, True):
                for l in range(j, j + M):
                    result += arr[i][l]
                    isChecked = True
        if isChecked:
            break
    for j in range(N):
        for i in range(N - M + 1):
            if checkPalindrome(i, j, M, arr, False):
                for l in range(i, i + M):
                    result += arr[l][j]
                    isChecked = True
        if isChecked:
            break

    print(f'#{tc} {result}')

교수님 풀이

    def is_palindrome(word):
        idx = 0
        while idx + M - 1 < N:
            pali = word[idx:idx + M]
            if pali == pali[::-1]:
                return pali
            idx += 1
        return False

    for i in range(N):
        tmp = ''
        for j in range(N):
            tmp += arr[j][i]
        result = is_palindrome(tmp)
        if result:
            break
        result = is_palindrome(arr[i])
        if result:
            break

    print(f'#{tc} {result}')
profile
공동의 성장을 추구하는 개발자

0개의 댓글