본문 바로가기
Algorithm/문제풀이

[HackerRank] Organizing Containers of Balls (Medium) by javascript

by 썸머워즈 2022. 8. 3.
반응형

▷ 문제 : Organizing Containers of Balls (Medium)

 

Organizing Containers of Balls | HackerRank

Determine if David can perform some sequence of swap operations such that each container holds one distinct type of ball.

www.hackerrank.com

▷ 해결 날짜 : 2022.08.03
▷ 소요 시간 : 1시간 20분
▷ 풀이 과정 :

일단 문제가 참 긴데, 쉽게 설명하자면 컨테이너가 담긴 배열이 주어지고, 각 컨테이너별로 서로 다른 타입의 공들이 들어가 있는데, 이 공들을 같은 타입끼리 각 컨테이너에 넣을 수 있냐 없냐를 구하는 문제이다.

 

몇가지만 짚고 넘어가면 구현하는데에는 그렇게 큰 시간이 들지는 않는다.

  • 각 컨테이너의 크기는 처음에 주어진 공의 총개수와 동일하다. (이유가 뭐냐면 문제에서는 한번에 서로 다른 컨테이너 각각의 공들을 스왑 할 수 있다 뭐다 하면서 설명이 들어가 있는데, 이런 조건이면 무조건 스왑만 가능하다는 조건이고 크기는 초기에 주어진 각 컨테이너 공의 개수를 따른다는 것을 알 수 있다.)
  • 한 컨테이너에는 타입이 동일한 공으로만 채워줘야 한다. (즉, 특정 컨테이너의 크기와 특정 타입을 가진 공의 개수가 동일해야 한다는 점이다.)

위에서 설명한 것들을 염두에 두고 구현을 진행하게 되면,

  1. 우선 각 컨테이너의 크기(각 컨테이너의 공 개수)와 동일한 타입의 공 개수를 구해서 담아준다.
  2. 위에서 설명한 것 처럼 결국 "특정 컨테이너 크기 === 특정 타입을 가진 공의 개수" 여야 하기 때문에, 우선 정렬을 해준 뒤 비교를 해주기만 하면 된다.


▷ 구현

function organizingContainers(container) {
  // Write your code here
  const totalBallCount = container.map((v) => v.reduce((a, c) => a + c));
  const totalBallTypeCount = Array(container[0].length).fill(0);
  for (let i = 0; i < container.length; i++) {
    for (let j = 0; j < container.length; j++) {
      totalBallTypeCount[i] += container[j][i];
    }
  }

  totalBallCount.sort((a, b) => a - b);
  totalBallTypeCount.sort((a, b) => a - b);

  return totalBallCount.every((v, i) => v === totalBallTypeCount[i])
    ? "Possible"
    : "Impossible";
}


▷ 복기 :

나 같은 경우는 아무래도 영어라 읽기 힘든데, 문제까지 길고 해서 이해하는데 시간이 좀 걸렸다.

좀 생각이 필요한 문제인데, 그래도 적절한 조건들이 전부 나와있어서 문제를 이해만 한다면 손쉽게 해결할 수 있는 문제였다.

반응형


댓글

TOP