본문 바로가기

코딩테스트/프로그래머스

[javascript] 실전 대비 모의고사 3차 2번

ingredient에 햄버거의 재료가 배열로 주어진다.
햄버거는 [1,2,3,1] 순서로 만들 수 있다.( 1 : 빵, 2 : 야채, 3 : 패티 )
ingredient로 주어진 배열을 통해 만들 수 있는 햄버거의 수를 구하여라. 

접근 방법

만약 [1, 1, 2, 3, 1, 2, 3, 1, 1]이라는 ingredient가 주어진다면
[1, 1, 2, 3, 1, 2, 3, 1, 1] 에서 한번 햄버거가 만들어지고 해당 재료를 사용했으므로
[1, 2, 3, 1, 1] 에서 햄버거가 또 만들어져서 최종적으로 2개의 햄버거가 만들어진다.

이처럼 사용한 재료가 빠진다는 것이 핵심이다.

하지만 배열에서 중간의 값을 넣거나 빼면 다시 배열의 모든 index가 재할당 되므로 비효율적이기 때문에 
빈 배열을 만들고 ingredient의 재료를 하나씩 넣으면서 [1,2,3,1] 이라는 배열이 들어오면
끝에서부터 제거하는 방식으로 진행하였다.

const stack = [];

ingredient.forEach(e => {
    stack.push(e)
    if(stack.slice(stack.length - 4, ).join("") === [1,2,3,1].join("")){
        answer += 1;
        stack.splice(stack.length - 4, );
    }
})​

먼저 빈배열 stack을 하나 만들고

1. ingredient의 요소를 하나씩 stack에 삽입한다.

2. 만약 stack의 마지막 4개의 요소와 [1, 2, 3, 1]이 같다면

2. 1 answer을 증가시키고
2. 2 stack의 마지막 4개의 요소를 삭제한다. (pop을 4번 사용해도 됨)

※배열을 참조형 자료구조이기 때문에 [1,2,3] === [1,2,3]  // false 를 출력한다.
때문에 문자열로 변환하여 같은지 비교하였다.

 

 

function solution(ingredient) {
    var answer = 0;
    const stack = [];

    ingredient.forEach(e => {
        stack.push(e)
        if(stack.slice(stack.length - 4, ).join("") === [1,2,3,1].join("")){
            answer += 1;
            stack.splice(stack.length - 4, );
        }
    })
    
    return answer;
}