알고리즘 공부/파이썬 알고리즘 인터뷰

파이썬 알고리즘 인터뷰 - 문자열 조작

환성 2022. 1. 30. 11:56
728x90

문자열 슬라이싱

  • 문자열 슬라이싱은 편리한 기능 제공과 동시에 내부에서 매우 빠르게 수행된다.
  • 위치를 지정하면 해당 위치의 배열 포인터를 얻게 되며 이를 통해 연결된 객체를 찾아 실제 값을 찾아낸다.
  • 문자열을 별도로 리스트로 매핑하는 등의 처리는 데이터 구조에는 좋은 방법이지만, 별도 자료형으로 매핑하는 과정에서 상당한 연산 비용이 필요하므로 전체적인 속도에서 손해를 보게 된다.
알고리즘 실행 시간 슬라이싱을 1로 했을 때의 비율
슬라이싱 0.499μs 1
리스트 reverse() 2.46μs 5
reversed() + join() 2.49μs 6
for 반복 5.5μs 12
while 반복 9.4μs 21
재귀 24.3μs 24

슬라이싱을 기준으로 한 파이썬 문자열 처리 실행시간(μs는 마이크로 초를 의미)

 

슬라이싱 활용 방법

예시) 감사합니다 라는 문자열을 통해 확인

  0    1     2    3     4

 감   사    합   니   다 

 -5   -4    -3    2   -1

 

S[1:4] == 사합니 : 인덱스 1에서 4 이전까지 표현, 실질적으로 1에서 3까지만 해당한다

S[1:-2] == 사합 : 인덱스 1에서 -2 이전(-2 포함 x)까지 표현한다.

S[1:] == 사합니다 : 문자열의 시작 또는 끝은 생략이 가능하다

S[:] == 감사합니다 :  둘 다 생략하면 사본을 리턴한다. 파이썬은 a = b와 같은 형태로 할당하면 변수의 값이 할당되는 것이 아니라 a 변수가 b 변수를 참조하는 형태가 된다. 참조가 아닌 값을 복사하기 위해 [:]를 사용할 수 있으며, 이 방식은 문자열이나 리스트를 복사하는 파이썬다운 방식이기도 하다.

S[1:100] == 사합니다 : 인덱스가 범위보다 초과 할 경우, 문자열의 최대 길이만큼 표현된다.

S[-1] == 다 : 마지막 문자(뒤에서 첫 번째)

S[-4] == 사 : 뒤에서 4번째

S[:-3] == 감사 : 뒤에서 3개 글자 앞까지

S[-3:] == 합니다 : 뒤에서 3번째 문자에서 마지막까지

S[::1] == 감사합니다 : 1은 기본값으로 동일하다

S[::-1] == 다니합사감 : 뒤집는다(reverse)

S[::2] == 감합다 : 2칸씩 앞으로 이동한다

 

람다 표현식

  • 식별자 없이 실행 가능한 함수를 말하며, 함수 선언 없이도 하나의 식으로 함수를 단순하게 표현할 수 있다.

예시로 s.sort(key = lambda x: (x.split()[1], x.split()[0]))

만약 s가 ['2 A', '1 B', '4 C', '1 A']라면 sorted()로 정렬한 결과는 다음과 같다.

 

sorted(s) => ['1 A', '1 B', '2 A', '4 C']

그러나 이런 방식이 아닌 그 뒤의 문자 순 정렬을 원할떄 , 문자가 동일한 경우에는 그 앞 번호순으로 정렬되는 형태를 희망한다. 이떄 리스트의 각 요소를 풀어서 별도 처리를 해줘야 하는데, 이럴 떄 람다 표현식이 사용 가능하다. 만약 람다를 사용하지 않고 함수를 사용하면 다음과 같이 된다.

 

def func(x):
	return x.split()[1], x.split()[0]
...
...
s.sort(key = func)
s
# ['1 A', '2 A', '1 B', '4 C']

하지만 람다 표현식을 사용하면, 다음과 같이 별도 함수를 선언하지 않고도 간단한 함수를 선언한 것 처럼 쉽게 처리할 수 있다.

s.sort(key = lambda x: (x.split()[1], x.split()[0]))
s
# ['1 A', '2 A', '1 B', '4 C']