알고리즘공부 6일차...! 주말에 열심히 쉬고 일한만큼 오늘도 열심히 풀어보자구~
택배상자는 크기가 모두 같으며 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 전달된다.
컨테이너 벨트는 한 방향으로만 진행이 가능해서 벨트에 놓인 순서대로(1번 상자부터) 상자를 내릴 수 있습니다.택배 기사님이 미리 알려준 순서에 맞게 영재가 택배상자를 실어야 합니다.
택배를 순서대로 실기 위해서 보조 컨베테이너 벨트를 주어주는데,보조 컨테이너 벨트는 앞 뒤로 이동이 가능하지만 입구 외에 다른 면이 막혀 있어서 맨 앞의 상자만 뺄 수 있습니다.
즉, 가장 마지막에 보조 컨테이너 벨트에 보관한 상자부터 꺼내게 됩니다
보조 컨테이너 벨트를 이용해도 기사님이 원하는 순서대로 상자를 싣지 못 한다면, 더 이상 상자를 싣지 않습니다. 택배 기사님이 미리 알려준 순서가 주어지고 이를 해결하는 알고리즘을 생각해보는 문제였다.
나의 풀이는 아래와 같다.
function solution(order) {
var answer = 1;
const box = [1,2,3,4,5]
let temp = []
//1. 첫번재 상자는 무조건 담음.
const index = box.indexOf(order[0])
for(let j = 0;j<index;j++){
temp.push(box[0])
box.shift()
}
//2. 그이후 박스들의 로직
for(let i = 1;i<order.length;i++){
//2-1.컨테이너에서 나오는 박스와 넣어야할 박스번호 비교하기
if(order[i]===box[0]){
box.shift()
answer ++
}else if(order[i]===temp[temp.length-1]){
temp.pop()
answer ++
}else{
return answer
}
}
return answer;
}
이번에는 노트에다가 그림을 그려가면서 생각해 보았다.
테스트는 통과했는데 제출 후 채점하기에서 4번 케이스만 통과하는,,,, 불상사가 발생했다..왜그럴까 고민을하다가 블로그를 쓰고있는데 내가 상자를 5개로 고정하고 생각해서라는 생각이 들었다.
function solution(order) {
var answer = 1;
let box = []
let temp = []
for(let boxIdx =0;boxIdx<order.length;boxIdx++){
box.push(boxIdx+1)
}
for(let i = 1;i<order.length;i++){
//1. 첫번재 상자는 무조건 담음.
if(order[i]!==box[0] || order[i]===temp[temp.length-1]){
const index = box.indexOf(order[i])
for(let j = 0;j<index;j++){
temp.push(box[0])
box.shift()
}
}
//2. 그이후 박스들의 로직
//2-1.컨테이너에서 나오는 박스와 넣어야할 박스번호 비교하기
if(order[i]===box[0]){
box.shift()
answer ++
}else if(order[i]===temp[temp.length-1]){
temp.pop()
answer ++
}else{
return answer
}
}
return answer;
}
위와같이 코드를 바꿨지만 시간초과 문제는 해결하지 못하였다.
자바스크립트 배열에서 값을 추가하거나 제거하는 함수로 .push() .pop() .unshift() .shift() 가 있다
즉, 배열에서 사용하는 매서드이다.
shift() 메서드는 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환합니다. 이 메서드는 배열의 길이를 변하게 합니다.
const array1 = [1, 2, 3];
const firstElement = array1.shift();
console.log(array1);
// expected output: Array [2, 3]
console.log(firstElement);
// expected output: 1
pop() 메서드는 배열에서 마지막 요소를 제거하고 그 요소를 반환합니다.
var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];
var popped = myFish.pop();
console.log(myFish);
// ['angel', 'clown', 'mandarin' ]
console.log(popped);
// 'sturgeon'
push() 메서드는 배열의 끝에 하나 이상의 요소를 추가하고, 배열의 새로운 길이를 반환합니다.
var sports = ['축구', '야구'];
var total = sports.push('미식축구', '수영');
console.log(sports);
// ['축구', '야구', '미식축구', '수영']
console.log(total);
// 4
[ 출처 ]