코딩테스트

[프로그래머스 / Javascript] 2025 프로그래머스 코드챌린지 2차 예선 > 택배 상자 꺼내기

크런키스틱 2025. 5. 5. 01:10
728x90

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명

 

 

제한사항

 

 

입출력 예

 

 

내 문제 풀이

function solution(n, w, num) {
	// 전체 층 갯수
    const floor = Math.ceil(n / w);
    // 택배 이중 배열
    const postArr = new Array(floor);
    
    // num 택배 위치
    let position = [];
    // num 택배를 꺼내기 위한 횟수(기본값 1 : 해당 num 택배를 꺼내는 횟수를 기본값으로)
    let answer = 1;
    
    // 이중 배열 생성
    for (let i = 0; i < floor; i++) {
        // 층에 담길 값 => 배열
        const floorArr = Array.from({length: w}, (_, j) => j+1+(i*w))
        
        // 층 위치(짝수, 홀수)에 따라서 배열 순서 전환
        if(i%2 === 0) {
            postArr[i] = floorArr;
        } else {
            postArr[i] = floorArr.sort((a,b) => b - a)
        }
    }
    
    // num 택배 위치 찾기
    for (let i = 0; i < floor; i++) {
        for (let j = 0; j < w; j++) {
            if (postArr[i][j] === num) position = [i,j]
        }
    }
    
    // num 택배를 꺼내기 위해 선행되어야 할 작업 횟수
    for (const post of postArr) {
        if(post[position[1]] > num && post[position[1]] <= n) answer++;
    }
    
    return answer;
}

 

 

과정 및 문제점(해결)

문제를 보는 순간 이중배열을 만들면 되겠다고 생각했다. 생성한 후, 그 안에서 num의 index 값을 통해 계산하면 되겠다는 접근 방식으로 문제풀이를 시작했다.

 

1. 맨 위층의 빈 배열 값을 null로 추가했더니, sort 작업에서 null이 먼저 오는 문제를 마주쳤다.

    solution) 생각하다보니 굳이 맨 위층의 빈 배열 값을 null로 추가하기보다 마지막 횟수 계산에서 num 값과 비교를 통해 count 하는 방식이 간단하다는 생각이 들어서 변경했다.(reverse 라는 함수를 이 과정에서 알게 됨)

 

 

다른 사람의 문제풀이

const solution = (n, w, num) => {
    let res = 1
    const total = Math.ceil(n / w)
    const target = Math.ceil(num / w)
    const nRemain = n % w || n
    const numRemain = num % w || num
    if (total % 2 === target % 2 && nRemain < numRemain) res -= 1 
    if (total % 2 !== target % 2 && nRemain + numRemain <= w) res -= 1
    return total - target + res
}

 

 

차이점 및 배운점

이중배열을 차근차근 만들고 접근하려던 나와 달리,

층 수를 계산하고 total과 target의 방향이 같은지 아닌지에 따라서 target 위에 상자가 있는지 체크하고 없을 경우 -1을 하는 방식이었다.

이번에 다른 사람의 문제풀이를 봤을 때 느낌은 코드적인 놀라움보다 접근방식에서 놀라움을 느꼈다. 

 

1. 접근하는 방식의 다양성이 중요하다고 느꼈다.

2. 다만, 위와 같은 방식은 다시 풀어도 내가 떠올리지는 못할 것 같아서 첫 문제 풀이 코드를 좀 더 간소화하기로 했다.

 

 

수정한 내 문제 풀이

function solution(n, w, num) {
	// 전체 층
    const floor = Math.ceil(n / w);
    // 택배 이중 배열
    const postArr = new Array(floor);
    // num 택배의 index 값
    let targetIndex = 0;
    // num 택배를 꺼내기 위한 횟수(기본값 1 : 해당 num 택배를 꺼내는 횟수를 기본값으로)
    let answer = 1;
    
    // 이중 배열 생성
    for (let i = 0; i < floor; i++) {
    	// 층에 담길 값 => 배열
        const floorArr = Array.from({length: w}, (_, j) => j+1+(i*w))
        
        // 층 위치(짝수, 홀수)에 따라서 배열 순서 전환
        if(i%2) {
            postArr[i] = floorArr.reverse()
        } else {
            postArr[i] = floorArr;
        }
        
        // 생성한 층 배열 안에 num 택배가 있다면 해당 index 추출
        if(postArr[i].includes(num)) targetIndex = postArr[i].indexOf(num)
    }
    
    // num 택배를 꺼내기 위해 선행되어야 할 작업 횟수
    for (const post of postArr) {
        if(post[targetIndex] > num && post[targetIndex] <= n) answer++;
    }
    
    return answer;
}

 

728x90