// imos 사용
public int solution(int[][] lines) {
int[] cnts = new int[201]; // 전체 범위 기준
for (int[] line : lines) { // 처음 점(1)과 끝 점(-1)을 표시, 점만 찍었으니 중간은 비어있음
++cnts[line[0] + 100]; // 값을 인덱스화
--cnts[line[1] + 100]; // 값을 인덱스화
}
int ans = cnts[0] > 1 ? 1 : 0; // 아래 for문에서 1부터 시작하므로 초기값 설정
for (int i = 1; i < 201; ++i) { // 누적합
cnts[i] += cnts[i - 1]; // 직전 인덱스 값을 더한다(직선을 그린다고 생각하면 됨. 만약, 겹쳐진 부분이라면 2 이상이 될것이다.)
if (cnts[i] > 1) ++ans; // 2 이상이면 겹쳐진 부분이므로 카운트
}
return ans;
}
// 이것을 Map으로 풀 수 있다.
// 직선 하나씩 맵에 넣어서 겹치는 부분을 찾는다.
public int solution2(int[][] lines) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int[] line : lines) {// 직선 하나 가져온다(좌표값)
for (int i = line[0]; i < line[1]; i++) { // 좌표 시작값 부터 끝값 직전까지 맵에 넣기
map.put(i, map.getOrDefault(i, 0) + 1);
}
}
// 아래 스트림 대신 가능
// int answer = 0;
// for (int v : map.values()) {
// if (v > 1) {
// answer++;
// }
// }
// return answer;
return (int) map.values().stream().filter(v -> v > 1).count(); // 2 이상인 값들을 카운트
}
IMOS 법은 정해진 구간 내에서 누적합을 구하는 방법이다. 구간은 시간, 길이, 범위 등이 될 수 있으며 시작값과 끝값이 있는 데이터를 표시해 구간내 처음부터 끝가지 직전값을 더하며 중첩된 값을 시각적으로 볼 수 있다.
출입, 매출, 시계열 데이터 분석에 사용된다.
728x90
'코딩테스트 > Java' 카테고리의 다른 글
[CodeTree]조건에 부합하는 수 (0) | 2024.08.06 |
---|---|
[Programmers] OX퀴즈 (0) | 2024.04.23 |
[Programmers] 안전지대 (0) | 2024.04.23 |
[Programmers] 평행 (0) | 2024.04.23 |
[Programmers] 영어끝말잇기 (0) | 2023.07.25 |