본문 바로가기

전체 글

(147)
백준 14427: 수열과 쿼리 15 https://www.acmicpc.net/problem/14427 백준 내에서 "수열과 쿼리 시리즈"는 보통 세그먼트 트리로 해결할 수 있는 문제들이 즐비된 시리즈이다.대표적으로 세그먼트를 활용한 머지 소트 트리란 자료구조를 처음으로 알게 해준 13537: 수열과 쿼리 1,합 세그먼트 트리를 활용한 16978: 수열과 쿼리 22 등등이 있다. 이 문제 또한 세그먼트 트리로 해결할 수 있다. 처음 봤을 때부터 떠오른 생각은 그것이였다.문득 이 문제는 세그먼트 트리를 사용하지 않아도 풀 수 있을 지 않을까? 생각이 들기 시작했다.이 문제에서 주어진 명령어 2는 다른 문제들과 다르게 수열 범위를 지정하지 않고, 단순히 전체 범위만을 나타낸다 그렇다면, 다른 해결 방법이 있을 것이다. 수열 내에서 가장 작은 ..
백준 25402: 트리와 쿼리 https://www.acmicpc.net/problem/25402 DFS?처음 내가 생각한 아이디어는 단순 DFS를 사용해서, S에 속한 정점들만, 탐색하여 사이즈를 구한 뒤에, Size * (Size - 1) / 2로 쌍의 갯수를 더하므로 답을 구하는 심플한 아이디어였다. 시간 초과가 의심되지만, 혹시나 하는 마음에 코드를 구현해보았다.#include #include using namespace std;using ll = long long;const int MAX = 250001;vector adj[MAX];ll N, Q, K, A, B, S[MAX];bool v[MAX], g[MAX];ll dfs(int here){ ll ret = 1; for (int there : adj[here]) { if ..
백준 20952: 게임 개발자 승희 https://www.acmicpc.net/problem/20952 단순하게는 풀리진 않는다.이 문제는 수열 A와 수열 B의 길이가 각각 100,000이 넘는 것이 문제다.따라서 단순하게 계산을 하면 최대 100,000 * 100,000 = 약 10억으로 시간초과가 될 것은 불보듯 뻔하다. 그럼 수열 B를 전부 더 한 뒤에, 수열 A에 더한 뒤, 7의 배수가 아닌 수를 배제하면 어떨까?그러면, 연산 중에 7의 배수가 아닌 수를 배제할 수 없다. 따라서 이것도 아니다. 도대체 정답이 뭘까? 연대 책임나는 여기서 예제 입력 2에 주목하였다.7 77 14 21 28 35 42 497 7 7 7 7 7 7이 예제의 수열 A는 어떠한 7의 배수 값을 더해도, 모든 원소가 제거된다. 반면, 7의 배수가 아닌 어떠한..
백준 10423: 전기가 부족해 https://www.acmicpc.net/problem/10423 다익스트라?이 문제를 보았을 때 먼저 떠올린 해결책이다.발전소 위치 마다 다익스트라를 돌린 뒤에, 각 도시 위치를 순회하며 가장 적은 거리를 가진 발전소 위치를 정답에 더하면 어떨까? 란 생각을 했었다. 다익스트라의 시간복잡도를 검색하니, O(E log V)다. 즉, 이 문제의 그래프에서 다익스트라 한번은,100,000 * log(1000) => 약 100만이고, 이것을 각 노드에서 한번씩 실행하면, 약 10억의 시간복잡도를 지닌다.보통 한 문제의 시간복잡도는 많아도 1000만이 적절하다. 따라서, 이 아이디어는 절대로 아니다. 최소 스패닝 트리?다른 아이디어로 최소 스패닝 트리를 사용하면 어떨까? 란 생각을 해보았다.사실 이 문제를 보..
백준 13334: 철도 https://www.acmicpc.net/problem/13334 기발한 아이디어?이 문제를 보며 관찰한 결과, 철로 위치의 끝은 적어도 한 사람의 집과 사무실 끝을 둘 것이라 생각했다.그렇다면, Set을 사용해서, 각 사람의 집과 사무실 위치를 저장해서 중복을 제거한 다음(해당 위치 +- 철로 길이) 내에 얼마나 많은 출근 길이 겹치는 지 확인하면 정답일 것이다.#include #include #include #include using namespace std;vector> P;int N, H, O, D, cnt = 0, ans = 0;set S;int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N; ..
백준 1108: 검색 엔진 https://www.acmicpc.net/problem/1108 가벼운 마음으로 도전이 문제는 가볍게 "위상 정렬"을 사용하면 쉽게 사용할 것이라 생각해서 도전하였다.#include #include #include using namespace std;unordered_map um;int N, cnt = 0, L, indegree[1201], ans[1201];bool adj[1201][1201], v[1201];string S, D, Q;void dfs(int here){ for(int i = 0;i > N; for (int i = 0; i > S; cin >> L; if (um.find(S) == um.end()) um[S] = cnt++; int t = um[S]; while (L--) {..
백준 2276: 물 채우기 https://www.acmicpc.net/problem/2276 유사한 문제이 문제를 보자마자 떠올린 문제가 있다.https://www.acmicpc.net/problem/1113 바로, "백준 1113: 수영장 만들기"이다. 이 문제는 바깥에서부터 물의 수위를 조절하며, BFS를 돌아서, 채울 수 있는 물을 구하면 된다. 다만, 이 문제는 물의 수위가 1~10 사이여서 가능하였고, 여기서 다룰 문제는 1~1,000,000,000까지의 높이를 가지므로 다른 해결책을 강구해야한다. 시도한 아이디어그래서 나는 물통의 높이들을 전부 우선순위 큐에 넣고, 높이가 작은 순서대로 순회하는 알고리즘을 떠올렸다.일단 우선순위 큐에서 높이와 위치를 꺼낸 뒤에, 위치를 기준으로 DFS를 돌며, 주위의 높이 중 가장 작은..
백준 1150: 백업 https://www.acmicpc.net/problem/1150 초기 아이디어이 문제는 예전부터 고민을 했었다.여러 예시를 돌려본 결과, 이 문제는 케이블 길이가 짧은 것 or 짧은 것의 반대편 양쪽의 케이블 이 둘 중 하나를 선택하는 것이 정답이란 것을 깨달았다. 그런데, 언제 이 선택을 할지가 문제였다. 결국 시도를 한 것은 Bruteforce였지만,#include #include #include using namespace std;using ll = long long;ll ans = 100000000000000000;int N, K, S[100002];vector> L;bool v[100002];void solve(int idx, int p, ll s){ if (idx > N || s >= ans..