| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 제너릭메서드
- API명세서
- string메서드
- 파일사용권한
- 코딩테스트
- ChatGPT
- Java
- 네이티브애플리케이션
- SQL
- 자바
- 스레드동기화
- 99클럽
- SQ3R
- staging_area
- 날씨API
- API
- 동전교환알고리즘
- Spring
- 프로그래머스
- openapi
- 성장형마인드셋
- 프로젝트
- 참조변수타입변환
- 루트사용자
- 배열탐색
- 재귀적사고
- 향상된for문
- 4A피드백
- 스프링
- 백준
- Today
- Total
개발 공부용
팰린드롬 | 1216. [S/W 문제해결 기본] 3일차 - 회문2 본문
문제
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com

앞으로 읽거나 뒤로 읽어도 같은 글자를 회문, 팰린드롬이라고 한다.
주어진 100x100 평면 글자판에서 가로, 세로를 모두 보아 가장 긴 회문의 길이를 구하여라.
회문은 직선으로만 판단한다.
입력
- 총 10개의 테스트 케이스
- 첫 줄: 테스트 케이스 번호
- 다음 줄: 테스트 케이스
1
CCBBCBAABCCCBABCBCAAAACABBACCCCACAABCBBACACAACABCBCCB...
ACBAAAACCACCCBAACAAABACACCABCBCBABBBACBABCAACCBCCACBC...
CCCACCBCBACBACBCABAABABCCAAAACCCCCBBAABBCCBCCCABBACAC...
CABACBCBBCBABACABBBBBBABBCABCBCBCAABCBCCCBABACCCCABBA...
BCCBCCACCBCBCABBBCCABAACACCBCCCBCCACCBBCBCCCBBCCBACBC...
BBBBCBBAACABACCBCBCCABBBBCCAABCBBCACCBBCAAAABABABBABB...
ABBAACCCACBBABBABCCCABABCACABABACCCBACACABCBCCCBABCCC...
ABBBBAABCAACCBACBBAACACABCABACBAABCAABBCCCCCCACBCCCCA...
ACCACABABBACBBAACCBBACBBCCACCACCABCCBABABBBACBACBAABC...
BABACACCABCAACBAABCCACCACBCCAABBCBAABABAACAAAAAACCCBC...
...
2
...
출력
#{테스트 케이스 번호} {가장 긴 회문의 길이}
#1 18
#2 17
풀이
팰린드롬 문제를 풀 때는 중심 확장 방식이 가장 많이 사용된다.
중심 확장 방식은 홀수 팰린드롬이라고 가정할 때는 하나의 문자를 중심으로,
짝수 팰린드롬이라고 가정할 때는 두 개의 문자를 중심으로 잡고 좌우로 확장하는 방식이다.
물론 홀수 팰린드롬인지 짝수 팰린드롬인지는 미리 알 수 없으므로 두 방식 모두 검사해야 한다.
예를 들어 홀수 팰린드롬이라고 가정할 때 'CABAC'라는 문자열이 있다고 하자.
0번 인덱스의 'C'를 중심으로 잡는 것부터 시작하여 좌우를 확장하면서 가장 긴 팰린드롬을 찾는다.
0: 'C'에서 좌로 확장 불가하므로 팰린드롬의 길이는 1
1: 'A'에서 좌우로 확장했을 때 'C'와 'B'로 두 문자가 동일하지 않다.
팰린드롬의 길이는 1
2: 'B'에서 좌우로 확장했을 때 'A'와 'A'로 동일.
한 번 더 확장했을 때 'C'와 'C'로 동일.
더 이상 좌우로 확장이 불가하다. 팰린드롬의 길이는 5
3: 'A'에서 좌우로 확장했을 때 'B'와 'C'로 두 문자가 동일하지 않다.
팰린드롬의 길이는 1
4: 'C'에서 우로 확장이 불가하므로 팰린드롬의 길이는 1
위와 같이 중심 문자로부터
1) 좌우로 확장이 가능한지
2) 확장했을 때 두 문자가 같은지
확인하며 가장 긴 팰린드롬의 길이를 찾을 수 있다.
짝수 팰린드롬이라고 가정할 때 'ABBA'라는 문자열이 있다고 하자.
0번 인덱스의 'A'와 1번 인덱스의 'B'를 중심으로 잡고 두 문자를 비교하는 것부터 시작하며 좌우로 확장하여 가장 긴 팰린드롬을 찾는다.
0, 1: 0번 인덱스의 'A'와 1번 인덱스의 'B'가 같지 않다. 팰린드롬의 길이는 1
1, 2: 1번 인덱스의 'B'와 2번 인덱스의 'B'가 같다.
좌우로 확장했을 때 0번 인덱스의 'A'와 3번 인덱스의 'A'가 같다.
더 이상 좌우로 확장이 불가하다. 팰린드롬의 길이는 4
2, 3: 2번 인덱스의 'B'와 3번 인덱스의 'C'가 같지 않다. 팰린드롬의 길이는 1
위와 같이 두 중심 문자로부터
1) 두 중심 문자가 같은지
2) 좌우로 확장 가능한지
3) 확장했을 때 두 문자가 같은지
확인하며 가장 긴 팰린드롬의 길이를 찾을 수 있다.
def expand(left, right, s):
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1
for _ in range(10):
test_num = int(input().strip())
test_case = [input().strip() for _ in range(100)]
#세로 문자열 만들기
test_case_cols = [''.join(test_case[r][c] for r in range(100)) for c in range(100)]
result = 1
for text in test_case + test_case_cols:
for j in range(100):
expanded_result_1 = expand(j, j, text)
expanded_result_2 = expand(j, j+1, text)
result = max(expanded_result_1, expanded_result_2, result)
print(f"#{test_num} {result}")
이 문제의 경우 세로 문자열이 팰린드롬인지도 확인해야 한다.
입력받은 100x100의 문자를 재구성하여 세로 문자열을 만들어주고, 해당 문자열을 검사하는 방식으로 진행한다.
'코딩 테스트' 카테고리의 다른 글
| 문자열 | 1213. [S/W 문제해결 기본] 3일차 - String (1) | 2025.11.21 |
|---|---|
| 재귀 | 1217. [S/W 문제해결 기본] 4일차 - 거듭 제곱 (0) | 2025.11.17 |
| 카운팅 정렬 | 1221. [S/W 문제해결 기본] 5일차 - GNS (0) | 2025.11.13 |
| 1220. [S/W 문제해결 기본] 5일차 - Magnetic (0) | 2025.11.13 |
| 큐 | 1225. [S/W 문제해결 기본] 7일차 - 암호생성기 (0) | 2025.11.10 |