힙의 개념 힙은 완전 이진트리로 구성된 자료구조이다. 우선순위 큐를 위해 만들어진 자료구조이다. 힙 자료구조로 우선순위 큐를 구현할 때 삽입 삭제 모두 O(logN) 연산을 가진다. 최소 힙: 부모 노드의 값이 자식노드의 값보다 항상 작은 힙 최대 힙: 부모 노드의 값이 자식노드의 값보다 항상 큰 힙 위 사진과 같이 항상 완전 이진트리로 구성되어 최소 최대 값을 빠르게 찾아낼 수 있도록 설계되어있다. heapq 모듈 파이썬에선 heapq 모듈을 이용하여 최소 힙과 최대 힙 모두 구현할 수 있다. heapq 메서드 heappush(heap, item) 힙 불변성을 유지하면서 item 값을 heap으로 푸쉬한다. heapq.heappop(heap) 힙 불변성을 유지하면서, heap에서 가장 작은 항목을 po..
최근 알고리즘 테스트 공부를 위해서 파이썬을 꽤나 자주 이용하는데, 문제에서 빈번하게 사용되는 deque에 대해서 알아봅시다! Deque, 왜 쓰나요? 먼저 주 언어가 Javascript였던 제가, 파이썬으로 알고리즘을 하게 된 가장 큰 이유가 바로 deque의 유무였습니다. 자바스크립트에서 후입선출 방식의 Queue나 양쪽에서 삽입 삭제가 가능한 Double-ended Queue 같은 자료구조를 구현하기 위해선, 링크드리스트를 거의 필수로 사용해야 했습니다. 예를 들어 1, 2, 3이 있는 배열을 큐 방식으로 넣고 뺀다고 생각해 봅시다. 1, 2, 3에서 가장 먼저 들어왔던 1의 값만 뺀다고 생각 해봅시다. 그럼 1을 빼기 위해서, 뒤에 있는 모든 index들이 한 칸 앞으로 와야 하는 귀찮은 일이 발..
알고리즘 공부를 하는 중에 그래프 탐색 파트를 공부하기 시작해서 짚고 넘어가는 것이 좋겠다고 생각하여 DFS와 BFS를 알아보고, 파이썬으로 구현까지 해본다. DFS (Depth-First Search) 깊이 우선 탐색이라고 부르고 그래프에서 깊은 부분을 우선 탐색하는 알고리즘이다. 갈 수 있는 한 맨 밑까지 탐색하여 리프노드(맨 아래 노드)를 방문하고, 이전 갈림길에서 선택하지 않은 노드들을 방문하는 식으로 탐색한다. 방문 위치를 기록 하는 스택을 이용하여 해결 할 수 있다. 또는 재귀로 해결 할 수 있다. 스택 방식 동작 과정 탐색 시작 노드를 스택에 삽입하고 방문 배열에 방문 했다고 표시한다. 스택의 최상단 노드에 방문 하지 않은 인접 노드가 있으면 해당 노드를 스택에 넣고 방문 처리를 한다. 만약..
https://www.acmicpc.net/problem/2493 2493번: 탑 첫째 줄에 탑의 수를 나타내는 정수 N이 주어진다. N은 1 이상 500,000 이하이다. 둘째 줄에는 N개의 탑들의 높이가 직선상에 놓인 순서대로 하나의 빈칸을 사이에 두고 주어진다. 탑들의 높이는 1 www.acmicpc.net 사용언어 : python 알고리즘 : 자료 구조, 스택 Solved.ac Tier : Gold V python 코드 1. 문제 정리 이 문제는 시간이 1.5초이고 주어지는 탑의 개수가 50만개이기 때문에 시간 복잡도가 O(N^2)를 넘어서면 시간 초과가 발생 한다. 따라서 문제를 해결 할 때 탐색 하는 것을 빼야 했다. import collections import sys from collect..
https://www.acmicpc.net/problem/1935 1935번: 후위 표기식2 첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이 www.acmicpc.net 사용언어 : python 알고리즘 : 자료구조, 스택 Solved.ac Tier : Silver IV python 코드 1. 문제 정리 후위 표기식, 전위 표기식은 전공자가 아니라면 듣기 어려운 식들이다. 후위 표기식은 컴퓨터가 사용하는 연산 방법으로, 왼쪽에서 오른쪽으로 표기된 순서대로 처리하면 결과가 올바르게 나오는 후위 표기법을 사용한다. 스택을 사용하여 원래의 중위 표기식으로 변..
https://www.acmicpc.net/problem/10866 10866번: 덱 첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 www.acmicpc.net 사용언어 : python 알고리즘 : 자료 구조, 덱 Solved.ac Tier : Silver IV python 코드 1. 문제 정리 1년전 c로 풀어봤던 문제를 다시 파이썬으로 풀어보았다. 파이썬엔 말도안되는 deque가 있기 때문에 굉장히 문제가 쉽다. js로 할 때엔 링크드리스트로 구현 해야 하고 고려 해야 할 것이 2배 이상으로 늘어나서 js로 알고리즘을 하다가 다시 파이..
https://www.acmicpc.net/problem/11653 11653번: 소인수분해 첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다. www.acmicpc.net 사용언어 : python 알고리즘 : 수학, 정수론, 소수판정 Solved.ac Tier : Bronze I python 코드 1. 문제 정리 간단하게 에라스토테네스의 체 알고리즘을 활용하여 풀면 되는 문제이다. 소수 찾기 알고리즘을 사용하면 간단하게 해결할 수 있는 문제이다. 나는 soinsoo라는 함수를 재귀를 활용하여 해결 하였다. def soinsoo(k): for i in range(2, k): if k % i == 0: ans.append(i) soinsoo(int(k / i)) return 2부터 k까지..
https://www.acmicpc.net/problem/5355 5355번: 화성 수학 겨울 방학에 달에 다녀온 상근이는 여름 방학 때는 화성에 갔다 올 예정이다. (3996번) 화성에서는 지구와는 조금 다른 연산자 @, %, #을 사용한다. @는 3을 곱하고, %는 5를 더하며, #는 7을 빼는 연산 www.acmicpc.net 사용언어 : python 알고리즘 : 수학, 구현 ,사칙연산 Solved.ac Tier : Bronze II 간단하게 파이썬 적응을 위해 풀어 본 문제이다. python 코드 1. 문제 정리 입력을 받을 줄 안다면 쉽게 해결 가능한 문제이다. 값들을 받아 문제에서 준 대로 계산 하면 된다. 마지막 출력에 format을 사용하여 소수점 둘째자리까지 강제로 출력하도록 만들었다. ..