파이썬에서 주어진 문자열이 회문(palindrome)인지 아니면 대칭(symmetric)인지 확인해야 하는 경우가 있습니다. 이때 각각의 검사를 수행하는 함수를 직접 정의하고, 'while' 반복문과 조건문을 활용하면 손쉽게 해결할 수 있습니다.
먼저 두 개념을 간단히 정리하면 다음과 같습니다.
- 회문(Palindrome): 왼쪽에서 오른쪽으로 읽어도, 오른쪽에서 왼쪽으로 읽어도 동일한 문자열 또는 숫자를 의미합니다. 즉, 앞뒤가 서로 대칭되는 위치의 인덱스 값이 같습니다. 예를 들어 'madam', 'level' 등이 있습니다.
- 대칭(Symmetric): 문자열을 절반으로 나누었을 때 앞부분과 뒷부분이 완전히 같은 경우를 말합니다. 예를 들어 'abcabc'처럼 두 번째 절반이 첫 번째 절반과 동일한 문자열입니다.
예제 코드
아래는 회문 여부와 대칭 여부를 각각 검사하는 파이썬 프로그램의 전체 예제입니다.
def check_palindrome(my_str):
mid_val = (len(my_str) - 1) // 2
start = 0
end = len(my_str) - 1
flag = 0
while (start < mid_val):
if my_str[start] == my_str[end]:
start += 1
end -= 1
else:
flag = 1
break
if flag == 0:
print("입력한 문자열은 회문입니다")
else:
print("입력한 문자열은 회문이 아닙니다")
def check_symmetry(my_str):
n = len(my_str)
flag = 0
if n % 2:
mid_val = n // 2 + 1
else:
mid_val = n // 2
start_1 = 0
start_2 = mid_val
while (start_1 < mid_val and start_2 < n):
if my_str[start_1] == my_str[start_2]:
start_1 += 1
start_2 += 1
else:
flag = 1
break
if flag == 0:
print("입력한 문자열은 대칭입니다")
else:
print("입력한 문자열은 대칭이 아닙니다")
my_string = 'phphhphp'
print("회문 검사 메서드를 호출합니다...")
check_palindrome(my_string)
print("대칭 검사 메서드를 호출합니다...")
check_symmetry(my_string)실행 결과
회문 검사 메서드를 호출합니다... 입력한 문자열은 회문입니다 대칭 검사 메서드를 호출합니다... 입력한 문자열은 대칭이 아닙니다
코드 설명
1. 회문 검사 함수 (check_palindrome)
- 'check_palindrome'이라는 이름의 함수를 정의하고, 매개변수로 문자열을 전달받습니다.
- 문자열 길이에 2를 나눈 몫(정수 나눗셈)으로 중간 지점 값을 계산합니다.
- 시작 인덱스(start)는 0으로, 끝 인덱스(end)는 마지막 요소의 위치로 초기화합니다.
- 검사 결과를 저장할 변수 flag를 0으로 설정합니다.
- 'while' 반복문 안에서 시작 위치와 끝 위치의 문자가 서로 같으면 start는 1씩 증가하고, end는 1씩 감소시키며 양쪽에서 가운데로 이동합니다.
- 두 문자가 다르면 flag를 1로 바꾸고 'break'로 반복문을 탈출합니다.
- 반복문이 끝난 후 flag가 0이면 모든 비교에 통과했다는 뜻이므로 회문이고, 그렇지 않으면 회문이 아닙니다.
2. 대칭 검사 함수 (check_symmetry)
- 'check_symmetry'라는 이름의 함수를 정의하고, 마찬가지로 문자열을 매개변수로 받습니다.
- 문자열의 길이를 변수에 저장합니다.
- 길이를 2로 나눈 나머지가 0이 아니면(홀수 길이) 중간 지점 계산 방식을 조정합니다.
- 앞부분의 시작 인덱스(start_1)는 0으로, 뒷부분의 시작 인덱스(start_2)는 중간 지점으로 설정합니다.
- 'while' 반복문을 사용해 앞부분 문자와 뒷부분 문자를 순서대로 비교하며, 같으면 두 인덱스를 함께 증가시킵니다.
- 비교 중 하나라도 다르면 flag를 1로 설정하고 반복문을 종료합니다.
- flag가 0이면 문자열의 앞부분과 뒷부분이 완전히 일치한다는 의미이므로 대칭이고, 그렇지 않으면 대칭이 아닙니다.
참고: 슬라이싱을 활용한 더 간단한 방법
파이썬에서는 슬라이싱(slicing) 기능을 사용하면 회문 검사를 훨씬 간결하게 구현할 수 있습니다.
my_string = 'phphhphp'
if my_string == my_string[::-1]:
print("입력한 문자열은 회문입니다")
else:
print("입력한 문자열은 회문이 아닙니다")여기서 my_string[::-1]은 문자열을 거꾸로 뒤집은 새 문자열을 반환합니다. 원본 문자열과 뒤집은 문자열이 같다면 그 문자열은 곧 회문입니다. 다만 대칭 검사는 문자열을 절반으로 나누어 비교해야 하므로, 위 예제처럼 인덱스를 활용한 방식이 적합합니다.