Programming/SWEA

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

토토모에요 2021. 8. 3. 14:07
728x90
반응형

SW Expert Academy에서 학습용으로 문제를 가져왔습니다. 문제가 될 시 수정, 삭제하겠습니다.

https://swexpertacademy.com/main/main.do

문제 : 
ABBA처럼 어느 방향에서 읽어도 같은 문자열을 회문이라 한다. NxN 크기의 글자판에서 길이가 M인 회문을 찾아 출력하는 프로그램을 만드시오.
회문은 1개가 존재하는데, 가로 뿐만 아니라 세로로 찾아질 수도 있다.
예를 들어 N=10, M=10 일 때, 다음과 같이 회문을 찾을 수 있다.

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50
다음 줄부터 테스트케이스의 첫 줄에 N과 M이 주어진다. 10≤N≤100, 5≤M≤N
다음 줄부터 N개의 글자를 가진 N개의 줄이 주어진다.

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

input

3
10 10
GOFFAKWFSM
OYECRSLDLQ
UJAJQVSYYC
JAEZNNZEAJ
WJAKCGSGCF
QKUDGATDQL
OKGPFPYRKQ
TDCXBMQTIO
UNADRPNETZ
ZATWDEKDQF
10 10
WPMACSIBIK
STWASDCOBQ
AMOUENCSOG
XTIIGBLRCZ
WXVSWXYYVU
CJVAHRZZEM
NDIEBIIMTX
UOOGPQCBIW
OWWATKUEUY
FTMERSSANL
20 13
ECFQBKSYBBOSZQSFBXKI
VBOAIDLYEXYMNGLLIOPP
AIZMTVJBZAWSJEIGAKWB
CABLQKMRFNBINNZSOGNT
NQLMHYUMBOCSZWIOBINM
QJZQPSOMNQELBPLVXNRN
RHMDWPBHDAMWROUFTPYH
FNERUGIFZNLJSSATGFHF
TUIAXPMHFKDLQLNYQBPW
OPIRADJURRDLTDKZGOGA
JHYXHBQTLMMHOOOHMMLT
XXCNJGTXXKUCVOUYNXZR
RMWTQQFHZUIGCJBASNOX
CVODFKWMJSGMFTCSLLWO
EJISQCXLNQHEIXXZSGKG
KGVFJLNNBTVXJLFXPOZA
YUNDJDSSOPRVSLLHGKGZ
OZVTWRYWRFIAIPEYRFFG
ERAPUWPSHHKSWCTBAPXR
FIKQJTQDYLGMMWMEGRUZ

output

#1 JAEZNNZEAJ
#2 MWOIVVIOWM
#3 TLMMHOOOHMMLT

code

Test_case = int(input())

for t in range(1, Test_case + 1):
    N, M = map(int, input().split())
    result = []

    #배열 입력 받기
    arr = []
    for i in range(N):
        arr.append(input())

    #가로 검색
    for r in range(N):  #r은 row c는 column
        for c in range(N - M + 1): 
            if arr[r][c : c + M] == arr[r][c : c + M][ : : -1]: #회문이 맞는지 확인
                result.append(arr[r][c : c + M]) #회문이면 결과 리스트에 추가

    #세로 검색
    for r in range(N - M + 1):
        for c in range(N):
            c_list = []  # 새로 열 리스트를 만들어주기
            for i in range(M):  
                c_list.append(arr[r+i][c])
            if c_list == c_list[ : : -1]:  # 세로줄이 회문이면
                result.append(''.join(c_list)) #결과리스트에 추가.

    print('#{} {}'.format(t, result[0]))

이 문제에서의 핵심은 한 주축부터 검색하여 회문인지 아닌지 판별하는 코드를 짜는게 중요합니다. 슬라이싱을 사용하여 만든 배열의 행렬 범위를 지정해 회문이면 리스트에 추가해 도출하면 됩니다.

반응형