본문 바로가기
프로그래머스 코딩테스트 문제/Level 1

[프로그래머스] - 햄버거 만들기(C#)

by jyppro 2023. 9. 18.

햄버거 만들기

오늘은 "햄버거 만들기" 문제를 풀어보도록 하겠습니다. 이번 문제의 정답률은 49%로 드디어 50%이하로 떨어지게 되었습니다. 레벨1의 문제도 이제 거의 막바지로 향하고 있습니다. 문제 살펴보겠습니다.

 

문제 설명

햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.

예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.

상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

 

제한사항

  • 1 ≤ ingredient의 길이 ≤ 1,000,000
  • ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

 

입출력 예

ingredient result
[2, 1, 1, 2, 3, 1, 2, 3, 1] 2
[1, 3, 2, 1, 2, 1, 3, 1, 2] 0

 

입출력 예 설명

입출력 예 #1
문제 예시와 같습니다.


입출력 예 #2
상수가 포장할 수 있는 햄버거가 없습니다.

 

시작 코드

using System;

public class Solution {
    public int solution(int[] ingredient) {
        int answer = 0;
        return answer;
    }
}

 

나의 풀이

using System;
using System.Collections.Generic;

public class Solution {
    public int solution(int[] ingredient) {
        int answer = 0;
        List<int> list = new List<int>();
        
        foreach(int burger in ingredient)
        {
            list.Add(burger);
            if(list.Count >= 4)
            {           
                if(list[list.Count - 4] == 1 && list[list.Count - 3] == 2
                   && list[list.Count - 2] == 3 && list[list.Count - 1] == 1)
                {
                    answer++;
                    list.RemoveRange(list.Count - 4, 4);
                }
            }
        }
        return answer;
    }
}

 

코드 분석

int형 배열 ingredient가 주어지며 코드가 시작됩니다. int형 리스트 list를 선언하고 foreach문을 시작합니다. ingredient의 요소로 burger를 찾고 리스트에 burger를 추가해줍니다. 그리고 중첩 if문을 만나 실행합니다. 리스트 안의 원소 개수가 4이상이라면 들어가고 다시 if문을 만나 and 조건을 엮어 리스트의 인덱스가 list.Count - 4부터 -1까지의 원소가 각 순서대로 1, 2, 3, 1 이라면 if문 내부로 진입해 answer를 올려주고, 리스트에서 RemoveRange()를 통해 list.Count - 4 부터 4까지의 범위를 제거합니다. 모든 과정을 거치고 나서 빠져나오면 answer를 리턴해줍니다.

 

풀이 설명

이번 문제는 테트리스와 흡사한 면을 지니고 있습니다. 게임으로 생각해보면 위에서부터 계속 재료가 내려오고 특정 조건에 맞으면 없애고 없어진만큼 쌓인 높이가 내려오게 됩니다. 그리고 조건에 맞지 않게 계속 재료가 내려오면 없어지지 않아 계속 쌓이게 됩니다. 이제 문제를 살펴보겠습니다.

 

계산을 편하게 하기 위해 리스트를 사용합니다. foreach로 ingredient의 원소에 순서대로 접근하여 리스트에 전부 추가해준 뒤에 중첩 if문을 통해서 제한조건을 설정해줍니다. 햄버거를 만들기 위해선 최소한 (빵, 야채, 고기, 빵) 이렇게 4개의 원소가 필수적이므로 4개보다 적은 재료가 있다면 햄버거를 만들 수 없으므로 그대로 0을 리턴해줍니다. 그게 아니라면 햄버거는 최소 4칸 밑에서부터 재료의 조건을 만족해야 하기 때문에 Count에서 4를 뺀 곳부터 시작하며 각 재료가 정확히 햄버거를 만들 수 있는 조건인지 and로 판단합니다. 모든 조건이 충족되었다면 만들 수 있는 햄버거의 개수를 나타내는 answer값을 올리고, 만들어진 햄버거를 제거해야 하므로 RemoveRange를 통해 리스트의 원소를 제거합니다. 이 과정을 전부 거치면 만들 수 있는 햄버거의 개수인 answer를 리턴해주면 됩니다.

 

<NEXT>

오늘은 "햄버거 만들기" 문제를 풀어보았습니다. 알고리즘 자체는 딱히 복잡한 것은 없었지만, 코딩테스트 문제가 모두 그렇듯이 이러한 방법을 생각해내는 과정 자체가 어렵기 때문에 정답률이 낮은 것 같습니다.

다음에는 2022 KAKAO TECH INTERNSHIP에 출제 된 문제인 "성격 유형 검사하기" 문제를 풀어보도록 하겠습니다. 감사합니다.