티스토리 뷰
Problem
There is a car with capacity empty seats. The vehicle only drives east (i.e., it cannot turn around and drive west).
You are given the integer capacity and an array trips where trip[i] = [numPassengersi, fromi, toi] indicates that the ith trip has numPassengersi passengers and the locations to pick them up and drop them off are fromi and toi respectively. The locations are given as the number of kilometers due east from the car's initial location.
Return true if it is possible to pick up and drop off all passengers for all the given trips, or false otherwise.
Example 1:
Input: trips = [[2,1,5],[3,3,7]], capacity = 4
Output: false
Example 2:
Input: trips = [[2,1,5],[3,3,7]], capacity = 5
Output: true
Constraints:
- 1 <= trips.length <= 1000
- trips[i].length == 3
- 1 <= numPassengersi <= 100
- 0 <= fromi < toi <= 1000
- 1 <= capacity <= 10^5
Solution
여행 정보를 나타내는 배열과 차에 태울 수 있는 capacity가 주어질 때 모든 승객을 태울 수 있는지 여부를 반환하는 문제입니다.
각 trip은 [n, from, to] n명이 from에서 to까지 이동하는 것을 나타냅니다.
예제 1번을 보면 2명이 1번에서 승차해서 5번에서 하차해야하는데 3명이 3번에서 추가로 승차하려고합니다. 차의 용량은 4명이 한계이기 때문에 false를 반환하게 됩니다.
import java.util.Arrays;
public class Solution {
public boolean carPooling(int[][] trips, int capacity) {
Arrays.sort(trips, (o1, o2) -> o1[1] != o2[1] ? o1[1] - o2[1] : o2[2] - o1[2]);
for (int i = 0; i < trips.length; i++) {
int current = trips[i][0];
for (int j = i - 1; j >= 0; j--) {
if (trips[j][2] > trips[i][1]) {
current += trips[j][0];
}
}
if (current > capacity) {
return false;
}
}
return true;
}
}
trips 배열을 시작 위치, 끝 위치 순으로 정렬한뒤 각 배열을 탐색하며 겹치는 부분이 있을 경우에 현재 탑승객이 capacity 보다 큰지 검사하면 됩니다.
더 간단한 방법을 소개합니다.
미리 승객이 탑승하는 곳과 하차하는 곳을 계산해놓고 최종으로 하차하는 구간까지만 반복하면서 승객의 수를 더해 capacity가 넘지 않는지만 확인해주면 됩니다.
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
int last = 0;
int[] arr = new int[1001];
for (int[] trip : trips) {
int from = trip[1];
int to = trip[2];
int passengers = trip[0];
arr[from] += passengers;
arr[to] -= passengers;
last = Math.max(last, to);
}
int passengers = 0;
for (int i = 0; i < last; i++) {
passengers += arr[i];
if (passengers > capacity) {
return false;
}
}
return true;
}
}
Test
package io.lcalmsky.leetcode.car_pooling;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void testAll() {
assertAll(
() -> test(new int[][]{{2, 1, 5}, {3, 3, 7}}, 4, false),
() -> test(new int[][]{{2, 1, 5}, {3, 3, 7}}, 5, true)
);
}
private void test(int[][] trips, int capacity, boolean expected) {
// when
Solution solution = new Solution();
boolean actual = solution.carPooling(trips, capacity);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
1463. Cherry Pickup II (0) | 2022.01.09 |
---|---|
382. Linked List Random Node (0) | 2022.01.08 |
131. Palindrome Partitioning (0) | 2022.01.06 |
1009. Complement of Base 10 Integer (0) | 2022.01.05 |
997. Find the Town Judge (0) | 2022.01.04 |
- Total
- Today
- Yesterday
- QueryDSL
- @ManyToOne
- Jackson
- Spring Boot
- JPA
- 알고리즘
- 함께 자라기 후기
- JSON
- 함께 자라기
- r
- gRPC
- proto3
- intellij
- 스프링 부트
- 클린 아키텍처
- Spring Boot Tutorial
- leetcode
- 스프링 부트 애플리케이션
- spring boot application
- 스프링 부트 회원 가입
- 헥사고날 아키텍처
- Java
- 스프링 데이터 jpa
- spring boot app
- Spring Boot JPA
- 스프링 부트 튜토리얼
- 스프링부트
- Spring Data JPA
- spring boot jwt
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |