공부블로그

택배 상자 꺼내기 - 프로그래머스 LV.1 (JavaScript) 본문

공부하기/알고리즘

택배 상자 꺼내기 - 프로그래머스 LV.1 (JavaScript)

떠어영 2025. 11. 22. 20:24

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

총 두가지 방법으로 풀이했다.

처음에 너무 복잡하게 생각하는 바람에 매트릭스처럼 풀었고, 두번째는 단순하게 생각했더니 짧은 코드로 풀 수 있었다.

 

  • 첫번째 풀이 (복잡하게 푼 ver) 
function solution(n, w, num) { // 전체개수 / 가로길이 / 꺼내려는 번호
    var answer = 0;

    function get_matrix(number, width){
        // 올림으로 현재 층수 알아내기
        const floor = Math.ceil(number/width)
        if ((floor % 2) == 0) { // 층수가 짝수이면 왼쪽으로 커지는 층
            const right = (width * floor) - number
            return [floor, right + 1]
        } else {
            const right = number - (width * (floor - 1))
            return [floor, right]
        }
    }
    const n_matrix = get_matrix(n,w) // 최대
    const num_matrix = get_matrix(num,w) // 꺼내는 박스
    
    if ((n_matrix[0] % 2) == 0) { // 맨 위층이 왼쪽으로 증가
        if (num_matrix[1] >= n_matrix[1]){ 
            answer = n_matrix[0] - num_matrix[0] + 1
        } else {
            answer = n_matrix[0] - num_matrix[0] 
        }
    } else { // 맨 위층이 오른쪽으로 증가
        if (num_matrix[1] > n_matrix[1]){ 
            answer = n_matrix[0] - num_matrix[0] 
        } else {
            answer = n_matrix[0] - num_matrix[0] + 1
        }
    }    
    return answer;
}

 

 

  • 두번째 풀이 (간단하게 푼 ver) 
function solution(n, w, num) { // 전체개수 / 가로길이 / 꺼내려는 번호
    var answer = 0;
    // 반복문으로 하나씩 보는 게 빠를듯 100이니까!
    // 지금 몇층인지 > 내 바로 위에 번호 추측 > 전체보다 작은지!!
    let now = num     
    let count = 0

    while( now < n ){
            let floor = Math.ceil(now / w) // 시작 층
            let from_right = now - ((floor-1)*w) // 2
            let gap = w - from_right // 6-2 = 4
            let new_now = now + gap*2 + 1 // 내 위에 층 번호
            if (n >= new_now ) {
                count += 1
            } 
            now = new_now
    }
    return count + 1;
}