문제
문자열을 뒤집는 함수를 작성하라. 입력값은 문자 배열이며, 리턴 없이 리스트 내부를 직접 조작하라.
예제 1
입력
["y", "o", "u", "n", "g"]
출력
["g", n", "u", "o", "y"]
먼저 투 포인터를 이용한 전통적인 방식으로 구현한 후, 파이썬의 기본 기능을 이용해서 다시 구현하도록 하겠습니다.
여기서 "리턴 없이 리스트 내부를 직접 조작하라"는 제약 사항은 문자열의 내부를 스왑하는 형태로 풀이하라는 의미입니다.
투 포인터를 이용한 배열 요소 스왑
배열의 인덱스를 가리키는 left, right 을 각각 초기화한 후, 각 배열의 원소를 변경해나가는 방식입니다.
def reverseString(s: list[str]) -> list[str] :
left, right = 0, len(s) - 1
while left < right:
(s[left], s[right]) = (s[right], s[left])
left += 1
right -= 1
return s
처음 공부했을 때 s[left]와 s[right], s[right], s[left]를 교환하는 부분이 이해가 되지 않았습니다. 위처럼 튜플 표시가 되어 있지 않았죠.
s[left], s[right] = s[right], s[left]
"s[left] = s[right]를 먼저 처리하는건가? 그럼 s[right]에 대입하는 s[left]의 값은? tmp로 임시 변수를 선언해줘야 하지 않을까?"
이는 파이썬 고급서를 보면서 알 수 있었습니다. 우측의 s[right], s[left]를 (s[right], s[left]) 튜플로 인식하여, 좌측으로 언패킹하는 것이었습니다. 모르면서 봤을 때 동시 대입처럼 보이기 때문에, 사용할 때는 괄호를 붙여서 코드의 가독성을 높일 필요가 있습니다.
파이썬의 기본 기능 reverse()
투 포인터 방식이 아닌 파이썬의 기본 기능을 이용하여 단 한줄로 구현할 수 있습니다.
def reverseString(s: list[str]) -> list[str] :
s.reverse()
return s
reverse() 함수는 리스트에만 제공되며, 문자열의 경우에는 이전 포스팅에서 보았듯이 문자열 슬라이싱을 사용할 수 있습니다. 물론 슬라이싱은 리스트에서도 사용할 수 있습니다. 다음과 같이 말이죠.
def reverseString(s: list[str]) -> list[str] :
s = s[::-1]
return s
하지만 가끔가다 공간 복잡도를 O(1)로 제한하는 문제가 있을 수 있습니다. 이러한 경우에는 다음과 같은 트릭을 사용해서 동작하게 할 수 있습니다 ><
s[:] = s[::-1]
'Computer Science > 알고리즘 - 문자열 처리' 카테고리의 다른 글
문자열에서 가장 흔한 단어(리스트 컴프리헨션, Counter 객체) (0) | 2023.01.21 |
---|---|
로그 파일 재정렬(lambda, + 연산자) (1) | 2023.01.21 |
팰린드롬 구별(Deque, Slicing) (0) | 2023.01.16 |