[PAI] 6장 문자열 조작

임재영·2022년 1월 17일
0
post-thumbnail

LeetCode #125. Valid Palindrome

LeetCode #344. Reverse String

[Topic 1] 두 변수의 값 바꾸기

타 언어의 경우는 임시 변수(temp)를 사용해서 값을 바꾸는데, Python 은 매우 편리한 기능을 가지고 있다.

a = 3
b = 7

a,b = b,a    # 이렇게만 써도 SWAP이 되다니

이제 리스트(배열) 내 원소 값을 바꾸고 싶을 때를 살펴보자.

Python 에서는 객체에 대한 참조로 구현되어 있기 때문에 주소 값이 저장되어있다.
반면 C 언어는 배열 안에 실제 원소 값이 저장되어 있다.

void SWAP(int* a, int* b) {  // Parameter Type : Pointer
    temp = a;
    a = b;
    b = temp;
}

int main(void) {
    int arr[2];
    arr[0] = 100; arr[1] = 200;
    SWAP(&arr[0], &arr[1]);  // Argument Type : Address
}

따라서 C 언어 배열 내 원소 값을 바꾸고 싶다면 주소 값(Address)을 전달인자(Argument)로 넘겨,
SWAP 함수에서 포인터(Pointer)로 매개변수(Parameter)를 받아야 해서 번거로웠다.

하지만 파이썬 리스트는 엄청 간단했다.

list = [1, 2]
list[0], list[1] = list[1], list[0]

줄곧 C 언어만 사용해 왔던 나는, 매우 충격이었다… 🥺

[Topic 2] 문자열 반전시키기

대체로 더블 포인터를 사용할 것이라고 생각된다.
하지만 Python 은 이미 준비된 다양한 방법들이 존재한다.

1. (리스트의 경우) reverse

str = “hello”
str_list = list(str)  # [‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
str_list.reverse()  # [‘o’, ‘l’, ‘l’, ‘e’, ‘h’]

print(‘’.join(str_list))
# 문자열로 출력하고 싶을 시, 분리된 원소를 다시 join 하는 것까지 필요

2. (문자열의 경우) reversed

str = “hello”
reversed(str)  # <reversed object at 0xf769>

print(‘’.join(reversed(str))) 
# reversed 객체를 반환하기 때문에, join 함수로 다시 문자열로 바꿔주자

3. (문자열의 경우) Slicing

str = “hello”
print(str[::-1])  # olleh
print(str[::-2])  # olh

필자가 자주 쓰던 C 언어와는 차원이 다른 문자열 활용성을 보여준다.
괜히 코딩 테스트에서 많이 사용하는 언어가 아니다… 🤓

LeetCode #937. Reorder Log Files

[Topic 1] isdigit( ) 함수의 숨겨진 속임수

함수 이름True 반환False 반환
isdigit( )숫자숫자 외 혹은 공백 및 기호
isalpha( )알파벳(혹은 한글)알파벳(한글) 외 혹은 공백 및 기호
isalnum( )숫자 + 알파벳(혹은 한글)숫자 + 알파벳(한글) 외 혹은 공백 및 기호

그렇다면 다음 코드의 결과는 어떻게 될까?

str = “Hello World”
print(str.isalpha())  # False

phone_num = “010-1212-3939”
print(phone_num.isdigit())  # False

공백 및 기호는 위 함수들이 False를 반환한다는 사실! 🧐

[Topic 2] 리스트 정렬하기

리스트를 정렬하고 싶다면 두 가지 방법이 존재한다.

1. sort

A1 = [7, 8, 5, 1, 2]
print(A1)  # [7, 8, 5, 1, 2]

A2 = A1.sort()
print(A1)  # [1, 2, 5, 7, 8] (원본 변경)
print(A2)  # 존재하지 않음

2. sorted

A1 = [7, 8, 5, 1, 2]
print(A1)  # [7, 8, 5, 1, 2]

A2 = sorted(A1)
print(A1)  # [7, 8, 5, 1, 2] (원본 유지)
print(A2)  # [1, 2, 5, 7, 8] (정렬된 값을 반환)

두 함수의 차이가 보이는가?
sort 함수는 원본 상태의 리스트를 정렬된 상태로 변경하는 것이고,
sorted 함수는 정렬된 리스트를 생성하여 반환하는 것이다.

위에 #344. Reverse Sting 문제에서 살펴본 reverse와 reversed 함수도 똑같은 원리가 적용된다!

## 1. reverse
A = [1, 3, 5, 7, 9]
A.reverse()  # [9, 7, 5, 3, 1]

## 2. reversed
A = [1, 3, 5, 7, 9]
list(reversed(A))  # [9, 7, 5, 3, 1]

reverse 함수는 원본 상태의 리스트를 거꾸로 뒤집고,
reversed 함수는 거꾸로 뒤집은 상태를 반환 해주기는 하지만 리스트 자체를 반환해주는 것이 아니고,
객체를 반환하기 때문에 (문자열의 경우 join 함수를 사용) 리스트의 경우 리스트의 형태로 다시 한 번 더 변형이 필요하다. 😟

[Topic 3] 문자열을 다루는 기술

예시로, “let2 own kit dig” 라는 문자열을 가지고 놀아보자!

1. 문자열 나누기 : split

str = “let2 kit own dog”
str.split()  # [‘let2’, ‘kit’, ‘own’, ‘dog’]

str2 = “let2_kit_own_dog”
str2.split(‘_’)  # [‘let2’, ‘kit’, ‘own’, ‘dog’]

split( ) 함수 내에 아무 값도 삽입하지 않으면, 공백을 기준으로 나누어진다.

2. 문자열 자르기 : slicing

str.split()[1:]  # [‘kit’, ‘own’, ‘dog’]

str2.split()[::-1]  # [‘dog’, ‘own’, ‘kit’]

split( ) 함수를 통해서 나누어진 값은 리스트에 저장되기 때문에, 이를 슬라이싱 할 수 있다.

3. 문자열 삽입하기 : join

‘’.join(str.split()[1:])  # “kit own dog”

str3 = “abcde”
‘,’.join(str3)  # a,b,c,d,e

문자열 각각의 문자 사이 혹은 리스트 내 원소들 사이에 특정 값을 삽입하는데,
아무 값도 넣지 않는다면 합치는 것과 다름없지 않은가! 😜

profile
매일매일 발전하는 사람이 되자!

0개의 댓글