기초 공부 (언어 및 알고리즘)/알고리즘 (C언어)

[프로그래머스 / C언어] 햄버거 만들기

iinana 2025. 2. 5. 17:34
728x90

프로그래머스 코딩테스트 연습 문제인, 햄버거 만들기 문제를 풀어보았습니다.

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

 

프로그래머스

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

programmers.co.kr

 

stack의 개념을 알고 있으면 쉽게 풀 수 있는 문제입니다. 다만, c언어에는 스택이 구현되어 있지 않기 때문에, 저는 그냥 top 변수 하나와 일반 int 배열을 활용하여 스택처럼 활용해주었습니다. 이 문제는 문제에서 힌트를 얻으면 더 쉽게 접근이 가능한 문제입니다. 문제에서 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다.  라고 언급하고 있습니다. 따라서, 저는 이 흐름을 그대로 따라, stack에 재료들을 쌓아나가다가, 재료가 3개 이상 쌓인 상태에서 1(빵)을 마주했을 때, 앞 3개의 재료가 차례로 고기 - 야채 - 빵인지 확인하고, 맞다면 top을 사용된 빵 하나 전으로 다시 설정하여, 다시 같은 과정을 반복하는 방법이었습니다. 

 

제가 쓴 코드에서 유의해서 볼 점은, 재료가 3개 이상 쌓인 상태에서 1(빵)을 마주했을 때, 이를 스택에 넣지 않고, 스택의 top부터 세개의 재료만 순회하여 햄버거를 만들 수 있는지 확인한다는 점입니다. 이 때 햄버거를 만들 수 있다면, answer(만들 수 있는 햄버거의 개수)에 1을 더해주고 나서, 그 빵은 다시 사용할 수 없기 때문에, 아래 stack에 현재 순회 중인 재료를 넣는 코드를 실행하지 않도록 반드시 continue문을 사용해주어야 합니다. 하지만 햄버거를 만들 수 없는 경우(res == false인 경우)에 그 빵을 사용해 햄버거가 만들어지지 않았다는 뜻이므로, 그 빵을 만드시 stack에 넣어주어야 합니다.

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int ingredient[], size_t ingredient_len) {
    int answer = 0;
    int pre = 0;
    
    int *stack = (int*)malloc(sizeof(int) * ingredient_len);
    int top = -1;
    for (int i = 0; i < ingredient_len; i++) {
        if (top >= 2 && ingredient[i] == 1) {
            bool res = true;
            for (int i = 0; i < 3; i++) {
                if (stack[top-i] != 3 - i) res = false;
            }
            if (res) {
                top -= 3;
                answer++;
                continue;
            }
        }
        stack[++top] = ingredient[i];
    }
    free(stack);
    return answer;
}
728x90