알고리즘 공부/탐욕알고리즘(Greedy)
[해커랭크] non-divisible-subset
kdhoooon
2021. 11. 19. 00:03
문제
https://www.hackerrank.com/challenges/non-divisible-subset/problem
Non-Divisible Subset | HackerRank
Find the size of the maximal non-divisible subset.
www.hackerrank.com
Given a set of distinct integers, print the size of a maximal subset of where the sum of any 2 numbers in is not evenly divisible by k.
풀이
부분 집합 중에서 두개의 합이 항상 k 로 나눠지면 안되는 문제다.
n < 10 ^ 5 기 때문에 모든 부분집합을 구해서 푸는 방법은 불가능하다.
두개의 합이 k 로 나누어 떨어지기 위해서는 나머지의 합을 보면 알 수 있었다.
3가지 경우의 수가 존재한다.
- 수가 k 로 나누어 떨어지는 경우
- 수가 k / 2 인 경우
- 나머지 합이 k로 나누어 떨어지는 경우
1번의 경우에는 여러개의 수중에서 최대 1개만 부분집합에 포함이 가능하다 ( 2개 이상이 될 경우 합이 k로 나누어 떨어 지기 때문)
2번의 경우에도 여러개의 수중에서 최대 1개만 부분집합에 포함이 가능하다. ( 2개 이상이 될 경우 합이 k로 나누어 떨어지기 때문)
3번의 경우에는 나머지 합이 k 로 나누어 떨어지는 것 중 더 큰 값을 포함 시켜주면 최대를 구할 수 있다.
<전체코드>
public static int nonDivisibleSubset(int k, List<Integer> s) {
// Write your code here
int[] remain = new int[k];
for(int i = 0 ; i < s.size(); i++){
remain[s.get(i) % k]++;
}
int answer = 0;
if(k % 2 == 0){
answer = Math.min(1, remain[k / 2]);
}
answer += Math.min(1, remain[0]);
for(int i = 1 ; i < (k + 1) / 2 ; i++){
if(i != k - i){
answer += Math.max(remain[i], remain[k - i]);
}
}
return answer;
}