momo study(23.01.20)
오늘 스터디 활동내용은
1.코플릿 알고리즘 문제 1,2,3번을 복습
2.4번 문제를 풀어본 후 레퍼런스 코드 및 풀이 영상 시청
3.객체지향 프로그래밍 기초 복습
까지 진행했다.
2,3번은 푸는데 성공했고, 1번은 의사코드는 적절했지만 코드로 옮기는 부분이 서툴러 결국 풀지 못했고, 4번은 굉장히 어려워서 포기했었다.(솔직히 4번은 레퍼런스 코드와 풀이 영상까지 보고 왔는데도 이해가 잘 안 간다... DP 개념을 알고리즘 문제화시킨 녀석이었는데... 상당히 어렵다)
1번 문제를 간단히 소개하고 어떤 부분에서 부족했는지 짚고 넘어가보자
조건
짐의 무게를 담은 배열 stuff와 박스의 무게 제한 limit가 매개변수로 주어질 때, 모든 짐을 옮기기 위해 필요한 박스 개수의 최소값을 return 하도록 movingStuff 함수를 작성하세요.
입력
인자 1: stuff
- int 타입의 40 이상 240 이하의 자연수를 담은 배열 ex) [70, 50, 80, 50]
인자 2: limited
- int 타입의 40 이상 240 이하의 자연수
출력
- int 타입을 리턴해야 합니다.
- 모든 짐을 옮기기 위해 필요한 박스 개수의 최솟값을 숫자로 반환합니다.
주의사항
- 옮겨야 할 짐의 개수는 1개 이상 50,000개 이하입니다.
- 박스의 무게 제한은 항상 짐의 무게 중 최대값보다 크게 주어지므로 짐을 나르지 못하는 경우는 없습니다.
입출력 예시
1
2
3
4
5
|
int output = movingStuff(new int[]{70, 50, 80, 50}, 100);
System.out.println(output); // 3
int output = movingStuff(new int[]{60, 80, 120, 90, 130}, 140);
System.out.println(output); // 4
|
cs |
문제 풀이
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import java.util.*;
public class Solution {
public int movingStuff(int[] stuff, int limit) {
// 박스에는 최대 2개의 짐을 넣을 수 있다
// 2개의 짐을 넣을 때 무게 제한이 있다
// 무게 제한을 초과하면 같이 넣을 수 없다
// 박스를 최대한 적게 사용하여 모든 짐을 옮기는 것이 목표
// 짐의 무게 stuff[] (요소는 40이상 240이하 길이는 5만 이하)
// 박스 무게 제한 limit (40이상 240이하)
// stuff[i] < limit
//오름차순 정렬
Arrays.sort(stuff);
// //stuff를 list로 만들기
// List<Integer> result = new ArrayList<>(stuff);
Arrays.stream(stuff);
List<Integer> result = new ArrayList<>(stuff);
//result에서 최솟값 최댓값 구하고
int max = result[result.length-1];
int min = result[0];
int count = 0;
//반복문
for (int i = 0; i < stuff.length; i++){
//최솟값+최댓값이 > limit -> 최댓값을 배열에서 빼주면서 count++
if((min+max) > limit) {
result.remove(max);
count++;
}
//최솟값+최댓값이 <= limit -> 최솟값과 최댓값을 배열에서 빼주면서 count++
else if((min+max) <= limit){
result.remove(min);
result.remove(max);
count++;
}
//stuff.length==1 count++
else if(result.length == 1) count++;
//stuff.length==0 {} break;
else {
}break;
}
return count;
}
}
|
cs |
int[] stuff를 result에 복사해서 result의 min과 max값을 반복문을 통해 순회하면서 지워나가고, 올바른 경우에만 count를 올려주면서 반환하고자 하였지만, 18번 줄의 stuff배열의 리스트화 부터 꼬이기 시작했다.
내가 찾아본 해결법은
1.stream을 사용해 배열을 박싱하고 아랫줄에서 언박싱으로 가져오기 - 동기분의 조언
2.반복문을 순회하면서 stuff배열내에서 요소를 지워나가는게 목적이니 Arrays.copyOfRange활용하기 - 구글링
두 가지가 있었지만 1번은 박싱의 개념 자체는 알겠지만 어떻게 적용하는게 좋을지 몰라서 풀다가 포기했고, 2번은 28번줄을 예로들면 stuff = Arrays.copyOfRange(stuff, 0, stuff.length()-1)을 넣어봤지만 역시 해결하지 못했다.
레퍼런스 코드를 확인한 결과 의사코드 내용이 비슷하면서도 약간 달랐는데