문제 :
문제는 쉽고 간단하지만 내 소스 코드에 등장한 문자열 슬라이싱을 복습 하고자 포스팅을 써 본다. 문제는 입력값으로 sentence라는 문장이 주어지고, 또 다른 입력값으로 searchWord가 주어진다. 이때, 공백을 기준으로 문자열을 나누어 나누어진 문자의 접두사가 searchWord를 포함하면 그 단어가 있는 인덱스를 리턴하라.(단, 여기서는 인덱스가 1부터 시작한다고 가정한다)
아래는 내가 제출해 통과한 코드이다.
class Solution:
def isPrefixOfWord(self, sentence: str, searchWord: str) -> int:
sentence_arr = sentence.split()
for i in range(len(sentence_arr)):
if sentence_arr[i][:len(searchWord)] == searchWord:
return i + 1
return -1
- 우선, sentence_arr 변수에 입력값으로 주어진 문자열을 공백을 기준으로 나누어 리스트에 담아준다. 예를 들어, 첫번째 예시에서는
sentence_arr = ['i', 'love', 'eating', 'burger']이 담길 것이다.
- 이제, for문을 돌며 sentence_arr의 요소들을 하나씩 검색한다.
여기서 sentence_arr[i][:len(searchWord)]는 현재 검사중인(sentence_arr[i]) 요소의 맨 처음 요소부터 searchWord의 길이까지 슬라이싱을 하여 주어진 입력값과 비교한다. 만약, 일치한다면 현재 인덱스 + 1을 리턴하고, 아니면 -1을 리턴한다. 예를 들어, 'burger'를 검사할때 슬라이싱을 이용하면 burg == burg같은 형태로 비교되어 참으로 간주되어 인덱스를 리턴 할것이다.
- 여기서 헷갈렸던 점은 슬라이싱을 할때, 마지막 슬라이싱 범위는 포함되지 않는다. 예를 들어, s = "Hello, World!"이고, print(s[:3])을 한다면 문자열 s의 처음부터 2번째 인덱스까지(0, 1, 2)를 포함시켜 'Hel'이라는 문자열이 출력된다.
🔉 아래는 GPT에게 최적화를 부탁한 내용이다.
주어진 코드를 최적화하고 간결하게 만들 수 있습니다. 먼저, `split()` 메서드를 사용하여 문장을 단어로 분리하고, 각 단어가 `searchWord`로 시작하는지 확인하는 과정은 적절하지만, 인덱스를 직접 사용하는 대신 `enumerate`를 사용하면 코드가 더 간결해질 수 있습니다.
최적화된 코드는 다음과 같습니다:
class Solution:
def isPrefixOfWord(self, sentence: str, searchWord: str) -> int:
for i, word in enumerate(sentence.split(), start=1):
if word.startswith(searchWord):
return i
return -1
변경된 부분:
1. `enumerate(sentence.split(), start=1)`을 사용하여 인덱스를 직접 관리하지 않고, 인덱스와 단어를 동시에 얻습니다. 여기서 `start=1`로 설정하여 인덱스가 1부터 시작하게 합니다.
2. `startswith` 메서드를 사용하여 단어가 `searchWord`로 시작하는지 확인합니다. 이는 부분 문자열 비교보다 더 명확하고 효율적입니다.
그렇다. 파이썬에서는 startsWith라는 메서드를 쓸 수 있고, 이 메서드는 어떠한 문장이 파라미터로 주어진 문자열로 시작하는지 확인 하는 메서드이다.
또한, enumerate도 내가 계속 이용하던건데, 이것도 까먹지 말자. 이걸 사용하면 리스트를 순회할때 리스트의 요소, 인덱스를 동시에 가져와 비교 할 수 있다. 또한, 이번 문제와 같이 (인덱스는 1부터 시작한다고 가정) 시작 인덱스가 0이 아니라 특정 인덱스부터 시작한다면, enumerate의 두번째 파라미터로 start = 1로 지정해주면 된다.
'CodingTest > Leetcode' 카테고리의 다른 글
[LeetCode] 2441. Largest Positive Integer That Exists With Its Negative (0) | 2024.08.02 |
---|---|
[LeetCode] 2000. Reverse Prefix of Word (0) | 2024.07.26 |
[LeetCode] 922. Sort Array By Parity II (0) | 2024.07.17 |
[LeetCode] 876. Middle of the Linked List (0) | 2024.07.17 |
[LeetCode] 832. Flipping an Image (0) | 2024.07.12 |