본문 바로가기

Programming/BOJ277

[C/C++] 백준 #1976 여행 가자(배타적 집합) 이번문제는 도시와 도시간 연결 정보를 알고 있으면, 중간에 다른 도시를 경유해서라도, 원하는 도시들을 여행할 수 있는지를 알아보는 것입니다. 사실 이 문제는 그래프를 만들어서 DFS나 BFS를 통해서 원하는 도시들을 다 방문하는지 찾아보아도 됩니다. 저는 배타적 집합(Disjoint Set)을 이용했습니다. 배타적 집합에서 집합을 찾고 합집합을 하는 것이 모두 상수시간이 걸리기 때문에, 전체적으로 \(O(N^2)\)의 알고리즘 효율로 할 수 있습니다. 연결된 도시가 나타나면, 각각의 도시가 속한 집합을 합집합을 하게 됩니다. 그러면 서로 분리된 한개 이상의 집합들이 나오게 되는데, 여행하고자 하는 도시들이 같은 집합에 있는지 검사하면 됩니다. 제가 작성한 소스입니다. //------------------.. 2022. 12. 20.
[C/C++] 백준 #1966 프린터 큐(구현) 네트워크 프린터에서는 전해진 문서들이 큐에 쌓이고, 차례대로 찍히는 것이 일반적입니다. 이 문제에서의 프린터 큐는 중요도가 있어서, 중요도가 높은 것이 후위에 있으면, 해당 문서를 찍지 않고, 큐의 마지막으로 옮겨지게 됩니다. 이번 백준 문제는 이러한 시스템에서 m번째 문서가 몇번째 찍히는지 계산하는 것입니다. 문제 뜻대로 그대로 구현을 한다면, 큐에서 문서를 하나 빼낼때마다, 매번 뒤의 문서들을 검색해야 합니다. 이 경우 우선순위가 낮은 것부터 높은것 순서대로 되어 있는 최악의 경우라면, 문서를 검사하는 비용이 \(O(N^2)\)이 됩니다. 사실 N이 100 이하이므로 이렇게 구현을 해도 됩니다. 검사비용말고, 큐에 추가하는 것을 따진다면, 최악의 경우 역시 \(O(N^2)\)이므로, 검사비용이 낮아지.. 2022. 12. 14.
[C/C++] 백준 #1965 상자넣기(가장 긴 증가하는 부분수열) 이번 문제는 가장 긴 증가하는 부분수열을 찾는 문제입니다. 문제의 알고리즘 힌트에는 동적 프로그래밍을 이용하라고 되어 있지만, 동적 계획법을 이용하는 경우에는 \(O(N^2)\) 알고리즘으로 풀어야 합니다. 그에 비해 약간의 정책을 이용해서 풀면 \(O(N \log N)\) 알고리즘으로 풀 수 있습니다. 가장 긴 증가하는 부분수열이라는 것은, 부분수열중에 단순 증가하는 수열을 찾는 것입니다. 예를 들어서, 1 6 2 5 7 3 5 6 이란 수열이 있습니다. 부분수열은 순서를 지키면서, 이 수열에서 몇개의 수를 뽑아내는 것을 말합니다. 예를 들어서 1 6 2 5 도 이 수열의 부분수열이고, 1 2 7 6도 이 수열의 부분수열이 됩니다. 그런데, 증가하는 부분수열은 앞의 숫자보다 뒤의 숫자가 큰 경우를 의미.. 2022. 12. 10.
[C/C++] 백준 #1963 소수 경로(너비 우선 탐색) 이번 문제는 소수중 한자리의 숫자만 다른 소수 경로를 찾는 문제입니다. 소수를 찾기 위해서 에라토스테네스의 체를 이용해도 되겠지만, 저는 미리 구한 4자리 소수 집합을 사용했습니다. 약간 편법일 수 있겠지만. 소수의 경로를 찾기 위해서 소수 후보를 찾는 것이 가장 힘듭니다. 일단 4자리 소수는 모두 홀수 소수이므로 갈 수 있는 경로는 31가지가 됩니다. 그것을 생각해서 한자리 숫자들을 바꾸면서 소수면 너비우선탐색 알고리즘으로 방문을 합니다. 그래서 목표하는 소수가 나오면 그때의 경로횟수가 답이 됩니다. 그런데, 모든 갈 수 있는 경로를 다 갔는데, 목표하는 소수가 나오지 않은 경우(queue가 비어있는 경우)에는 불가능하다고 출력을 내면 됩니다. 제가 작성한 소스입니다. //----------------.. 2022. 12. 9.
[C/C++] 백준 #1956 운동(플로이드 워샬) 이번 문제는 전형적인 플로이드 워샬 문제입니다. 플로이드 워샬 알고리즘은 음의 가중치가 있어도 문제를 풀 수 있고, 사이클을 찾아내는데에도 유용합니다. 하지만, 반복횟수가 많기 때문에, 노드의 개수가 많은 경우에는 좋지 않습니다. 알고리즘 시간복잡도가 \(O(V^3)\)입니다. 별도의 자료구조가 필요한 것도 아니기 때문에, 알고리즘만 이해하고 있다면, 손쉽게 구현할 수 있습니다. 제가 작성한 소스입니다. //------------------------------------------------ // baekjoon #1956 // - by Aubrey Choi // - created at 2019-11-16 //------------------------------------------------ #in.. 2022. 12. 9.
[C/C++] 백준 #1946 신입 사원(탐욕 기법) 신입사원의 채용 기준은 다른 모든 면접자들의 성적과 비교해서 하나라도 우수한 직원을 뽑는 것입니다. 문제의 뜻을 잘 이해하지 않으면 풀기 어려운 문제입니다. 성적은 두가지가 있는데, 이 두가지의 성적은 모두 동차 없이 순위가 정해집니다. N명의 면접자가 있다면, 1위부터 N위까지말이죠. 예를 들어서 3명의 면접자가 있고, 순위가 (1, 3) (2, 2) (3, 1) 이었다면, (1, 3)위 한 사람은 다른 두 직원에 비해서 첫번째 성적이 좋으므로 채용됩니다. (2, 2)한 면접자는 (1, 3) 면접자에 비해서는 두번째 시험성적이, (3, 1) 면접자에 비해서는 첫번째 시험성적이 좋아서 채용되죠. (3, 1) 면접자는 다른 두 면접자에 비해서 두번째 성적이 좋아서 채용됩니다. 이것을 저는 탐욕적 기법을 통.. 2022. 11. 29.
728x90