반응형

과거의 유산들/python 26

heapq는 list.sort처럼 앞에서 부터 원소들을 비교한다.

heapq에 튜플 형태처럼 복수의 인자들을 넣는다면, 가장 앞 인자들 부터 비교하면서 순서를 정한다. (1,1),(2,3),(0,1),(2,0) 만약 이런 데이터가 있다면 heapq로 차례대로 pop을 한다면 (0,1),(1,1),(2,0),(2,3) 이런식으로 가장 앞의 인자들을 비교하면서 정렬해놓고 (2,0),(2,3)처럼 같은 인자라면, 그 다음 위치 인자들끼리 비교해서 순서를 정한다.

리스트 값 탐색 시, 인덱싱보다 in이 빠르다

백준 18111번 마인크래프트 문제를 풀다가 시간복잡도를 최대한 줄이기 위해 검색을 해보니 리스트 안에 있는 값을 찾을 때 인덱싱이 시간이 걸린다는 것을 알았다. 예를 들어 for i in range(10): for j in range(10): print(stg[i][j] 이것 보다 for i in list: for j in i: print(j) 이것이 더 빠르다. 이것만 바꾸어도 시간초과로 안풀리던 문제가 겨우 통과 되었다

다른 파일 변수 사용 시

다른 파일의 변수를 사용할 때 시행착오 price = 50 이런 변수가 있는 파일이 있다 하자. 나는 이 파일을 불러와 변수를 쓰고 싶었다. 그래서 이렇게 했다 import 다른파일 print(price) 그러니 에러가 뜬다. price를 찾을 수 없다고 알고보니 이렇게 해야한다. import 다른 파일 print(다른 파일.price) ----------------------------- >50 즉 임포트하고 나서 '파일이름.' 붙여야 한다는 것이었다.

나머지 연산 분배법칙, 왜 끝에 %n을 한 번 더 하는가

백준 곱셈문제를 풀다가 나머지 연산 분배 법칙 이해가 안됬던 것을 정리 하려고 한다. 바보같이 분할정복 거듭제곱을 지수법칙을 못 떠올렸다. 큰거에서 작은것으로 분할하기 딱 좋은게 지수법칙인데... 다른 블로그를 통해, 덧셈과 곱셈의 나머지 연산 분배 법칙의 공식을 보게 되었다. 그런데 이해가 되지 않았던 것은 (A*B)%C = ((A%C)*(B%C))%C 였던 것이다. 나는 (A%C)*(B%C)에서는 이해가 갔는데 왜 끝에 저걸 붙이는지 직접 부딪히면서 깨달았다. 나머지들을 구한뒤 곱하면 나머지가 원래 수보다 커질 수 있기에! 다시 한번 나머지를 최종적으로 구한 것이었다. 머쓱 너무 간단했지만 간단한것을 바로 이해 못했기에 박제 시켰다. print((1012*37)%13) print((1012%13)*(..

index(),find(),count()와 시간복잡도

전에는 의식하지 않다가 백준에서 계속 시간초과가 떠서 확인해보고 싶었다. 알고리즘 문제를 풀다보면 문자열,리스트 안에 값을 찾기 위해 index,find,count와 같은 함수를 쓸때가 있다. 그냥 O(1)처럼 파이썬에서 뙇! 찾아주는 줄 알았다. 그러나 아니다. 위와 같은 함수들은 그저 for문을 함수로 간략화 시킨것일뿐, 결국은 for문을 돈다! 내가 인덱싱을 한것도 아니고 파이썬한테 찾아줘~하고 무책임하게 던져줬으니, 파이썬은 그냥 모든 값을 찾다가 나오면 반환해주는 형식이었다. 만약 함수문(for 문) 안에서 이러한 함수들을 쓰면 시간 복잡도가 O(N^2)가 된다.

큐 list or Deque

백준 문제를 풀면서 큐를 쓰는 단계에 도달했다. 큐를 단순 구현하는 문제였다. 그래서 나는 간단히 다음처럼 구현했다, a = [] a.append(int(input()) #데이터 추가 a.pop(0) #데이터 삭제 그러나 위와 같은 문제는 자료값이 많아질수록 시간이 급격하게 늘어난다. 왜냐하면 스택과 다르게 큐는 맨 앞의 값을 pop시키는데, 그러면 파이썬의 list는 고정된 메모리를 사용하기에 뒤에 있는 값들을 한칸씩 앞으로 땡긴다. 인덱스 값을 맞추기 위해!! 이런 문제를 해결하기 위해 deque이라는 모듈이 존재한다. 이것은 고정된 어레이 형태가 아닌 더블 링크드 리스트형태로 인덱싱을 하지 않고 head,rear값만 지정하기에 모든 값들이 대이동을 하지 않는다!

zip(), 조합 구하는 함수

zip() 두개의 iterable한 자료형을 각각의 튜플로 바꿔주는 함수! a = [1,2,3] b = 'abc' c = list(zip(a,b)) print(c) .................... [(1, 'a'), (2, 'b'), (3, 'c')] 이걸 이용해서 dictionary 자료형으로 편하게 만들수도 있다. a = [1,2,3] b = 'abc' c = dict(zip(a,b) print(c) ............ {1: 'a', 2: 'b', 3: 'c'} 조합 구하는 함수(combinations(),permutations(),product()) https://ourcstory.tistory.com/414 파이썬(Python) 리스트 모든 조합 구하기 (combination vs pe..