알고리즘 공부 172

[백준] 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

[백준] 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번 문..

[리트코드] 42. Trapping Rain Water <Java>

문제 https://leetcode.com/problems/trapping-rain-water/ Trapping Rain Water - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 풀이 내 풀이 : 왼쪽에서 부터 오른쪽으로 가장 최근에 높았던 높이에서 더 높은 높이를 만나면 그 사이의 값들의 높이차를 더해주었다. 위의 행동을 반대방향으로 한번 더 했다. 이 때, 주의할점은 같은 것을 두번 더하지 않기 위해 HashSet을 이용하여 문제를 풀었다. class S..

[리트코드] 238. Product of Array Except Self <Java>

문제 https://leetcode.com/problems/product-of-array-except-self/ Product of Array Except Self - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 현재 인덱스의 수를 제외한 나머지 수들의 곱을 연산하는 문제( 단, 나눗셈 연산을 사용하지 않는다.) 풀이 문제의 조건이 없다면 모든 nums 배열의 수를 곱한 뒤 현재수를 나누기를 해주면 쉬운 문제지만, 나눗셈 연산을 하지않고 푸는 문제기 때문에 나..

[리트코드] Different Ways To Add Parentheses <Java>

문제 https://leetcode.com/problems/different-ways-to-add-parentheses/submissions/ Different Ways to Add Parentheses - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 수식으로 만들어 낼 수 있는 결과 값의 리스트를 리턴하면 되는 문제 풀이 완전탐색을 이용하여 문제를 푼다. 알고리즘 순서 연산자를 만나면, 연산자 기준으로 왼쪽과 오른쪽을 나눠 재귀적으로 다시 함수에 넣어준다. ..