새소식

알고리즘 테스트 ⏲/프로그래머스

[프로그래머스] 구명보트 풀이 / JavaScript

  • -

 

 

프로그래머스

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

programmers.co.kr

 

작성 코드 (1차 시도 / 실패)

function solution(people, limit) {
    people = people.sort()
    let result = 0
    let [s, e] = [0, people.length - 1]
    while (s <= e) {
        let curr = people[s] + people[e]
        if (curr <= limit) s += 1
        e -= 1
        result += 1
    }
    
    return result
}

로직은 아무리 봐도 오류가 없었습니다. 테스트 케이스를 6개가까이 추가해보았지만 오류가 나올만한 부분이 전혀 없었는데 미처 간과했던 부분이 하나 있었습니다. sort()는 정렬 시 디폴트로 유니코드 값을 기준으로 정렬하기 때문에 일반적으로 오름차순이나 내림차순으로 원하는 결괏값 배열을 기대할 수 없습니다.

 

작성 코드 (2차 시도 / 통과)

function solution(people, limit) {
    people = people.sort((a, b) => a - b)
    let result = 0
    let [s, e] = [0, people.length - 1]
    while (s <= e) {
        let curr = people[s] + people[e]
        if (curr <= limit) s += 1
        e -= 1
        result += 1
    }
    
    return result
}

sort의 콜백 자리에 비교 함수를 넣어 올바르게 정렬되도록 변경했습니다. 허무했네요.

 

구현 로직 (투포인터 사용)

1. people을 오름차순 정렬합니다.

2. 투포인터를 만들어줍니다. 시작값은 0, 마지막값은 people의 길이입니다. 

3. 가장 큰 값과 작은 값을 더합니다. 이 값이 limit보다 크다면 큰 사람이 혼자서 배를 타고 가야하므로 e를 왼쪽으로 1칸 옮겨주고 limit보다 같거나 작다면 작은 사람과 무거운 사람을 같이 보내야 하므로 s와 e를 각각 1칸씩 옮겨줍니다.

4. s와 e가 만나거나 s가 e를 앞지르면 종료합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.