Programmers

[프로그래머스][JS] 구명보트 ✅

winter17 2023. 8. 3. 12:16

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

 

프로그래머스

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

programmers.co.kr

풀이 과정

function solution(people, limit) {
    const sorted = people.sort((a, b) => b - a) // 내림차순 정렬
    let cnt = 0 // 보트를 사용한 횟수
    // start와 end는 sorted 배열에 인덱스로 접근
    let start = 0
    let end = people.length - 1
    while(start <= end){
        if (sorted[start] + sorted[end] <= limit){ // 가장 무거운 사람과 가벼운 사람의 합이 limit을 넘지 않는 경우
            start++
            end--
        }else{
            // 가장 무거운 사람만 보트에 탐
            start++
        }
        cnt++ // 위의 조건문을 통과할 때마다 +1
    }
    return cnt;
}

투 포인터 알고리즘을 사용하여 문제를 풀었다. 

people 배열을 내림차순으로 정렬한 뒤, 두 개의 포인터 start, end를 사용하여 처음과 끝을 가리키도록 한다.

두 포인터를 이용하여 가장 무거운 사람과 가장 가벼운 사람의 합을 구하여 limit과 비교하는 방식으로 문제를 해결했다.

 

sorted = [80, 70, 50, 50]  → people배열을 내림차순으로 정렬

 

가장 처음과 끝의 합이 limit을 넘으면 가장 처음 수 start에 +1을 하여 앞으로 이동시켜 준다

start = 0, end = 0, cnt = 0

sorted [start] = 80, sorted [end] = 50 → 130 > limit

start++ → start = 1

조건문을 통과하면 cnt++ → cnt = 1

 

sorted[start] = 70, sorted[end] = 50 → 120 > limit

start++ → start = 2

조건문을 통과하면 cnt++ → cnt = 2

 

가장 처음과 끝의 합이 limit을 넘지 않으면 start, end에 +1을 해준다

sorted [start] = 50, sorted[end] = 50 → 100 === limit

start++ → start = 3

end++ → end = 1

조건문을 통과하면 cnt++ → cnt = 3(정답!)

 

[이것이 코딩 테스트다: 투 포인터]: https://youtu.be/ttLRltNDiCo


리뷰

코드를 보면 쉬운데 스스로 생각해서 풀면 계속 시간초과가 발생하고 점점 어려워서 진도가 안나가진다...