알고리즘 문제 풀기/SWEA

SWEA 4861. 회문 - 파이썬

hibscus 2021. 2. 19. 10:10

 

SWEA 4861 회문

 

 

 

 

🎮 문제 접근 방법

 

- N-M+1 만큼 돌면서 한줄씩 건너뛰며 가로에서 먼저 패턴을 찾고 없으면 세로에서 패턴을 찾는다.

 

 

- 회문 1개만 찾으면 되니, 회문을 찾으면 BREAK

 

 

 

 

 

🎈 문자열을 뒤집는 4가지 방법

 

- 거꾸로 읽어오는 것

- swap해서 가져오는 것

- reverse 함수를 사용하는 것

- slicing 해서 거꾸로 가져오는것

 

 

 

 

이 문제는 뒤집진 않아도 되서 swap해서 값을 가져오진 않았지만,  swap을 응요한 앞과 뒤를 비교하는 방법을 활용했습니다.

 

 

그리고 flag 말고도, for else 혹은 elif 를 활용해서 작성 가능합니다!

 

 


T = int(input())

for tc in range(1, T+1):
    N, M = map(int, input().split())
    arr = [list(input()) for _ in range(N)]
        
    #회문 1개 존재, 회문 찾아서 BREAK
    ans = ''
    # 가로
    for row in range(N): # 한줄 건너뛰는
        for i in range(N-M+1): # 한줄안에서 얼마나 돌건지
            flag = True
            for j in range(M//2): # 앞과 뒤 비교하는 것
                if arr[row][i+j] != arr[row][i+M-1-j]:
                    flag = False
                    break
            if flag:
                ans = "".join(map(str, arr[row][i:]))
                break
    else:
    # 세로
        for col in range(N):
            for i in range(N-M+1):
                flag = True
                for j in range(M // 2):
                    if arr[i+j][col] != arr[i+M-1-j][col]:
                        flag = False
                        break
                if flag:
                    for k in range(M):
                        ans += arr[i+k][col]
                    break
    print('#{} {}'.format(tc, ans))


 

 

 

 

 

 

swexpertacademy.com/main/learn/course/lectureProblemViewer.do#none

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com