c_MaxNonoverlappingSegments

source app.codility.com/programmers/lessons/...
type 📌 개발노트
topics 600-알고리즘 & 코딩테스트 602 그리디
types 문제풀이
정답여부 틀림

문제

선분 N개가 한줄에 위치
이미 end 가 앞인순으로 나열되어있음
A : 시작 ,B: 끝 ,끝점을 기준으로 정렬
겹치는 경우 겹치지 않는경우
A[I] ≤ A[J] ≤ B[I] 또는 A[J] ≤ A[I] ≤ B[J]
최대로 겹치지않는 세트를 구한다.

Wrong Answer

각 선들마다 겹치는 선을구한다음에
겹치는선이 적은순으로 정렬해서 선택한다.
퍼포 엄청구리고 답도틀림. 내생각에는 sort시에 length뿐만아니라 index순의 조건을 추가해야한다고생각한다

function solution(A, B) {
    let line = []
    let end = []
    for(let i =0;i<A.length;i++){
        line.push([i])
        end.push(B[i])
        let toggle = false
        for(let j =0;j<i;j++){
            if(!toggle && end[j]>=A[i]) toggle= true;
            if(toggle){ 
                line[j].push(i);
                line[i].push(j);
            }
        }
    }
    line.sort((a,b)=>a.length-b.length)
    let used = new Set([...line[0]]);
    let ans = 1;
    for(let i =1;i<A.length;i++){
        if(!used.has(line[i][0])){
            ans++;
            used = new Set([...used,...line[i]])
        }
    }
    return ans
}

Right Answer

걍끝점이랑 시작점이랑 겹치지않는수를 count하면된다.

function solution(A, B) {
    const N = A.length;
    let res = 1;

    if (N <= 1) {
        return N;
    }

    let start = 0;
    for (let i = 1; i < N; i++) {
        if (B[start] < A[i]) {
            res++;
            start = i;
        }
    }

    return res;
}

시작점기준으로정렬을 안해도된다!

ex
1-3
4-5 끝점 3 > 5
2-5 안됨

1-3
2-5 끝점 겹침 적용ㄴㄴ 3
4-5 끝점 3 > 5