🗒️파이썬 코드 풀이
for tc in range(1,11) :
T = int(input())
lst = []
lst = [list(input()) for _ in range(100)]
lst_v = []
# 세로->가로 전환 리스트
for j in range(100):
tmp = []
for i in range(100):
tmp.append(lst[i][j])
lst_v.append(tmp)
mx = 1
for i in range(100) : # 1~100개 리스트 중 1개
for k in range(1,101): # 1~100개 중 순차적으로 확인 할 회문 개수
for j in range(0,100-k+1): # 확인 할 회문 개수 대비 반복 수
if lst[i][j:j+k] == lst[i][j:j+k][::-1] : # 회문 체크
mx = max(mx,k) # 최대값 갱신
if lst_v[i][j:j+k] == lst_v[i][j:j+k][::-1] :
mx = max(mx,k)
print(f"#{T} {mx}")
1. 세로를 확인하는 것은 가로보다 번거롭다. 때문에 미리 세로를 가로 형태로 전환해었다.
2. 100x100 배열에 먼저 1x100을 해주기 위한 반복문 ( for i in range(100) )
3. 회문 확인 할 개수(1개~100개까지) ( for k in range(1,101) )
4. 확일 할 회문 개수 대비 반복 수 ( for j in range(0,100-k+1) )
5. lst[ i ][ j : j + k] (i 번째 행에서 k(회문확인개수) 간극만큼 열 확인)
lst[ i ][ j : j + k][ : : -1 ] 회문 비교
6. 각각 가로,세로 회문 비교 하면서 최대 회문 개수 갱신
📌 문제 코멘트
for문의 지옥 ... i와 j 사이의 k(확인 할 회문의 개수) 에서 좀 헤맸다.
차근차근 i 부터 생각하며, k 간격으로 슬라이딩 할 j를 구하면 된다.
2차원 리스트 중 특히 세로는 인덱싱이 좀 까다롭다.
때문에 세로를 미리 가로로 전환해주는게 편하다.
📚문제
"기러기" 또는 "level" 과 같이 거꾸로 읽어도 제대로 읽은 것과 같은 문장이나 낱말을 회문(回文, palindrome)이라 한다.
주어진 100x100 평면 글자판에서 가로, 세로를 모두 보아 가장 긴 회문의 길이를 구하는 문제이다.
위와 같은 글자 판이 주어졌을 때, 길이가 가장 긴 회문은 붉은색 테두리로 표시된 7칸짜리 회문이다.
예시의 경우 설명을 위해 글자판의 크기가 100 x 100이 아닌 8 x 8으로 주어졌음에 주의한다.
[제약사항]
각 칸의 들어가는 글자는 c언어 char type으로 주어지며 'A', 'B', 'C' 중 하나이다.
글자 판은 무조건 정사각형으로 주어진다.
ABA도 회문이며, ABBA도 회문이다. A또한 길이 1짜리 회문이다.
가로, 세로 각각에 대해서 직선으로만 판단한다. 즉, 아래 예에서 노란색 경로를 따라가면 길이 7짜리 회문이 되지만 직선이 아니기 때문에 인정되지 않는다.
[입력]
각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 번호가 주어지며, 바로 다음 줄에 테스트 케이스가 주어진다.
총 10개의 테스트케이스가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 찾은 회문의 길이를 출력한다.
'알고리즘 > 알고리즘_swea' 카테고리의 다른 글
[Python][SWEA] 1946. 간단한 압축 풀기 D2 (0) | 2024.05.05 |
---|---|
[Python][SWEA] 4615. 재미있는 오셀로 게임 D3 (0) | 2024.05.05 |
[Python][SWEA] 1860. 진기의 최고급 붕어빵 D3 (0) | 2024.05.05 |
[Python][SWEA] 1249. [S/W 문제해결 응용] 4일차 - 보급로 D4 (0) | 2024.05.05 |
[Python][SWEA] 2814. 최장 경로 D3 (0) | 2024.05.04 |