문제 링크
체육복
풀이
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
class Solution {
public static int solution(int n, int[] lost, int[] reserve) {
List<Integer> lostList = Arrays.stream(lost).sorted().boxed().collect(Collectors.toList());
List<Integer> reserveList = Arrays.stream(reserve).sorted().boxed().collect(Collectors.toList());
List<Integer> lenderList = new ArrayList<>();
int cnt = n - lost.length;
for (int j : lost)
if (reserveList.contains(j)) {
lostList.remove((Integer) j);
reserveList.remove((Integer) j);
lenderList.add(j);
cnt++;
}
for (int i : lostList) {
if (reserveList.contains(i - 1) && !lenderList.contains(i - 1)) {
lenderList.add(i - 1);
cnt++;
} else if (reserveList.contains(i + 1) && !lenderList.contains(i + 1)) {
lenderList.add(i + 1);
cnt++;
}
}
return cnt;
}
}
소감
- 이정도면 Stream 를 무지성으로 쓰고 있는게 아닌가 싶은데..
- greedy 알고리즘 문제라고 한다.. 사실 모르고 그냥 풀었다.
- 그런데 문제 풀면서 조건을 제대로 읽는 습관을 들여야겠다. 체육복을 훔침 당한 사람이 체육복 여분이 있는 사람이 될 수 있다는 조건을 확인하지 못하고 풀어서 시간을 한참 써먹었다.
- 체육복을 빌려준 사람들을 확인하기 위해서 새로운 list를 생성했는데, 이 방법 말고도 체육복을 빌려준 사람인 경우 해당 인덱스의 값을 변경하는 방법이 있었다... 역시 멍청하면 모두가 고생한다.