Learn to share,Share to learn

유용한 함수들 총정리 본문

알고리즘

유용한 함수들 총정리

Rogue One 2024. 2. 16. 17:40

누구나 시험직전 자기만의 필살노트를 작성한다. 평소에 열심히 하다 요것만 한번 흝어보면 깔끔하게 정리하고 시험볼수있는 노트. 오늘은 그런것 한번 정리해보려한다.

 

문자열 처리

  1. startswith(substring): 문자열이 특정 문자 또는 문자열로 시작하는지 확인한다.
  2. endswith(substring): 문자열이 특정 문자 또는 문자열로 끝나는지 확인한다.
  3. split(delimiter): 문자열을 특정 구분자로 나누어 리스트로 반환한다. 의외로 문자열에서 유용할때가 많은데, 크로아티아 알파벳같은 문제에서 유용하게 사용했다. https://www.acmicpc.net/problem/2941
     

    2941번: 크로아티아 알파벳

    예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

    www.acmicpc.net

  4. join(iterable): 주어진 문자열들을 연결하여 새로운 문자열을 생성한다. 이건 기본중의 기본이지만 가끔 잊곤하는게, join은 문자열이 와야지 숫자가 오면 안되므로, 정수를 join하고싶으면 map을 이용해서 문자열로 바꾸고 join을 사용해야 한다.

리스트와 배열 처리

  1. bisect.insort_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x를 삽입한다. 이게 아주 유용하다. biscect는 이진탐색을 공부하면서 조금 알게됐는데, 이진탐색을 모르더라도 정렬된 리스트에 요소 삽입을 할수있다는것은 강력한 툴이다.
  2. sorted(iterable): 주어진 반복 가능한 객체를 정렬하여 새 리스트를 반환한다. 아래와는 달리 새 리스트를 반환하는게 중요
  3. list.sort(): 리스트 자체를 정렬한다. 반환값은 없다. 뭐 기본이다. 알아둘만한점은 최악의 상황에선 시간복잡도가 n log n이라는 점 정도?

수학 및 통계

  1. math.gcd(a, b): 두 숫자의 최대공약수를 반환한다.
  2. math.sqrt(x): 숫자의 제곱근을 반환한다. 범위 지정할때 제곱근까지만 돌아도 충분한 경우가 있어 나름 자주쓴다

조합론 및 순열

  1. itertools.permutations(iterable, r): 주어진 반복 가능한 객체에서 요소 r개를 선택하여 만들 수 있는 모든 순열을 반환한다. 이건 정말 시간복잡도는 영 아닌데 어떻게든 브루트포스로 풀때 아주아주 유용하다. 대신 시간복잡도는.. O(n!/(nr)!) 인데 입력크기가 크면 곧바로 터져버린다. 
  2. itertools.combinations(iterable, r): 주어진 반복 가능한 객체에서 요소 r개를 선택하여 만들 수 있는 모든 조합을 반환한다. 이건 조합이라 순서를 신경쓰지 않는것이다. (1,2) 나 (2,1)이나 같은것! 얘도 금방 터진다. 
  3. itertools.combinations_with_replacement(iterable, r): 중복을 허용하여 조합을 생성한다.
  4. itertools.product(iterable, repeat=1): 중복을 허락하여 순열을 생성한다.

집합과 맵

  1. set(): 집합을 생성하는데, 중복된 요소를 제거할 때 유용하다. 이뿐만 아니라 만약 리스트안에 특정값이 있는지 판별할때, 리스트를 집합으로 만들고 검사하면 훨씬 빠른 시간복잡도를 갖는다. 이건 set이 해시테이블 기반으로 구현되어있기 때문이다.리스트에서라면 시간복잡도가 N이라면, set은 O(1)이라는점!(일반적으로)
  2. 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(): 딕셔너리의 얕은 복사본을 반환한다.

 탐색과 정렬

  1. bisect.bisect_left(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x가 들어갈 가장 왼쪽 위치를 찾는다.
  2. bisect.bisect_right(a, x): 정렬된 순서를 유지하면서 리스트 a에 요소 x가 들어갈 가장 오른쪽 위치를 찾는다. 이 둘을 이용하여 bisect_left = bisect_right 가 있다면 리스트 a 내에 특정 요소 x가 존재하는지 여부를 효율적으로 확인할 수 있다.

데이터 구조

  1. collections.deque: 덱은 기본이다. 그냥 collections인지만 가끔 헷갈리는데 그정도만 기억해두자.
  2. heapq: 우선순위 큐 기능을 구현할 때 유용하다.
  3. 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