티스토리 뷰
어릴 때 닌텐도 DS로 플레이했던 레이튼 박사 시리즈가 생각이 나는 문제...ㅋㅋ
아마 배열의 첫 인자부터 차례차례 남은 인자들과 합쳐서 limit를 넘는 순간 타고 빠지게끔? 작성하면 풀릴 거 같다.
package com.choonham;
class Solution {
public int solution(int[] people, int limit) {
int answer = 0;
int sum = 0;
int count = 0;
for (int i = 0; i < people.length; i++) {
if (people[i] != 0) {
sum += people[i];
people[i] = 0;
if (i != people.length - 1) {
for (int j = people.length - 1; j > i; j--) {
if (people[j] <= limit - sum) {
sum += people[j];
people[j] = 0;
}
}
}
count++;
sum = 0;
}
}
answer = count;
return answer;
}
}
"스승님, 첫 시도에 이뤄지는 꿈을 꾸었어요..."
"근데 왜 울고 있는 것이냐?"
그 꿈은 어림도 없기 때문입니다...(으악!!)
이렇게 풀면 안되는 거 같다.
아마 가장 효율적인 경우를 찾는 방법이 아예 틀린 거 같다. 위 코드를 오름차순으로 정렬된 수에 대입하면 거의 100% 결과 값이 다르게 나온다. 또한 이중 for문은 이 문제가 원하는 답이 아닌 거 같다.
입력의 일관성을 위해 그럼 우선적으로 people배열을 정렬을 해줄 필요가 있다.
또한 이중 for문을 사용하지 않는 대신에, 가장 큰 수(rifht)와 가장 작은 수(left)를 각각 더해서 limit와 비교하여 바깥쪽에서 안쪽으로 연산을 진행해주면, 최적의 해를 얻을 수 있을 거 같다.
바로 해보자.
package com.choonham;
import java.util.Arrays;
class Solution {
public int solution(int[] people, int limit) {
int answer = 0;
int count = 0;
int sum = 0;
Arrays.sort(people); //오름차순 정렬
int right = people.length - 1;
int left = 0;
while (left < right) { //바깥쪽에서 안쪽으로
sum = people[right] + people[left];
if (limit < sum) { //한명만 타는 경우
right--;
} else { //두명 이상 탈 수 있는 경우
right--;
left++;
}
count++; // 보트 출발
}
if (right == left) //가장 안쪽에 한명이 남았다면,
count++; //태우고 출발
answer = count;
return answer;
}
}
"스승님...."
"울지마라"
결론: 나는 아직 멍청하다.
반응형
'[JAVA] > Programmers' 카테고리의 다른 글
[JAVA] Programmers <Greedy LV3> 섬 연결하기 (0) | 2021.04.15 |
---|---|
[JAVA] Programmers <Greedy LV2> 큰 수 만들기 (0) | 2021.04.12 |
[JAVA] Programmers <Greedy LV2> 조이스틱 (0) | 2021.04.09 |
[JAVA] Programmers <Greedy LV1> 체육복 (0) | 2021.04.08 |
[JAVA] Programmers <완전 탐색 LV2> 카펫 (0) | 2021.04.06 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- react
- await
- Async
- 인천 구월동 맛집
- 정보보안기사 #실기 #정리
- 파니노구스토
- Promise
- 이탈리안 레스토랑
- 맛집
- redux
- redux-thunk
- AsyncStorage
- javascript
- react-native
- 인천 구월동 이탈리안 맛집
- Total
- Today
- Yesterday