문자열 s가 주어졌을 때, 모든 홀수 위치의 문자와 짝수 위치의 문자를 서로 교환해야 하는 문제를 생각해 봅시다. 최종적으로 우리는 문자들이 두 개씩 짝지어 교환된 s의 순열(permutation)을 얻게 됩니다.
예를 들어 입력이 s = "programming"이라면, 출력은 "rpgoarmmnig"가 됩니다.
즉, 각 인접한 두 문자('p'와 'r', 'o'와 'g', 'a'와 'r' 등)가 서로 자리를 바꾸는 방식입니다.
문제 해결 접근 방법
이 문제는 다음 단계를 따라 해결할 수 있습니다.
- 문자열
s를 문자들의 리스트로 변환합니다. - 인덱스 0부터 시작하여 2씩 증가시키며 리스트 끝까지 반복합니다.
- 각 반복에서 현재 문자
s[i]와 다음 문자s[i+1]의 위치를 서로 교환(swap)합니다. - 교환이 완료된 리스트의 문자들을 하나로 합쳐(join) 전체 문자열로 만든 후 반환합니다.
구현 예제
아래 구현 예제를 통해 더 잘 이해해 보겠습니다.
def solve(s):
s = list(s)
for i in range(0, len(s)-1, 2):
s[i], s[i+1] = s[i+1], s[i]
return ''.join(s)
s = "programming"
print(solve(s))입력
"programming"
출력
rpgoarmmnig
코드 설명
list(s)를 사용하면 문자열이 개별 문자의 리스트로 변환되어, 파이썬의 튜플 언패킹(tuple unpacking) 기법 s[i], s[i+1] = s[i+1], s[i]로 두 문자를 손쉽게 교환할 수 있습니다. 반복 범위를 range(0, len(s)-1, 2)로 지정하면 0, 2, 4... 번째 인덱스만 순회하므로 문자열 길이가 홀수일 경우 마지막 문자는 그대로 유지됩니다. 마지막에는 ''.join(s)으로 리스트를 다시 문자열로 결합하여 결과를 반환합니다.
이 알고리즘의 시간 복잡도는 O(n), 공간 복잡도 역시 O(n)으로, 문자열 길이에 비례하여 선형적으로 동작하기 때문에 매우 효율적입니다.