[HackerRank] Priyanka and Toys

아르당·2024년 5월 20일

HackerRank

목록 보기
90/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

Problem

프리양카는 컨테이너로 배송하는 국제 장난감회사에서 일하고 있다. 그녀의 작업은 그녀의 배송 주문을 결합하여 가장 저렴한 방법을 결정하는 것이다. 그녀는 아이템 무게의 목록을 가지고 있다. 배송 회사는 컨테이너에 적재되는 모든 아이템이 4단위 더한 무게보다 작거나 같아야 한다는 요구사항을 가지고 있다. 모든 아이템은 하나의 컨테이너로 배송돼야 하는 요구사항에 직면한다.
주어진 무게 목록을 기준으로 아이템을 배송하기 위해 계약할 수 있는 최소 컨테이너 수는 몇 개인가?
예들 들어, 무게 w = [1, 2, 3, 4, 5, 10, 11, 12, 13]의 아이템들이 있다. 이것은 두 개의 컨테이너 [1, 2, 3, 4, 5]와 [10, 11, 12, 13]으로 나눌 수 있다. 각 컨테이너는 최소 무게 항목에서 4단위 이내의 무게를 가진 항목들을 포함하게 된다.

Function Description

toys 함수를 완성해라. 배송에 필요한 가장 적은 컨테이너의 수를 반환해야 한다.
toys 함수는 아래와 같은 매개변수를 가지고 있다.

  • w: 각 배송할 주문의 무게를 나타내는 정수형 배열

Constraints

  • 1 <= n <= 10^5
  • 0 <= w[i] <= 10^4
  • i ∈ [1, n]

Solved

아래와 같은 순서로 문제를 해결했다.

  1. 오름차순으로 정렬한다.
  2. 기준이 될 아이템의 무게를 가져온다.
  3. 다음 아이템의 무게가 기준 무게에 4를 더한 값의 범위내라면 넘어가고, 그렇지 않다면 컨테이너를 증가시킨다.
  4. 무게의 범위가 바뀌었기 때문에 기준 무게를 바꿔준다.

먼저 주어진 리스트 w를 오름차순으로 정렬한다.

w.sort(Comparator.naturalOrder());

정수 container를 선언하고 1을 할당한다. 처음 기준이 될 아이템은 무조건 컨테이너에 실리기 때문이다. 그리고 정수 weight를 선언하고 w의 0번째 인덱스 값을 할당한다. 기준이 될 무게를 계속 바꿔주기 위함이다.

int container = 1;
int weight = w.get(0);

for문을 통해 w의 1번째부터 w의 사이즈만큼 반복한다. 이때 if문을 통해 무게가 weight와 weight + 4 사이에 있는지 확인한다. 그리고 범위에 있지 않다면 cotainer를 증가시키고 weight를 해당 인덱스 값으로 할당한다.

for(int i = 1; i < w.size(); i++){
	if(w.get(i) < weight || weight + 4 < w.get(i)){
		container++;
		weight = w.get(i);
	}
}

마지막으로 container를 반환한다.

return container;

All Code

public static int toys(List<Integer> w) {

	w.sort(Comparator.naturalOrder());

	int container = 1;
	int weight = w.get(0);

	for(int i = 1; i < w.size(); i++){
		if(w.get(i) < weight || weight + 4 < w.get(i)){
			container++;
			weight = w.get(i);
		}
	}

	return container;
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글