Organizing Containers of Balls
해커랭크 문제 풀이
📝 Organizing Containers of Balls (30.0)
주어진 2차원 container 배열을 따라
각 container ballType의 갯수에 따라 분배되는데
공을 교환해서 각 컨테이너가 가질수 있는 ballType이 한가지가 될 수 있는 경우
Possible/Impossible
을 출력하는 문제 였다.
💣 헤맸던 점
문제 푸는 시간 자체는 얼마 안걸렸는데
- Each container contains only balls of the same type.
- No two balls of the same type are located in different containers.
문장해석을 실수 해서 시원하게 한번에 풀진 못했다.
처음에 이해한 문제는
0c 1c 2c 각 컨테이너 번호 당 가지고있는 공을
0타입 1타입 2타입 이라고 봤을때 같은 번호의 공을 가지고 있어야하는 조건으로 판단해서
각 컨테이너당 가지고 있는 자신이 아닌 번호의 ballType을 집계하고
다른 컨테이너에 있는 자신의 타입 ballType 공 갯수가 같을때를 Possible
로 보고 풀었다.
Submit하고 풀었는데 이번 예제는 TestCase가 너무 터무니없이 나와있어서 어디서 틀렸는지 많이 해맸다.
풀이에서 나오듯 ArrayList 객체를 만들어서 풀었는데
처음에는
if문 조건 판별시 **ArrayList.get(index)**로 작성했는데
조건에 상관없이 무조건 true로 판정되어 Impossible이 리턴되는 문제가 있었다.
Int와 int의 차이, 레퍼런스 타입의 문제를 놓쳐 시간을 조금 잡아먹었는데
자바에서 첫글자가 대문자 -> 클래스 -> 레퍼런스
counting.get(index).intValue() != ballType.get(index).intValue()
이나
int 변수를 초기화해 사용해 풀었다.
💡 풀이
static String organizingContainers(int[][] container) {
List<Integer> ballType = new ArrayList<>();
List<Integer> counting = new ArrayList<>();
for(int x=0; x<container.length; x++){
int count = 0;
for(int y=0; y<container[x].length; y++){
count += container[x][y];
}
counting.add(count);
}
for(int i=0; i<container.length; i++){
int ball = 0;
for(int j=0; j<container[i].length; j++){
ball += container[j][i];
}
ballType.add(ball);
}
Collections.sort(counting);
Collections.sort(ballType);
for (int k = 0; k < counting.size(); k++) {
int contain = counting.get(k);
int type = ballType.get(k);
if (contain != type) {
return "Impossible";
}
}
return "Possible";
}
예제를 보고 몇번 대입해보니 문제자체는 쉬웠다.
각 컨테이너가 가지고있는 공의 갯수를 구한뒤
각 ballType마다 공의 갯수를 구해
컨테이너들이 가지고있는 공의 갯수와 ballType의 공의 갯수가 일치한다면
Possible 일치하지않는다면 Impossible을 리턴하는것으로 풀었다.