Learn to share,Share to learn
유용한 함수들 총정리 본문
누구나 시험직전 자기만의 필살노트를 작성한다. 평소에 열심히 하다 요것만 한번 흝어보면 깔끔하게 정리하고 시험볼수있는 노트. 오늘은 그런것 한번 정리해보려한다.
문자열 처리
- startswith(substring): 문자열이 특정 문자 또는 문자열로 시작하는지 확인한다.
- endswith(substring): 문자열이 특정 문자 또는 문자열로 끝나는지 확인한다.
- split(delimiter): 문자열을 특정 구분자로 나누어 리스트로 반환한다. 의외로 문자열에서 유용할때가 많은데, 크로아티아 알파벳같은 문제에서 유용하게 사용했다. https://www.acmicpc.net/problem/2941
2941번: 크로아티아 알파벳
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=
www.acmicpc.net
- join(iterable): 주어진 문자열들을 연결하여 새로운 문자열을 생성한다. 이건 기본중의 기본이지만 가끔 잊곤하는게, join은 문자열이 와야지 숫자가 오면 안되므로, 정수를 join하고싶으면 map을 이용해서 문자열로 바꾸고 join을 사용해야 한다.
리스트와 배열 처리
- bisect.insort_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x를 삽입한다. 이게 아주 유용하다. biscect는 이진탐색을 공부하면서 조금 알게됐는데, 이진탐색을 모르더라도 정렬된 리스트에 요소 삽입을 할수있다는것은 강력한 툴이다.
- sorted(iterable): 주어진 반복 가능한 객체를 정렬하여 새 리스트를 반환한다. 아래와는 달리 새 리스트를 반환하는게 중요
- list.sort(): 리스트 자체를 정렬한다. 반환값은 없다. 뭐 기본이다. 알아둘만한점은 최악의 상황에선 시간복잡도가 n log n이라는 점 정도?
수학 및 통계
- math.gcd(a, b): 두 숫자의 최대공약수를 반환한다.
- math.sqrt(x): 숫자의 제곱근을 반환한다. 범위 지정할때 제곱근까지만 돌아도 충분한 경우가 있어 나름 자주쓴다
조합론 및 순열
- itertools.permutations(iterable, r): 주어진 반복 가능한 객체에서 요소 r개를 선택하여 만들 수 있는 모든 순열을 반환한다. 이건 정말 시간복잡도는 영 아닌데 어떻게든 브루트포스로 풀때 아주아주 유용하다. 대신 시간복잡도는.. O(n!/(n−r)!) 인데 입력크기가 크면 곧바로 터져버린다.
- itertools.combinations(iterable, r): 주어진 반복 가능한 객체에서 요소 r개를 선택하여 만들 수 있는 모든 조합을 반환한다. 이건 조합이라 순서를 신경쓰지 않는것이다. (1,2) 나 (2,1)이나 같은것! 얘도 금방 터진다.
- itertools.combinations_with_replacement(iterable, r): 중복을 허용하여 조합을 생성한다.
- itertools.product(iterable, repeat=1): 중복을 허락하여 순열을 생성한다.
집합과 맵
- set(): 집합을 생성하는데, 중복된 요소를 제거할 때 유용하다. 이뿐만 아니라 만약 리스트안에 특정값이 있는지 판별할때, 리스트를 집합으로 만들고 검사하면 훨씬 빠른 시간복잡도를 갖는다. 이건 set이 해시테이블 기반으로 구현되어있기 때문이다.리스트에서라면 시간복잡도가 N이라면, set은 O(1)이라는점!(일반적으로)
- dict() / {}: 딕셔너리를 생성한다. 키-값 쌍을 저장할 때 사용된다. 이와 관련된 함수들을 알아보자.
- dict.get(key[, default]): 주어진 키에 대한 값을 반환한다. 키가 딕셔너리에 없는 경우, None을 반환하거나, default 값이 주어진 경우 그 값을 반환한다.
- dict.keys(): 딕셔너리의 키들을 반환한다. 이 메소드는 딕셔너리 키들의 뷰를 반환하기 때문에, 딕셔너리의 키 컬렉션을 동적으로 볼 수 있다.
- dict.values(): 딕셔너리의 값들을 반환한다. dict.keys()와 비슷하게, 값들의 뷰를 반환한다.
- dict.items(): 키-값 쌍을 튜플로 가진 객체를 반환한다. 이것 역시 뷰를 반환하기 때문에 딕셔너리의 항목을 동적으로 볼 수 있다.
- dict.update([other]): 다른 딕셔너리 또는 키-값 쌍의 반복 가능한 객체(other)로부터 키-값 쌍을 추가하거나 업데이트한다. other가 딕셔너리일 경우, 그 딕셔너리의 키-값 쌍을 현재 딕셔너리에 추가한다.
- dict.pop(key[, default]): 주어진 키에 해당하는 항목을 딕셔너리에서 제거하고, 그 값을 반환한다. 키가 딕셔너리에 없을 경우 default를 반환하고, default가 제공되지 않으면 KeyError가 발생한다.
- dict.clear(): 딕셔너리의 모든 항목을 제거한다.
- dict.copy(): 딕셔너리의 얕은 복사본을 반환한다.
탐색과 정렬
- bisect.bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x가 들어갈 가장 왼쪽 위치를 찾는다.
- bisect.bisect_right(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x가 들어갈 가장 오른쪽 위치를 찾는다. 이 둘을 이용하여 bisect_left = bisect_right 가 있다면 리스트 a 내에 특정 요소 x가 존재하는지 여부를 효율적으로 확인할 수 있다.
데이터 구조
- collections.deque: 덱은 기본이다. 그냥 collections인지만 가끔 헷갈리는데 그정도만 기억해두자.
- heapq: 우선순위 큐 기능을 구현할 때 유용하다.
- collections.Counter: 요소가 해시 가능한 객체일 때, 요소의 개수를 세는 데 사용된다.
기타 유용한 기법들
- 리스트 컴프리헨션:
even_numbers = [x for x in range(10) if x % 2 == 0] print(even_numbers)
- 람다 함수: 이름 없는 함수를 정의할 때 사용.보통 sort와 함께 자주 사용한다.
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')] pairs.sort(key=lambda pair: pair[1]) print(pairs)
- 조건부 표현식: x if C else y와 같이 조건에 따라 값이 달라지는 표현식을 간결하게 작성.
age = 20 print("성인" if age >= 18 else "미성년자")
- any()와 all() 함수: 반복 가능한 객체의 원소가 어떤 조건을 만족하는지 확인할 때 사용. any()는 하나라도 조건을 만족하면 True를, all()은 모든 원소가 조건을 만족할 때 True를 반환한다.
numbers = [1, -2, 3, -4, 5] # 하나라도 양수인가? print(any(x > 0 for x in numbers)) # 모두 양수인가? print(all(x > 0 for x in numbers))
- enumerate() 함수: 반복 가능한 객체를 순회하면서, 인덱스와 함께 원소를 가져올 때 사용된다. 말하자면 내부값과 인덱스값을 한번에 가져오는것이다.
names = ["Alice", "Bob", "Charlie"] for index, name in enumerate(names): print(f"{index}: {name}")
반복 가능한 객체 처리
- zip(*iterables): 여러 개의 반복 가능한 객체를 인자로 받아, 동일한 인덱스의 요소를 튜플로 묶어서 반환한다. 여러 데이터를 병렬로 처리할 때 유용한데, 특히 아래의 함수와 같이 문자열 차이를 정의하는 함수를 만들때 유용하다.
def word_diff(A, B): return sum(a != b for a, b in zip(A, B))
이정도면 함수적인 면에서는 충분히 정리한거같다. 알고리즘을 열심히 공부하고, 좋은함수를 이용해 짧고 간결한 코드를 작성하도록 연습해보자!!
'알고리즘' 카테고리의 다른 글
dfs, bfs 정리 (0) | 2024.02.20 |
---|---|
round 함수와 소수 출력 (0) | 2024.02.17 |
startswith 함수에 대해 알아보자 (0) | 2024.02.16 |
문자열로 변환해 비교하기 (0) | 2024.02.08 |
2차원 배열 초기화와 DP (0) | 2024.02.02 |