문제
https://www.hackerrank.com/challenges/organizing-containers-of-balls/problem
Swap을 통해서 하나의 컨테이너에 하나의 타입만 놓을 수 있는 지 판단하는 문제다.
풀이
완전 탐색으로 문제를 풀 수 있을 것 같은데 시간 복잡도가 너무 많이 나올 것 같은 문제는 보통 DP 아니면 그리디인 경우가 많은데,
이 문제는 점화식으로 풀 수 없을 것 같아 그리디로 생각을 하고 접근하였다.
방법은
해당 타입의 공을 하나의 컨테이너로 옮겼다는 가정하에 결과가 일치하는지 확인하면 된다.
알고리즘 순서
1. 열의 총합을 구한다.(컨테이너가 가지는 공 총합)
2. 행의 총합을 구한다.(타입 공이 한쪽으로 몰릴 경우 총합)
3. 오름 차순으로 정렬
4. 컨테이너가 가지는 공의 총합 = 타입 공이 한쪽으로 몰릴경우 총합 이면 Possible 아니면 Impossible
<OrganizingContainers 코드>
public static String organizingContainers(List<List<Integer>> container) {
// Write your code here
int n = container.size();
long[] sumRow = new long[n];
long[] sumCol = new long[n];
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
sumCol[i] += container.get(i).get(j);
sumRow[i] += container.get(j).get(i);
}
}
Arrays.sort(sumCol);
Arrays.sort(sumRow);
for(int i = 0 ; i < n ; i++){
if(sumCol[i] != sumRow[i]){ return "Impossible";}
}
return "Possible";
}
'알고리즘 공부 > 탐욕알고리즘(Greedy)' 카테고리의 다른 글
[백준] 9576 책 나눠주기 <Java> - 이분매칭, greedy (0) | 2022.01.07 |
---|---|
[해커랭크] non-divisible-subset (0) | 2021.11.19 |
[백준] 1461 도서관 (0) | 2021.08.22 |
[프로그래머스] 단속카메라 (0) | 2021.06.07 |
[프로그래머스] 섬 연결하기 - *크루스칼알고리즘 (0) | 2021.05.30 |