백준 90

[백준] 11376 열혈강호2

문제 강호네 회사에는 직원이 N명이 있고, 해야할 일이 M개가 있다. 직원은 1번부터 N번까지 번호가 매겨져 있고, 일은 1번부터 M번까지 번호가 매겨져 있다. 각 직원은 최대 두 개의 일을 할 수 있고, 각각의 일을 담당하는 사람은 1명이어야 한다. 각각의 직원이 할 수 있는 일의 목록이 주어졌을 때, M개의 일 중에서 최대 몇 개를 할 수 있는지 구하는 프로그램을 작성하시오. 풀이 열혈강호 1번 문제를 2번 돌리는 방식을 이용하였다. https://conpulake.tistory.com/261 [백준] 11375 열혈강호 - 이분매칭 문제 강호네 회사에는 직원이 N명이 있고, 해야할 일이 M개가 있다. 직원은 1번부터 N번까지 번호가 매겨져 있고, 일은 1번부터 M번까지 번호가 매겨져 있다. 각 직원..

[백준] 9576 책 나눠주기 <Java> - 이분매칭, greedy

문제 백준이는 방 청소를 하면서 필요 없는 전공 서적을 사람들에게 나눠주려고 한다. 나눠줄 책을 모아보니 총 N권이었다. 책이 너무 많기 때문에 백준이는 책을 구분하기 위해 각각 1부터 N까지의 정수 번호를 중복되지 않게 매겨 두었다. 조사를 해 보니 책을 원하는 서강대학교 학부생이 총 M명이었다. 백준이는 이 M명에게 신청서에 두 정수 a, b (1 ≤ a ≤ b ≤ N)를 적어 내라고 했다. 그러면 백준이는 책 번호가 a 이상 b 이하인 책 중 남아있는 책 한 권을 골라 그 학생에게 준다. 만약 a번부터 b번까지의 모든 책을 이미 다른 학생에게 주고 없다면 그 학생에게는 책을 주지 않는다. 백준이가 책을 줄 수 있는 최대 학생 수를 구하시오. 풀이 우선 이분매칭의 방식으로 풀었다. 이분 매칭 방식은 ..

[백준] 11375 열혈강호 - 이분매칭

문제 강호네 회사에는 직원이 N명이 있고, 해야할 일이 M개가 있다. 직원은 1번부터 N번까지 번호가 매겨져 있고, 일은 1번부터 M번까지 번호가 매겨져 있다. 각 직원은 한 개의 일만 할 수 있고, 각각의 일을 담당하는 사람은 1명이어야 한다. 각각의 직원이 할 수 있는 일의 목록이 주어졌을 때, M개의 일 중에서 최대 몇 개를 할 수 있는지 구하는 프로그램을 작성하시오. 풀이 이 문제는 DFS 를 이용해서 브루트포스 알고리즘으로 해결하려 했으나 시간 초과가 났다. 이를 조금 변형하면 되는 문제였다. 이 문제는 이분매칭(Bipartite Matching) 알고리즘을 사용하는 데 네트워크 플로우와 연계되는 개념이라고 한다. 이분매칭이란? A 집단이 B 집단을 선택하는 방법에 대한 알고리즘이다. 다시 문제..

알고리즘 공부 2022.01.07

[백준] 15681 트리와 쿼리 <Java> - 트리에서 DP

