- 문제: https://school.programmers.co.kr/learn/courses/30/lessons/181188
설명
- 끝나는 구간을 오름차순으로 정렬하고, 범위에 대해 가장 뒤쪽에 요격하여 범위의 최대를 확인한다.
- target 구간을 순회하면서, last가 두 구간 사이라면 무시해도 되므로 다음 구간으로 넘어간다.
왜? 시작 지점 정렬은 필요하지 않는가
어차피! target 구간은 순회하면서 last가 두 구간 사이인지 아닌지만 확인하기 때문이다.
우리의 목표는 last(현재 요격 범위의 마지막 지점)를 기준으로 업데이트해나가는 것이다.
정렬에서 사용한 Java Lamda 함수 이해하기
람다 표현식은 화살표(->) 기호를 이용하여 표현할 수 있다.
(매개변수목록) -> {함수몸체}
람다 표현식 작성 시, 유의할 점
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
- 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있다.
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있다. 이때 세미콜론(;)은 붙이지 않는다.
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없다.
- return 문 대신 표현식을 사용할 수 있고, 이때 반환값은 표현식의 결과값이 된다.
new Thread(new Runnable() {
public void run() {
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
new Thread(()->{
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
lamda로 정렬한 코드를 이해하자.
Arrays.sort(targets, (o1, o2) -> o1[1] - o2[1]);
sort 함수는 기본 타임의 두번째 배열에 정렬 방식을 넣어준다.
정렬은 오름차순으로 수행된다.
두번째 요소가 가장 작은 배열이 가장 먼저 위치하고, 그 다음으로 두번째로 작은 요소를 가진 배열이 위치하게 된다.
+) 더불어 o1, o2의 첫번째 원소를 기준으로 개선하고, 만약 첫번째 원소 값이 같다면 두번째 원소를 가지고 하는 방법은 다음과 같다.
Arrays.sort(targets, (o1, o2) -> {
if(o1[0] != o2[0]) {
return o1[0]-o2[0];
} else {
return o1[1]-o2[1];
}
});
// 조건 연산자 사용
Arrays.sort(targets, (o1, o2) -> o1[0] != o2[0] ? o1[0] - o2[0] : o1[1] - o2[1]);
코드
import java.util.*;
class Solution {
public int solution(int[][] targets) {
int answer = 0;
Arrays.sort(targets, (o1, o2) -> {return o1[1]-o2[1];});
int last = -1;
for (int[] target : targets) {
if(last == -1) {
answer++;
last = target[1] - 1;
continue;
}
if(last >= target[0] && last <= target[1]) {
continue;
}
answer++;
last = target[1] -1;
}
return answer;
}
}
반응형