기업별 빈출 알고리즘 문제집에 있는 문제들을 풀어나가고 있다.
코테를 꽤나 본 입장에서 정말 자주 만났던 문제라 한 번씩 정리하려고 해당 포스팅을 작성한다.
정렬 + 그리디
일 확률이 크다.시작점을 기준으로 두고, 현재 선분이 이전 선분과 비교해서 겹치는 지, 아닌지만 판별하면 된다.
끝점은 관계없다.
정렬되지 않아도 그 이후에Math.min
으로 비교해주기 때문.
import java.util.*;
import java.io.*;
class Solution {
static class Line implements Comparable<Line> {
int s;
int e;
Line(int s, int e) {
this.s = s;
this.e = e;
}
@Override
public int compareTo(Line o) {
return this.s - o.s;
}
}
public int solution(int[][] targets) {
int answer = 0;
List<Line> lines = new ArrayList<>();
for(int i = 0; i < targets.length; i++) {
lines.add(new Line(targets[i][0], targets[i][1]));
}
Collections.sort(lines);
int nowS = 0;
int nowE = 0;
for(Line l : lines) {
// 안겹칠때
if(nowE <= l.s) {
answer++;
nowS = l.s;
nowE = l.e;
} else {
nowS = Math.max(nowS, l.s);
nowE = Math.min(nowE, l.e);
}
}
return answer;
}
}
정렬 기준만 금방 확인했다면 5분안에 풀었을 문제이고, 실전에서 만나면 그렇게 해야한다..