일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 파이썬
- BFS
- PYTHON
- 백준
- 브루트포스
- 네트워크
- 운영체제
- nlp
- AI
- 알고리즘
- 동적 프로그래밍
- DFS
- 프로그래밍
- 코딩
- 킥스타트
- google coding competition
- linux
- 딥러닝
- 순열
- OS
- kick start
- CSS
- 구글 킥스타트
- 프로그래머스
- dp
- 리눅스
- 코딩 테스트
- 동적프로그래밍
- 그래프
- 코딩테스트
- Today
- Total
목록Language (22)
오뚝이개발자
프로그래밍 언어는 메모리 관리를 어떻게 할까? 프로그래밍 언어는 메모리 관리를 어떻게 하는 것일까? C나 C++ 같은 저수준의 언어는 malloc(), free()와 같이 메모리를 직접적으로 관리하는 함수들을 사용해 메모리 할당과 해제를 한다. 그런데 python, JS, C# 등의 언어를 사용할 때를 생각해보면 개발을 하는 우리는 "메모리"에 대해 생각하지 않고 코드를 짠다. 현대적인 언어로 오면서 메모리 관리는 점차 사람이 하지 않는 쪽으로 바뀌었다. 하지만 분명히 메모리가 어떠한 방식으로든 할당이 되어야 할 것이고, 이를 사람이 신경쓰지 않는다면 누군가가 대신해 주고 있다는 뜻이다. 특히, 파이썬에서 이를 해주는 것이 바로 가비지 콜렉터(Garbage Collector, 줄여서 GC)이다. 메모리를..
assert assert는 뒤에 오는 조건이 False면 AssertionError를 발생시킨다. >>> a = 3 >>> assert a == 2 #결과 Traceback (most recent call last): File "", line 1, in AssertionError 다음과 같이 assert 조건, "에러문"의 형식으로 사용할 수도 있다. def test(t): assert type(t) is int, '정수 아닌 값이 있네' for i in lists: test(i) #결과 AssertionError: 정수 아닌 값이 있네 즉, assert는 가정설정문이라고 해서 특정 값이나 값의 범위를 보장하기 위해 프로그램 중간중간에 사용한다. 예컨대, 어떤 함수는 정수값만을 input으로 받아야 한다..
dfs, bfs, 백트래킹 문제들을 풀 때 기존의 2차원 리스트를 변경하고 원상태로 다시 되돌려야 할 때가 있다.(예컨대, 방문한 곳의 값을 변경한다거나, 특정 조건에 따른 위치의 값을 변경한다거나) 이 때 만약 처음의 상태를 arr에 저장해두었다고 하고, 이를 복사해 탐색하는 함수(예컨대, dfs나 bfs)의 인자로 넘겨 그래프 탐색을 한다고 하자. 만약 arr를 그대로 함수의 인자로 넘겨버리면 arr의 값이 변경된 채로 다음 탐색을 이어가기 때문에 이를 재사용할 경우에 문제가 된다. 이럴 때 사용할 수 있는 것이 바로 deep copy다. deep copy는 copy라는 모듈을 import해서 사용할 수 있다. >>> import copy >>> a = [[1,2],[3,4]] >>> b = copy..
list와 tuple은 모두 순차자료형이다. A = [1, 2, 3]# list B = (1, 2, 3)# tuple 하지만 차이점은 리스트의 경우 원소를 바꿀 수 있으나(가변적), 튜플의 경우 원소의 값을 변경할 수 없다(불변적)는 점이다. 이 같은 차이가 왜 중요한 이유가 있다. 만약 아래와 같이 "리스트"를 key로 하는 딕셔너리를 만들고 싶다고 해보자. A = [1,2,3] B = [4,5,6] dictionary = {} dictionary[A] = 1 dictionary[B] = 2 안타깝지만, 위의 코드는 제대로 실행되지 않는다. 아마 실행해보면 TypeError: unhashable type: 'list'라는 에러 문구가 뜰 것이다. 이유는 파이썬에서 딕셔너리의 key값은 hash가 가능토..
deque(double ended queue)는 양방향 연결리스트로 구현되어 있어 양 끝단에 접근이 가능하고 데이터의 삽입, 삭제가 용이하다.(단, 중간 데이터는 제외) 여기선 대표적으로 많이 쓰이는 5가지 operation에 대해 사용법을 정리하려고 한다. 아, 참고로 deque를 사용하려면 import collections.deque를 해주어야 한다. append(x), appendleft(x) append(x)는 오른쪽 끝에 데이터 x를 추가, appendleft(x)는 왼쪽 끝에 데이터 x를 추가한다. 리스트와 달리 deque는 doubly linked list라 둘의 시간복잡도는 모두 O(1)이다. pop(), popleft() pop()은 일반적으로 알고있는 그 pop 연산이 맞다. 즉, st..
시간복잡도 아래는 자주 등장하는 시간복잡도 표기들이다. 표에서 아래로 갈수록 수행시간이 오래 걸린다. list 리스트는 배열이다. 그렇기 때문에 사이즈가 커질수록 삽입과 삭제 연산이 비효율적으로 된다. 이럴 땐 차라리 deque를 쓰는 것이 효율적이다. Operation Average Worst Copy O(n) O(n) Append O(1) O(1) Pop last O(1) O(1) Pop intermediate O(k) O(k) Get item O(1) O(1) Set item O(1) O(1) Delete item O(n) O(n) sort O(nlogn) O(nlogn) min,max O(n) O(n) len O(1) O(1) collections.deque deque(double ended qu..
파이썬에는 in 연산자가 있다. 보통 리스트, 튜플, 집합, 딕셔너리 같이 연속적인 자료구조에 속한 멤버를 확인하거나 순회할 때 사용한다. 그렇다면 in 연산자의 시간복잡도는 어떻게 될까? List l = [1, 2, 3, 4, 5] # 멤버 확인 if 1 in l : print("1 is in l") # 순회 for i in l : print(i) Tuple t = (1, 2, 3, 4, 5) # 멤버 확인 if 1 in t : print("1 is in t") # 순회 for i in t : print(i) Set s = {1, 2, 3, 4, 5} # 멤버 확인 if 1 in s : print("1 is in s") # 순회 for i in s : print(i) Dictionary d = {1: ..
파이썬에서 전역변수를 사용하려면 global 키워드를 사용해야 한다. 파이썬은 함수 내에서 사용하는 변수는 자동적으로 지역변수로 간주하기 때문이다. 따라서 global이라는 키워드를 붙여줌으로 해당 변수는 전역변수를 사용하는 것이라는 점을 명시해주어야 한다. x = 5 def solution(): global x x += 1 print(x)# 6 위와 같이 x를 처음에 전역변수로 선언해 5를 할당한 뒤 solution이란 함수에서 global x 키워드를 사용하여 1을 더해주었다. 만약 global x를 지워버리면 어떻게 될까? x = 5 def solution(): x += 1 print(x) 위 코드를 실행시키면 "UnboundLocalError: local variable 'x' referenced..