[SWEA] 1216_회문2

김태민·2021년 8월 21일
2

알고리즘

목록 보기
3/77

Mingssssss

1. 문제

"기러기" 또는 "level" 과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.

주어진 100x100 평면 글자판에서 가로, 세로를 모두 보아 가장 긴 회문의 길이를 구하는 문제이다.

위와 같은 글자 판이 주어졌을 때, 길이가 가장 긴 회문은 붉은색 테두리로 표시된 7칸짜리 회문이다.

예시의 경우 설명을 위해 글자판의 크기가 100 x 100이 아닌 8 x 8으로 주어졌음에 주의한다.

[제약사항]

각 칸의 들어가는 글자는 c언어 char type으로 주어지며 'A', 'B', 'C' 중 하나이다.

글자 판은 무조건 정사각형으로 주어진다.

ABA도 회문이며, ABBA도 회문이다. A또한 길이 1짜리 회문이다.

가로, 세로 각각에 대해서 직선으로만 판단한다. 즉, 아래 예에서 노란색 경로를 따라가면 길이 7짜리 회문이 되지만 직선이 아니기 때문에 인정되지 않는다.

[입력]

각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 번호가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.

총 10개의 테스트케이스가 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 찾은 회문의 길이를 출력한다.

2. 코드

import sys
sys.stdin = open('input.txt')

for tc in range(10):

    T = int(input())
    arr = [input() for _ in range(100)]

    result = ''
    cnt = 0
    # mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    #

    while cnt < 100:
        for i in range(99):
            for j in range(1, 100):
                if len(arr[cnt][i:i+j]) >= len(result) and arr[cnt][i:i+j] == arr[cnt][i+j-101:i-101:-1]:
                    result = arr[cnt][i:i+j]
        cnt += 1

    cnt = 0
    new_list = list(map(list, zip(*arr)))
    while cnt < 100:
        for i in range(99):
            for j in range(1, 100):
                if len(new_list[cnt][i:i+j]) >= len(result) and new_list[cnt][i:i+j] == new_list[cnt][i+j-101:i-101:-1]:
                    result = new_list[cnt][i:i+j]
        cnt += 1
    print('#{0} {1}'.format(tc+1, len(result)))

3. 리뷰

100x100으로 고정된 2차원 배열의 회문 탐색 방법이다. 회문의 개념 자체는 쉽지만, 인덱스가
매번 헷갈려서 i, j 값을 설정하는데에 고생했다. 처음부터 1칸(1칸은 사실 의미가 없음) 2칸..
순으로 탐색해서 가장 길이가 긴 회문을 저장하고 이를 계속 비교하는 작업을 거쳤다.
zip이라는 함수를 처음 사용했는데, 나중에 코테에서 써먹어야겠다.

profile
어제보다 성장하는 개발자

0개의 댓글