본문 바로가기
반응형

Python/알고리즘팁18

파이썬의 iterator 사용법 1. 개요 파이썬으로 알고리즘을 풀다보면 간혹가다 iterator를 써야하는 경우가 생긴다. 이번 기회에 한번 사용법을 알아보자 2. 사용법 iterable한 객체에서 반복자를 얻어오는 방법은 다음과 같다 iterable = [ 1, 2, 3, 4, 5 ] it = iter(iterable) 값을 꺼내오려면 다음과같이 next 함수를 사용하면 된다 iterable = [ 1, 2, 3, 4, 5 ] it = iter(iterable) next(it) #1 next(it) #2 next(it) #3 next(it) #4 next(it) #5 3. hasnext 파이썬의 반복자에는 크나큰 결점이 있다. hasnext 메소드가 없다. 더이상 next가 없는 상황에서 next를 호출하면 exception을 일으.. 2023. 1. 6.
파이썬 얕은복사 깊은복사의 이해 파이썬으로 알고리즘을 풀다보면 파이썬의 주소값 체계 때문에 배열이 꼬이는 현상이 자주 발생한다. 이를 해결하기 위해 이번기회에 파이썬의 동작에 대해 완벽하게 이해해보자 1. 파이썬의 변수 할당의 의미 파이썬의 변수는 모두 포인터인가? 혹은 c++의 참조자인가? 에 대한 얘기가 많다. 찾아보니 파이썬의 variable은 해당 객체에 name을 binding 한다는 얘기가 있다. 무슨뜻인가? 바로 이런거다 a=1 1이라는 객체의 이름을 a 라고 하겠다! 라는 의미이다 2. C++ 포인터, 참조자와의 비교 한번 직접 실험해보자 python >>> a = 1 >>> b = a >>> a = 2 >>> b 1 C++ 포인터 #include #include int main() { int num = 1; int* a.. 2022. 12. 21.
파이썬 다차원 배열 복사 시 주의사항 다차원 배열의 얕은 복사 >>> a = [[1,2],[3,4]] >>> b = a[:] >>> a [[1, 2], [3, 4]] >>> b [[1, 2], [3, 4]] >>> a[1][1] = 9 >>> a [[1, 2], [3, 9]] >>> b [[1, 2], [3, 9]] 위 케이스처럼 배열을 복사하면 얕은 복사가 일어난다. 문제는 리스트안에 mutable한 변수(List와 Dict같은)이 있으면 주소값이 복사되어버린다! 그래서 코드 후반부 처럼 값을 변경하면 다른값도 전부 변경되어 버린다. a = b[:] a = b.copy() 전부 얕은복사이다. Mutable 데이터 타입 사용자 정의 객체 list dictionary set Immutable 데이터 타입 int float decimal boo.. 2022. 12. 15.
파이썬 약수 구하기 1. 설명 어떤수의 약수를 구하면 N=A*B 형태로 나타낼 수 있다. 하나의 약수, 예를들어 A를 구하면 B는 N/A로 구할 수 있다 A와 B가 값이 다르다면 2개를 세어주어야 하고, A와 B가 같다면 1개만 세어주어야 한다 작은숫자부터 약수 A를 구한뒤 A*A가 N(N은 A*B)보다 작다면, A와 B는 다른값이므로 2개를 세어준다. 여기서 B는 A보다 큰값을 가지게 된다. 만약 A를 구하고, A*A가 N이라면 A와 B는 같은 값이다. 이후 A보다 큰값에서 약수 계산은 이미 계산되어있으므로 불필요하다 이때 시간복잡도는 루트N이다 def divisor(x): i = 1 result = 0 while i*i 2022. 12. 13.
파이썬 Queue vs Deque 어느것을 사용할 까? Queue와 Deque 알고리즘을 풀 때 어느것을 사용해야 될 까 queue — A synchronized queue class — Python 3.7.14 documentation queue — A synchronized queue class Source code: Lib/queue.py The queue module implements multi-producer, multi-consumer queues. It is especially useful in threaded programming when information must be exchanged safely between multiple threads. The Queue docs.python.org 파이썬 공식문서의 Queue 모듈 내용을 보면 .. 2022. 12. 9.
[파이썬] global과 nonlocal 이해하기 https://docs.python.org/3/tutorial/classes.html 9. Classes — Python 3.10.2 documentation 9. Classes Classes provide a means of bundling data and functionality together. Creating a new class creates a new type of object, allowing new instances of that type to be made. Each class instance can have attributes attached to it for maintaining its st docs.python.org global : 이 키워드로 변수를 선언하면 전역변수로 간주된다... 2022. 1. 21.
파이썬 순열/조합 permutation, combination 사용하기 from itertools import permutations, combinations a = [1,2,3,4,5] list(permutations(a,2)) 결과 : [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)] list(combinations(a,3)) 결과 : [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)] 고등학교때 nPr nCr 을 기억하고 있을 것이다. n개에서 r개를 선택하여 나열하는 경우의수 n개에서 r개를 선택하는 경우의 수 permutations과 combinations는 위 두개를 계산해주는 함수이다. permitations(인.. 2021. 4. 15.
파이썬 문자 아스키코드 얻는법 >>> ord('A') 65 >>> chr(65) 'A' ord() : 문자를 아스키코드로 반환해준다 chr() : 숫자에 맞는 문자를 반환해준다. 2021. 4. 2.
그리디 알고리즘의 조건 탐욕스러운 선택 조건 앞의 선택이 이후 선택에 영향을 주지 않아야 한다. 최적부분 구조 조건 문제에 대한 해결방법이 문제의 부분에 대해서도 해결방법이 되야 한다 2021. 4. 1.
파이썬 any, all 활용하기 파이썬 내부에서 any와 all의 함수 구현은 아래와 같다. 그냥 리스트 순회하면서 True False만 체크해주는 함수이다. any => 요소중에 하나라도 True가 있으면 True 리턴, 전부다 False이면 False 리턴 all => 요소 모두가 True이면 True 리턴, 하나라도 False가 있으면 False 리턴 def any(iterable): for element in iterable: if element: return True return False def all(iterable): for element in iterable: if not element: return False return True 특정 조건을 어떤 리스트에서 체크 할 때 파이썬에서는 any와 all을 활용하여 코드를 .. 2021. 3. 19.
파이썬 이중 리스트 순회하며 특정요소 꺼내기 문제풀다가 이중리스트에서 요소꺼내는데 꿀팁 발견해서 적어봄 >>> mylist = [["물고기", "붕어"], ["식물","장미"], ["포유류", "소"], ["고기", "소고기"]] >>> list1 = [key for key, value in mylist] # 첫번째 요소 꺼내옴 >>> list2 = [x[1] for x in mylist] # 두번째 요소 꺼내옴 >>> list1 ['물고기', '식물', '포유류', '고기'] >>> list2 ['붕어', '장미', '소', '소고기'] 2021. 3. 17.
파이썬 딕셔너리 순회하기 mydict = {"key1":"value1", "key2":"value2", "key3":"value3"} for key in mydict: print(key) #key값만 출력됨 for key, value in mydict.items(): print(key, value) #key, value 출력됨 key1 key2 key3 key1 value1 key2 value2 key3 value3 딕셔너리를 변수 하나로만 순회하면 key값만 나온다. value값 까지 순회하고 싶으면 items라는 함수를 이용하자. 2021. 3. 17.
파이썬 Counter 객체 사용하기 docs.python.org/3/library/collections.html#collections.Counter collections — Container datatypes — Python 3.9.2 documentation collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple. namedtuple() factory f docs.python.org 알고리.. 2021. 3. 12.
list indices must be integers or slices, not float 파이썬 리스트 인덱스가 float일 경우에 발생하는 에러이다. 문제 풀다가 저런 에러를 마주쳤는데 보통 파이썬에서 나누기를 할 때 가끔 int형에서 float 형으로 바뀌는 경우가 있다. 나누기를 할 때 / 이 아닌 // integer division을 사용해주면 보통 해결된다. 2021. 3. 11.
파이썬 print 줄바꿈 없이 출력하기 파이썬 print() 함수는 실제로는 아래와 같은 형태로 되어있다. print(, end='\n') 저 개행문자를 원하는것으로 바꾸어 주면 된다. print(, end=' ') 2021. 3. 11.
RecursionError: maximum recursion depth exceeded while calling a Python object 파이썬에서는 기본적으로 재귀함수 호출을 1000으로 제한하고있다. 아래의 방법으로 recursion limit 제한을 커스텀 할 수 있다. import sys sys.setrecursionlimit(9999) 2021. 3. 11.
파이썬 heapq 커스텀 정렬 이용하기 파이썬에서 커스텀 정렬을 이용할 때 리턴값을 True False가 아닌 1, -1로 해주어야 함을 확인하였다. 이번에는 여러개의 멤버변수를 가진 클래스를 heapq를 이용해 heap을 만들어줄 때 custom comparator를 어떻게 이용하는지 알아보자. 결론부터 말하면 class 안에 __lt__(self, other) 함수를 재정의 해 주고 return 값은 True False로 해주면 된다. 이유는 간단하다. heapq의 소스코드를 분석해보면 힙정렬을 할 때 연산기호로 < 를 사용하기 떄문에 __lt__ 재정의 해 주어야 한다 위에 보면 연산기호가 < 인것을 확인할 수 있다 import heapq class node: def __init__(self, A, B): self.A = A self.B.. 2021. 3. 10.
파이썬 커스텀 정렬 이용하기 파이썬 3.x 이상 버전 from functools import cmp_to_key def comp(x, y): if x[0] 0 def __eq__(self, other): return mycmp(self.obj, other.obj) == 0 def __le__(self, other): return mycmp(self.obj, other.obj) = 0 __hash__ = None return K 리스트 내부 sort 안에 custom comparator를 넣어주는 케이스도 위와 동일하다. l.sort(key=cmp_to_key(comp)) 파이썬 2.x 버전 def custom_cmp(x, y): if x[0] > y[0]: return True else: return -1 l = [] l.appen.. 2021. 3. 10.
반응형