문자열이 주어졌을 때, 그 문자열의 양쪽 절반이 서로 동일한 문자 집합을 가지고 있는지 확인하는 것이 이번 포스팅의 목표입니다. 문제를 해결하는 기본 아이디어는 간단합니다. 먼저 문자열을 중간을 기준으로 둘로 나눈 뒤, 각 절반에 포함된 문자들의 종류와 빈도가 일치하는지 비교하면 됩니다.
만약 문자열의 길이가 홀수라면 정확히 반으로 나눌 수 없으므로, 가운데 문자 하나는 무시하고 나머지 좌우 부분만 비교합니다.
알고리즘
전체 로직은 다음 단계로 구성됩니다.
- 입력 받기: 대상 문자열을 입력받습니다.
- 문자열 분할: 문자열 길이에 따라 두 부분으로 나눕니다. 길이가 홀수인 경우 가운데 문자를 제외하고 분할합니다.
- Counter 변환: 파이썬의
collections.Counter를 사용해 각 절반을 딕셔너리 형태로 변환합니다. 이때 문자가 키(key)가 되고, 해당 문자의 등장 빈도가 값(value)이 됩니다. - 비교: == 연산자로 두 Counter 객체를 비교합니다. 먼저 양쪽의 키(문자 종류)가 같은지 확인하고, 그다음 각 키에 대응하는 값(빈도)까지 일치하는지 검사합니다. 두 조건이 모두 참이라면 양쪽 절반은 동일한 문자 집합을 가진 것입니다.
예제 코드
from collections import Counter
def check_halves(text):
length = len(text)
# 길이가 홀수면 가운데 문자를 건너뛰고 분할
if length % 2 != 0:
first_half = text[0:length // 2]
second_half = text[(length // 2) + 1:]
else:
first_half = text[0:length // 2]
second_half = text[length // 2:]
# 두 절반의 문자 빈도 사전을 비교
if Counter(first_half) == Counter(second_half):
print("양쪽 절반이 동일합니다")
else:
print("양쪽 절반이 동일하지 않습니다")
# 실행부
if __name__ == "__main__":
user_input = input("문자열을 입력하세요: ")
check_halves(user_input)실행 결과
짝수 길이 문자열 "abba"를 입력한 경우:
문자열을 입력하세요: abba 양쪽 절반이 동일합니다
앞 절반은 'a', 'b'로, 뒷 절반 역시 'b', 'a'로 구성되어 있으므로 문자 종류와 빈도가 모두 일치하여 "양쪽 절반이 동일합니다"가 출력됩니다.
홀수 길이 문자열의 경우도 살펴보겠습니다. "abcba"를 입력하면 가운데 문자 'c'는 무시되고 "ab"와 "ba"만 비교되므로 역시 동일하다는 결과가 출력됩니다.
핵심 포인트 정리
Counter는 문자별 등장 횟수를 자동으로 계산해 주므로, 순서에 상관없이 문자 집합과 빈도를 한 번에 비교할 수 있습니다.- 길이가 홀수인 문자열은 중앙 문자를 제외하고 비교한다는 점을 반드시 처리해야 합니다.
- 단순히
set()으로 비교하면 빈도 차이(예: "aab" vs "abb")를 놓칠 수 있으므로, 빈도까지 고려하려면 Counter 비교가 더 안전합니다.