[LeetCode] 2000. Reverse Prefix of Word
문제 :
웬만한 기업의 코딩 테스트로 나오기엔 난이도가 낮은 너무 문제이지만 문제를 풀다가 내가 까먹고 있던 부분을 발견하여 다시 한번 기억하고자 포스팅을 한다.
문제는 간단하다. 입력값으로 문자열(word), 문자(ch)가 주어지고, 주어진 문자열에서 ch가 나타나는 위치까지만 문자를 뒤집어 리턴하면 된다. 만약, 문자열 안에 ch가 없다면, 그냥 원본 문자열을 리턴하면 된다.
아래는 내가 제출해 통과한 코드이다.
class Solution:
def reversePrefix(self, word: str, ch: str) -> str:
if ch in word:
reversed_str = word[: word.index(ch) + 1][::-1]
res = reversed_str + word[word.index(ch) + 1:]
return res
else:
return word
여기서 더 효율적으로 코드를 작성 할 수 있는 방법은
- 먼저, find 메서드는 파이썬에서 문자열(string) 객체에 대해 사용되는 메서드로, 특정 문자가 문자열 내에서 처음으로 나타나는 위치(인덱스)를 반환한다. 이 메서드는 찾는 문자가 문자열 내에 없으면 -1을 반환한다.
class Solution:
def reversePrefix(self, word: str, ch: str) -> str:
index = word.find(ch)
if index != -1:
return word[:index+1][::-1] + word[index+1:]
return word
위와 같이 find를 통해 발생하는 인덱스를 미리 저장해놓는다. 나는 .index()메서드만 알고 있었기 때문에(.index()는 존재하지 않으면 예외를 발생시킴) 인덱스를 미리 저장 할 생각을 하지 못했다.
- 인덱스가 존재하지 않는다면 -1을 반환하는데, -1이 아니라면(찾고자 하는 단어가 문자열 안에 존재한다면), 문자열 슬라이싱을 이용해 문자를 합쳐준다.
파이썬에서 문자열은 불변(immutable) 객체이다. 이는 한 번 생성된 문자열 객체는 변경될 수 없다는 것을 의미한다. 따라서 `word[:index+1][::-1] + word[index+1:]`와 같은 표현은 실제로 기존 문자열을 변경하는 것이 아니라, 새로운 문자열을 생성하는 것이다.
return word[:index+1][::-1] + word[index+1:]
1. `word[:index+1]`: 문자열 `word`의 처음부터 `index+1` 위치까지의 부분 문자열을 추출한다.
2. `[:: -1]`: 추출한 부분 문자열을 뒤집는다.
3. `word[index+1:]`: `index+1` 위치부터 끝까지의 부분 문자열을 추출한다.
4. `+`: 뒤집어진 부분 문자열과 원래 문자열의 남은 부분을 결합하여 새로운 문자열을 생성한다.
이 과정에서 `word` 자체는 전혀 변경되지 않고, 대신 `word`로부터 새로운 문자열이 생성된다. 따라서 원래의 문자열 `word`는 여전히 불변이며, 새로운 문자열을 반환하는 것이다.
word = "abcdef"
index = 2 # 'c'의 위치
# word[:index+1]는 "abc"를 반환하고, 이를 뒤집으면 "cba"가 된다.
# word[index+1:]는 "def"를 반환한다.
# 이를 결합하면 "cbadef"가 된다.
new_word = word[:index+1][::-1] + word[index+1:]
print(new_word) # 출력: "cbadef"
print(word) # 출력: "abcdef", 원래의 문자열은 변경되지 않음
따라서 이 코드는 원래 문자열 `word`를 변경하지 않고 새로운 문자열을 생성하여 반환한다.