문제 소개
두 개의 문자열이 주어졌을 때, 각 문자열에 공통으로 포함되지 않은 문자만 골라 하나의 새로운 문자열로 합치는 것이 이번 튜토리얼의 목표입니다.
예를 들어 hafeez와 kareem이라는 두 문자열이 있다면, 최종적으로 생성되는 문자열은 hfzkrm입니다. h, f, z, k, r, m은 상대 문자열에는 존재하지 않는 고유한 문자들이기 때문입니다.
코드를 확인하기 전에 먼저 스스로 로직을 한번 생각해 보세요. 아이디어가 잘 떠오르지 않는다면 아래 단계를 따라가 보세요.
알고리즘
- 두 문자열을 초기화합니다.
- 결과를 담을 빈 문자열을 준비합니다.
- 첫 번째 문자열을 순회합니다.
3-1. 현재 문자가 두 번째 문자열에 있는지 확인합니다.
3-1-1. 없다면 결과 문자열에 해당 문자를 추가합니다. - 두 번째 문자열을 순회합니다.
4-1. 현재 문자가 첫 번째 문자열에 있는지 확인합니다.
4-1-1. 없다면 결과 문자열에 해당 문자를 추가합니다. - 최종 결과 문자열을 출력합니다.
구현 예제
## 문자열 초기화
string_1 = 'hafeez'
string_2 = 'kareem'
## 결과를 담을 빈 문자열 초기화
new_string = ''
## 첫 번째 문자열 순회
for char in string_1:
## 현재 문자가 string_2에 없는지 확인
if char not in string_2:
## 결과 문자열에 추가
new_string += char
## 두 번째 문자열 순회
for char in string_2:
## 현재 문자가 string_1에 없는지 확인
if char not in string_1:
## 결과 문자열에 추가
new_string += char
## 결과 출력
print(f'New String: {new_string}')
실행 결과
위 프로그램을 실행하면 다음과 같은 출력을 얻을 수 있습니다.
New String: hfzkrm
더 간결한 방법: 컴프리헨션 활용하기
동일한 로직은 리스트 컴프리헨션과 join()을 사용하면 한층 짧고 깔끔하게 표현할 수 있습니다.
string_1 = 'hafeez'
string_2 = 'kareem'
new_string = ''.join(c for c in string_1 if c not in string_2) + \
''.join(c for c in string_2 if c not in string_1)
print(f'New String: {new_string}') # hfzkrm
참고로 두 문자열을 각각 집합(set)으로 변환한 뒤 대칭 차집합 연산자 ^를 사용하면 중복 없는 문자들을 손쉽게 구할 수 있습니다. 다만 이 방식은 원본 문자열의 등장 순서가 유지되지 않으므로, 순서가 중요하다면 위의 방법을 사용하는 것이 좋습니다.
마무리
이번 글에서는 두 문자열에서 서로에게 없는 고유한 문자만 추출해 새로운 문자열을 만드는 방법을 알아보았습니다. 기본 반복문 방식과 컴프리헨션 방식 모두 시간 복잡도 관점에서 실용적이며, 작은 입력에서는 성능 차이가 거의 없으니 상황에 맞게 선택하시면 됩니다. 내용에 대해 궁금한 점이 있다면 댓글로 남겨주세요!