알고리즘 문제 풀이

[알고리즘 문제 풀이] 문자열 뒤집기

sungw00 2022. 8. 12. 16:09
728x90

문제

문자열을 뒤집는 함수를 작성하라. 입력값은 문자 배열이며, 리턴 없이 리스트 내부를 직접 조작하라.

예제1

입력

["h", "e", "l", "l", "o"]

출력

["o", "l", "l", "e", "h"]

예제2

입력

["H", "a", "n", "n", "a", "h"]

출력

["h", "a", "n", "n", "a", "H"]

풀이1 투 포인터를 이용한 전통적인 방식의 풀이

투 포인터에 대해서 간단히 설명하자면, 단어 그대로 2개의 포인터를 이용해 범위를 조정해가며 풀이하는 방식을 말한다. 여기서는 점점 더 범위를 좁혀 가며 스왑하는 형태로 풀이할 수 있다. 문제에서 '리턴 없이 리스트 내부를 직접 조작하라'는 제약 사항이 있으므로 다음과 같이 문자열 strs 내부를 스왑하는 형태로 풀이하면 된다.

전체 코드는 다음과 같다.

def solution(strs: list[str]) -> None:
    left, right = 0, len(strs) - 1
    while left < right:
        strs[left], strs[right] = strs[right], strs[left]
        left += 1
        right -= 1
    print(strs)

solution(list(input("문자열 입력: ")))

풀이2 파이썬다운 방식인 기본 내장 함수를 이용한 풀이

여기서 사용한 함수는 reverse( ), reversed( ), 문자열 슬라이싱인데 그 중 reverse( )는 리스트에만 제공된다. 만약 입력값이 문자열이라면 앞서 살펴본 바와 같이 문자열 슬라이싱을 사용할 수 있다. 슬라이싱은 리스트에도 사용할 수 있으며, 성능 또한 매우 좋다.

def solution(strs: list[str]) -> None:
    s = []
    # strs = list(reversed(strs)) # reversed() 함수를 사용
    # strs.reverse()  # reverse() 함수를 사용
    s[:] = strs[::-1] # 문자열 슬라이싱 사용
    print(s)

solution(list(input("문자열 입력: ")))

알게된 점

투 포인터를 이용하여 문자열을 스왑하는 방식

reverse( ) 함수와 reversed( ) 함수의 사용 방법

문자열 슬라이싱의 트릭(s[:]와 s)

 

공부할 것

투 포인터를 이용한 문제 풀어보기

728x90