문제 간선에 가중치와 방향성이 없는 임의의 루트 있는 트리가 주어졌을 때, 아래의 쿼리에 답해보도록 하자. 정점 U를 루트로 하는 서브트리에 속한 정점의 수를 출력한다. 만약 이 문제를 해결하는 데에 어려움이 있다면, 하단의 힌트에 첨부한 문서를 참고하자. 풀이 풀이는 문제에서 설명하는대로 구현을 하였다 코드를 보면서 설명을 하면, public static void makeTree(int currentNode, int parentNode) { for(int node : tree[currentNode]) { if(node != parentNode) { child[currentNode].add(node); parent[node] = currentNode; makeTree(node, currentNode); ..

[백준] 1038 감소하는 수 <Java> - 브루트포스, 백트래킹

문제 음이 아닌 정수 X의 자릿수가 가장 큰 자릿수부터 작은 자릿수까지 감소한다면, 그 수를 감소하는 수라고 한다. 예를 들어, 321과 950은 감소하는 수지만, 322와 958은 아니다. N번째 감소하는 수를 출력하는 프로그램을 작성하시오. 0은 0번째 감소하는 수이고, 1은 1번째 감소하는 수이다. 만약 N번째 감소하는 수가 없다면 -1을 출력한다. 풀이 10 이하의 수는 수와 동일한 N번째 값을 가진다. 10 초과의 수는 감소하는 수 전체 리스트를 구한 뒤 N번째 수를 출력하는 방식을 사용하였다. 감소하는 수를 구하는 방식은 재귀를 이용하여 구하였다. for(int i = 0 ; i i) { calculator((num * 10) + (long)i..

[백준] 10830 행렬 제곱 <Java>

문제 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. 풀이 분할정복을 통해서 풀이를 하면 되는 문제다. 시간을 줄이기 위해서 A^4 = A * A * A * A 로 푸는 것이 아니라 A^4 = A^2 * A^2 의 방식으로 문제를 풀었다. 이때 문제가 되는것은 지수가 홀 수 일 경우다. A^5 = A^4 * A 와 같이 짝수의 거듭제곱에 기존의 A를 한번더 곱해주는 방식으로 구현을 하였다. 분할정복의 풀이에 맞게 재귀로 나눠주면서 가장 마지막에 도착했을 때 값을 곱해서 나아가는 방식으로 풀면된다. 기존의 합병정렬의 방식을 생각하면 편하다. 우선 위의 방식의 코드를 보여주면 st..

[백준] 1766 문제집 <Java>

문제 민오는 1번부터 N번까지 총 N개의 문제로 되어 있는 문제집을 풀려고 한다. 문제는 난이도 순서로 출제되어 있다. 즉 1번 문제가 가장 쉬운 문제이고 N번 문제가 가장 어려운 문제가 된다. 어떤 문제부터 풀까 고민하면서 문제를 훑어보던 민오는, 몇몇 문제들 사이에는 '먼저 푸는 것이 좋은 문제'가 있다는 것을 알게 되었다. 예를 들어 1번 문제를 풀고 나면 4번 문제가 쉽게 풀린다거나 하는 식이다. 민오는 다음의 세 가지 조건에 따라 문제를 풀 순서를 정하기로 하였다. N개의 문제는 모두 풀어야 한다. 먼저 푸는 것이 좋은 문제가 있는 문제는, 먼저 푸는 것이 좋은 문제를 반드시 먼저 풀어야 한다. 가능하면 쉬운 문제부터 풀어야 한다. 예를 들어서 네 개의 문제가 있다고 하자. 4번 문제는 2번 문..

[백준] 17412 도시왕복하기 1 - 네트워크 플로우 알고리즘(에드몬드 카프 알고리즘)

문제 N개의 도시가 P개의 단방향 길로 연결되어 있다. 이석원은 1번 도시와 2번 도시 사이를 가며 워해머를 한다. 성실한 이석원은 1번에서 2번으로 가는 서로 다른 경로를 최대한 많이 찾으려고 하는데, 이때 한 경로에 포함된 길이 다른 경로에 포함되면 안된다. 입력에는 1번 도시와 2번 도시를 연결하는 길은 없다. 도시의 번호는 1번부터 N번까지이다. 풀이 문제가 다소 불친절하게 설명 돼있어서조금 더 부연설명을 하자면, 한 경로에 포함된 길이 다른 경로에 포함되면 안된다라는 말은 해당 노드로 들어오는 간선의 수만큼 다른 노드로 갈 수 있다. 이 때 만들 수 있는 경로의 최선의 값을 찾는 것이다. 이문제는 네트워크 플로우 알고리즘을 알아야 이해하기 쉽다. https://m.blog.naver.com/Po..

[백준] 2515 거울설치

문제 채영이는 거울을 들여다보는 것을 참 좋아한다. 그래서 집 곳곳에 거울을 설치해두고 집 안을 돌아다닐 때마다 거울을 보곤 한다. 채영이는 새 해를 맞이하여 이사를 하게 되었는데, 거울을 좋아하는 그녀의 성격 때문에 새 집에도 거울을 매달만한 위치가 여러 곳 있다. 또한 채영이네 새 집에는 문이 두 개 있는데, 채영이는 거울을 잘 설치하여 장난을 치고 싶어졌다. 즉, 한 쪽 문에서 다른 쪽 문을 볼 수 있도록 거울을 설치하고 싶어졌다. 채영이네 집에 대한 정보가 주어졌을 때, 한 쪽 문에서 다른 쪽 문을 볼 수 있도록 하기 위해 설치해야 하는 거울의 최소 개수를 구하는 프로그램을 작성하시오. 거울을 설치할 때에는 45도 기울어진 대각선 방향으로 설치해야 한다. 또한 모든 거울은 양면 거울이기 때문에 양..

[백준] 7662 이중 우선순위 큐

문제 이중 우선순위 큐(dual priority queue)는 전형적인 우선순위 큐처럼 데이터를 삽입, 삭제할 수 있는 자료 구조이다. 전형적인 큐와의 차이점은 데이터를 삭제할 때 연산(operation) 명령에 따라 우선순위가 가장 높은 데이터 또는 가장 낮은 데이터 중 하나를 삭제하는 점이다. 이중 우선순위 큐를 위해선 두 가지 연산이 사용되는데, 하나는 데이터를 삽입하는 연산이고 다른 하나는 데이터를 삭제하는 연산이다. 데이터를 삭제하는 연산은 또 두 가지로 구분되는데 하나는 우선순위가 가장 높은 것을 삭제하기 위한 것이고 다른 하나는 우선순위가 가장 낮은 것을 삭제하기 위한 것이다. 정수만 저장하는 이중 우선순위 큐 Q가 있다고 가정하자. Q에 저장된 각 정수의 값 자체를 우선순위라고 간주하자. ..