코딩테스트
[프로그래머스 / 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