문제 상황
문자열 s, 인덱스 i, 문자 c가 주어졌을 때, s의 i번째 문자를 c로 교체하는 프로그램을 작성해야 한다고 가정해 보겠습니다.
그런데 파이썬에서 문자열은 불변(immutable) 자료형입니다. 따라서 s[i] = c처럼 인덱스로 직접 값을 할당하려 하면 아래와 같은 오류가 발생합니다.
[TypeError: 'str' object does not support item assignment]
예를 들어 입력이 s = "python", i = 3, c = 'P'라면, 기대되는 출력은 "pytPon"입니다.
해결 방법
문자열을 슬라이싱하여 두 부분으로 나눈 뒤, 교체할 문자를 사이에 끼워 다시 연결하는 방식으로 해결할 수 있습니다. 구체적인 단계는 다음과 같습니다.
- left : 인덱스 0부터 i 앞까지의 부분 문자열 (
s[:i]) - right : 인덱스 i+1부터 끝까지의 부분 문자열 (
s[i+1:]) - left + c + right : 세 부분을 순서대로 연결한 새 문자열을 반환
구현 예제
아래 코드를 통해 실제 동작을 확인해 보겠습니다.
def solve(s, i, c): left = s[:i] right = s[i+1:] return left + c + right s = "python" i = 3 c = 'P' print(solve(s, i, c))
입력
python, 3, 'P'
출력
pytPon
참고: 다른 접근 방법
문자열을 리스트로 변환한 뒤 해당 위치의 값을 수정하고, 다시 join()으로 합치는 방법도 널리 사용됩니다.
def solve(s, i, c):
chars = list(s)
chars[i] = c
return ''.join(chars)두 방법 모두 시간 복잡도는 O(n)으로 동일하지만, 슬라이싱 방식이 코드가 더 간결하고 파이썬다운 표현이라는 점에서 선호되는 편입니다. 어떤 방법을 선택하든 원본 문자열은 변경되지 않고 항상 새로운 문자열이 생성된다는 점을 기억해 두면 좋습니다.