코딩 테스트 문제를 풀다보면 문자열을 거꾸로 뒤집어야 하는 상황이 올 때가 있다.
주로 사용되는 방법이 reversed() 함수 또는 슬라이싱 기법 [::-1]이 있다.
두 방식의 원리를 알아보고 구현하고 비교해봤다.
reversed() 함수는 이터러블(Iterable) 객체를 역순으로 순회하는 이터레이터(Iterator)를 반환한다.
원본 리스트를 변경하지 않고 역순으로 순회하면서 반환하는 원리이다.
array = [1, 2, 3, 4, 5]
print(array)
# reversed() 적용
array = reversed(array)
for element in array:
print(element)
결과 >>
[1, 2, 3, 4, 5]
5
4
3
2
1
리스트를 처음부터 끝까지 전체를 간격만큼 -1 방향으로 잘라내는 방식이다.
원본 리스트를 변경하지 않고 뒤집힌 새로운 리스트를 만들어 반환한다.
array = [1, 2, 3, 4, 5]
for element in array[::-1]:
print(element)
결과 >>
5
4
3
2
1
✔️ 가장 큰 차이점은 reversed()는 원본 리스트를 순회하면서 이터레이터를 반환하고,
슬라이싱 기법은 기존 리스트의 원소값을 모두 복사하여 뒤집힌 새로운 리스트를 생성하는 것이다.
reversed() 기법은 슬라이싱 기법과 다르게 복사하여 새로운 리스트를 만드는 것이 아니기 때문에 더 나은 성능을 발휘할 수 있다.
만약 데이터의 복사본을 저장하여 계속 활용하여야 한다면 그때는 슬라이싱 기법을 사용하는게 좋을 수 있다.
걸리는 시간에는 어떠한 차이가 있을 지 reversed()와 슬라이싱 기법을 사용하여 비교해봤다.
import time
array = [i for i in range(100000000)]
start = time.time()
array[::-1]
end = time.time()
print("[::-1] 소요 시간 :", end-start)
start = time.time()
reversed(array)
end = time.time()
print("reversed() 소요 시간 :", end-start)
결과 >>
[::-1] 소요 시간 : 0.6255691051483154
reversed() 소요 시간 : 0.0
압도적으로 reversed() 방식이 빠른 것을 알 수 있다.
대량의 데이터를 활용하는 경우거나 거꾸로 바꿔 활용할 일이 많은 경우 등 상황에 따라서 맞게 활용하면 되겠다.