2차 공부/알고리즘

햄버거 만들기

공대탈출 2024. 6. 25. 15:07

프로그래머스 햄버거 만들기

 

주어지는 ingredient배열 중 1, 2, 3, 1 순서로 되어있는 요소를 제거하고, 다시 제거된 배열에서 1, 2, 3, 1이 없을때까지 해당 순서의 개수를 찾는 문제이다.

 

 

 

먼저 작성한 코드

function solution(ingredient) {
    var answer = 0;
    let ingredientStr = ingredient.join('')+''
    if (ingredientStr.includes(1231)) {
        do {
            ingredientStr = ingredientStr.replace(1231, '')
            answer++
        } while (ingredientStr.includes(1231))
    }
    return answer;
}

주어지는 배열을 문자열화 시키고, 첫 구문은 무조건 실행되는 do while의 특징때문에 if문을 사용하여 첫 번째에도 1231을 포함하는지 판별한 뒤 do while을 실행하였다.

포함한다면 1231부분을 제거하고 answer에 1을 더하는 형식으로 정답을 반환하였다.

시간초과로 실패하였다.

처음부터 includes, 반복마다 incldues, replace를 하다보니 시간복잡도 측면에서 문제가 발생하는것으로 판단하였다.

 

 

 

두번째로 작성한 코드

function solution(ingredient) {
    var answer = 0;
    let ingredientStr = ingredient.join('')+''
    if (ingredientStr.includes(1231)) {
        while (true) {
            ingredientStr = ingredientStr.replace(1231, '')
            answer++
            if (!ingredientStr.includes(1231)) break;
        }
    }
    return answer;
}

별 다를것 없는 코드이다. do while에서 while문으로 바꾼건데 한 테스트가 왜 통과되었는지도 모르는...

어쨋든 성공은 하나, 같은 시간초과 실패

 

 

세번째로 작성한 코드

function solution(ingredient) {
    var answer = 0;
    let temp = [];
    
    for (let i = 0; i<ingredient.length; i++) {
        temp.push(ingredient[i])
        if (temp.length >= 4) {
            let tempBurger = temp.slice(-4).join('')
            if (tempBurger === '1231') {
                temp.splice(-4)
                answer++
            }
        }
    }
    return answer;
}

어쨋든 반복문 내에서 includes를 사용하니 시간초과가 계속된다 생각하여 다른 방식으로 접근해보았다.

빈 배열을 만들어주고, 각 재료를 해당 temp배열에 넣어준다. 배열의 길이가 4를 넘을때 해당 배열에 대한 검사를 진행한다.

tempBurger을 뒤에서 4개의 요소를 합친것으로 만들어주고, tempBurger가 1231일때 temp배열에서 해당 요소들을 제거해준뒤 answer에 1을 더한다.

 

테스트코드로 들어오는 [2, 1, 1, 2, 3, 1, 2, 3, 1] 배열을 살펴보자.

temp에 [2, 1, 1, 2]가 들어왔을 때 if문 조건에 해당하지만, 1231이 아니기때문에 햄버거가 완성되진 않는다.

[2, 1, 1, 2, 3, 1]까지 들어오면 뒤에서 4개인 [1, 2, 3, 1]이 중첩조건문을 통과하여 temp가 [2, 1]이 되고 answer에 1이 더해지는것이다.

그리고 반복문이 진행되어 [2, 1, 2, 3, 1]이 되었을 때 동일하게 진행되어 temp가 [2]가 되고 answer에 1이 더해진다.

최종적인 temp는 [2]이고 검색이 끝나 answer을 리턴한다.


includes메서드를 사용하면 최대길이의 배열을 계속해서 탐사하기때문에 시간복잡도 측면에서 문제가 되었던 것으로 생각된다.

해당 방법은 길이가 4이상일때만, 최소탐사를 진행하여 문자열이 같은지 판단하기때문에 시간복잡도에서 우월하다고 생각한다.

 

'2차 공부 > 알고리즘' 카테고리의 다른 글

성격 유형 검사하기  (0) 2024.06.27
대충 만든 자판  (1) 2024.06.21
체육복  (0) 2024.06.19
숫자짝꿍  (0) 2024.06.18
옹알이(2)  (0) 2024.06.17