몸과 마음이 건전한 SW 개발자

프로그래머스 [Lv. 2] 요격 시스템 {언어 : JavaScript} [2024.04.16 수정, 반례 추가] 본문

알고리즘

프로그래머스 [Lv. 2] 요격 시스템 {언어 : JavaScript} [2024.04.16 수정, 반례 추가]

스위태니 2024. 4. 2. 02:54

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/181188

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

기존 코드

function solution(targets) {
    let answer = 0;
    targets.sort(([s1, e1], [s2, e2]) => (e1 - e2) || (s1 - s2));
    let [start, end] = [0, 0];
    targets.forEach(([s, e]) => {
        if (s >= end) {
            end = e;
            answer += 1
        }
    })
    return answer;
}

수정된 코드 2024.04.16

function solution(targets) {
    let answer = 0;
    targets.sort(([s1, e1], [s2, e2]) => (e1 - e2) || (s1 - s2));
    let [start, end] = [0, 0];
    targets.forEach(([s, e]) => {
        if (s >= end) {
            start = s;
            end = e;
            answer++;
        } else if (start == s && end == e) {
            answer++;
        };
    })
    return answer;
}

반례

Parameters : [[620, 750], [620, 750], [620, 750]]
Return : 3

풀이 방법

  1. 파이썬의 람다식 처럼 target의 1번째 인덱스 값, 0번째 인덱스 값을 순서대로 정렬한다.
    1. [[4, 5], [4, 8], [10, 14], [11, 13], [5, 12], [3, 7], [1, 4]] (원본)
    2. [[1, 4], [4, 5], [3, 7], [4, 8], [5, 12], [11, 13], [10, 14]] (정렬 후)
    3. 이해가 쉽게 파이썬으로 예를 들면
      1. targets.sort(key=lambda x: (x[1], x[0]))
  2. 정렬 이후에 end값을 s값과 비교해주면서 범위를 벗어 났을 때만 end를 e로 교체한다.
    1. 교체하는 타이밍에 answer를 +1 해주면 끝

느낀점

  • 이런 문제가 더 어려운 것 같다...