본문 바로가기
코딩테스트/Java

[Programmers] 겹치는 선분의 길이

by Coarti 2024. 4. 23.
    // 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