일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 큐
- union_find
- NIO
- Union-find
- dfs
- BFS
- Calendar
- Properties
- date
- string
- set
- scanner
- 스프링부트
- map
- 스택
- spring boot
- GC로그수집
- alter
- JPA
- sql
- List
- math
- 리소스모니터링
- 힙덤프
- javascript
- deque
- Java
- html
- priority_queue
- CSS
- Today
- Total
목록알고리즘/그리디 (10)
매일 조금씩
처음에 어떻게 풀까 고민을 많이 했다. 그리디 알고리즘 문제이니 가장 높은 레벨을 찾은 후에 양쪽을 확인하고 더하면서 문제를 풀면 되겠다 라고 생각했다. 어쨋든 처음부터 가장큰 레벨인 것부터 시작하는 것이 가장 큰값이 나올것이기 때문.. 근데 이걸 생각하다보니 의문이 들었다. 이런식의 연산을 하다보면 가장 큰레벨의 값은 처음 부터 끝까지 모든 덧셈에 포함된다. 정확히 n-1번의 덧셈에 포함이 된다. 그리고 나머지 레벨들은 한번씩 더해진다. 그럼 결과는 아주 쉽게 도출될 수 있었다. (가장 큰 레벨) * (n-1) + (나머지 레벨들의 합) #include #include #include #include #include using namespace std; int n, maxgold; const int M..
이게 골드라니?! 하는 문제였다. 골드가 다 이러면 얼마나 좋을까.. 강의실을 넘겨받을수 있냐없냐 문제다. 1~3시 강의실을 2~4강의가 넘겨받을수없으므로 새로운 강의실이 필요하다. 3~5시 강의면 1~3시 강의실을 넘겨받을 수 있다. pq의 기본 정렬은 내림차순이므로 강의실별 강의 끝나는 시간을 -를 붙여서 pq에 넣는다. 만약 어떤 강의가 pq의 top에 있는 가장 빨리 끝나는 강의보다 시작시간이 같거나 늦으면 pop 하고 빠르면 pop하지 않는다. 그리고 그 강의의 끝나는 시간을 pq에 넣는다. #include #include #include #include #include using namespace std; int n; const int MAX = 200001; pair arr[MAX]; // ..
서류순위와 면접순위 어느것 하나 낮은것이 없어야한다는 것이 포인트다. 서류순위대로 오름차순정렬한다. (1등이 제일 앞에옴) 서류 1등의 면접 순위를 따로 저장한다. (int interview) 서류1등인 인덱스 0을 제외한 인덱스 1부터 n-1까지 중에서 면접순위 값이 interview값보다 작은것을 찾는다. 3번을 통해 발견한 값을 interview 값으로 갱신하고 count를 증가시킨다. 3,4번을 반복한다. #include #include #include #include using namespace std; int t, n; const int MAX = 100000; pair arr[MAX]; int result[MAX]; int main(void) { cin >> t; for (int tc = 0..
#include #include #include using namespace std; int solution(vector routes) { int answer = 1; sort(routes.begin(), routes.end()); int tmp = routes[0][1]; for(int i = 0; i routes[i][1]) tmp = routes[i][1]; if(tmp < routes[i+1][0]){ answer++; tmp = routes[i+1][1]; } } return answer; }
#include #include #include using namespace std; bool cmp(vector node1, vector node2){ return node1[2] < node2[2]; } int getParent(vector& parent, int node){ if(parent[node] == node) return node; return parent[node] = getParent(parent, parent[node]); } void unionParent(vector& parent, int node1, int node2){ int parent1 = getParent(parent, node1); int parent2 = getParent(parent, node2); if(parent1..