Algorithm/SW Expert Academy

[Python] 4861. 회문

느낌표 공장장 2021. 9. 7. 23:49

처음 풀이 (search 함수 인덱싱이 조금 복잡해 보인다.)

# 문자열 같은지 같지 않은지 비교
def search(i, j, board):
    # 회문의 길이가 홀수일 때랑 짝수일 때 슬라이싱의 범위가 다르므로 조건문 설정
    # 회문의 길이가 짝수일 때
    if m % 2:
        start = board[i][j:m_half + j]          # 구간의 처음 ~ 중간까지의 범위
        end = board[i][m + j:m_half + j:-1]     # 중간 ~ 구간의 끝 까지의 범위 (비교할 수 있도록 반대로 슬라이싱하였다.)
                                                # [구간의 끝 : 중간 : -1]
    # 회문의 길이가 홀수일 떄
    else:
        start = board[i][j:m_half + j]          # 구간의 처음 ~ 중간 글자 이전
        end = board[i][m + j:m_half + j-1:-1]   # 중간글자 다음부터 ~ 구간의 끝

    # 비교한 두 범위가 같다면 정답을 반환한다.
    if start == end:
        return board[i][j:n + j]

    return 0


tc = int(input())

for idx in range(1, tc+1):
    # 글자판 크기 n, 회문의 길이 m
    n, m = map(int, input().split())
    # 글자판 받아오기
    board = [list(input()) for _ in range(n)]
    # 글자판 뒤집기
    # board안의 1차원 리스트를 다 가져와서, 인덱스 순서에 맞는 각 원소들을 하나의 리스트로 묶어 반환한다. (여기서 다시 감싸면 2차원이됨)
    board_r = list(map(list, zip(*board)))


    m_half = m // 2     # m의 길이 절반 구하기 (반만 비교하면 되니까)
    answer = None       # 정답이 들어갈 변수
    for i in range(n):
        # 회문의 길이가 정해져 있으므로 회문의 구간을 한칸씩 옮겼을 때
        # 글자판의 끝까지만 for문을 돈다.
        for j in range(n-m+1):

            # 가로
            garo = search(i, j, board)
            # 정답이 반환됐다면 문자열로 변환 후 반복문 중단.
            if garo:
                answer = ''.join(garo)
                break

            # 세로
            sero = search(i, j, board_r)
            if sero:
                answer = ''.join(sero)
                break

        # 정답을 찾았다면 반복문을 돌 필요 X -> 중단
        if answer:
            break

    print('#{} {}'.format(idx, answer))

 

그래서 함수에 배열 넣어줄때 정리해서 넣어주었더니 조금 읽기 편한 코드가 되었다.

# 문자열 같은지 같지 않은지 비교
def search(i, j, board):
    # 회문의 길이가 홀수일 때랑 짝수일 때 슬라이싱의 범위가 다르므로 조건문 설정
    # 회문의 길이가 짝수일 때
    if m % 2:
        start = board[:m_half]          # 구간의 처음 ~ 중간까지의 범위
        end = board[:m_half:-1]     # 중간 ~ 구간의 끝 까지의 범위 (비교할 수 있도록 반대로 슬라이싱하였다.)
                                                # [구간의 끝 : 중간 : -1]
    # 회문의 길이가 홀수일 떄
    else:
        start = board[:m_half]          # 구간의 처음 ~ 중간 글자 이전
        end = board[:m_half-1:-1]   # 중간글자 다음부터 ~ 구간의 끝

    # 비교한 두 범위가 같다면 정답을 반환한다.
    if start == end:
        return board

    return 0


tc = int(input())

for idx in range(1, tc+1):
    # 글자판 크기 n, 회문의 길이 m
    n, m = map(int, input().split())
    # 글자판 받아오기
    board = [list(input()) for _ in range(n)]
    # 글자판 뒤집기
    # board안의 1차원 리스트를 다 가져와서, 인덱스 순서에 맞는 각 원소들을 하나의 리스트로 묶어 반환한다. (여기서 다시 감싸면 2차원이됨)
    board_r = list(map(list, zip(*board)))


    m_half = m // 2     # m의 길이 절반 구하기 (반만 비교하면 되니까)
    answer = None       # 정답이 들어갈 변수
    for i in range(n):
        # 회문의 길이가 정해져 있으므로 회문의 구간을 한칸씩 옮겼을 때
        # 글자판의 끝까지만 for문을 돈다.
        for j in range(n-m+1):

            # 가로
            garo = search(i, j, board[i][j:m+j])
            # 정답이 반환됐다면 문자열로 변환 후 반복문 중단.
            if garo:
                answer = ''.join(garo)
                break

            # 세로
            sero = search(i, j, board_r[i][j:m+j])
            if sero:
                answer = ''.join(sero)
                break

        # 정답을 찾았다면 반복문을 돌 필요 X -> 중단
        if answer:
            break

    print('#{} {}'.format(idx, answer))

'Algorithm > SW Expert Academy' 카테고리의 다른 글

[Python] 4864. 문자열비교  (0) 2021.09.07
[Python] 1216. 회문2  (0) 2021.09.07
[Python] 1221. GNS  (0) 2021.09.07
[Python] 1213. string  (0) 2021.09.07
[Python] 4843. 특별한 탐색  (0) 2021.09.06