코딩테스트
[프로그래머스] 햄버거 만들기 자바 : 스택
mhui123
2025. 4. 1. 21:20
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/133502
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
ingredient : 재료정보 정수배열 > 1 : 빵, 2 : 야채 3 : 고기 로 구성되며
ingredient 순서대로 햄버거를 조립할 때, 완성한 버거의 수를 구하여라.
제한사항
1. 햄버거는 1 2 3 1 순서로만 조립한다. > 빵 야채 고기 야채 빵
2. 빵을 깔기 전에 먼저 다른 재료가 나오면 무시한다.
3.. 버거 제작 도중 새로운 빵을 만나면, 새로운 빵을 우선으로 조립한다.
접근
재료의 집합 ingredient를 반복문으로 돌아 "1231"을 만들어 List burgers에 저장하고 그 숫자를 세면 해결될 것이라 예상.
버거 제작 도중 새로운 빵을 만나면 제작중인 버거를 burgers에 임시저장하고 새로운 빵을 만든다.
버거를 완성하면 새로운 빵을 burgers에 넣고 제작중이던 빵을 꺼내 다시 제작을 시도한다.
public static int solution(int[] ingredient) {
int answer = 0;
List<StringBuilder> burgers = new ArrayList<>();
StringBuilder burgerSample = new StringBuilder("1231");
StringBuilder burger = new StringBuilder();
int burgerStep = 0;
for (int i = 0; i < ingredient.length; i++) {
int ingre = ingredient[i];
burgerStep = burger.length() +1;
boolean isMaking = false;
for(int j = 0; j < burger.length(); j++){
isMaking = burger.charAt(j) == burgerSample.charAt(j);
}
if(isMaking && ingre == 1 && burgerStep < 4){
burgers.add(burger);
burger = new StringBuilder(ingre);
burgerStep = burger.length() +1;
}
//아래빵을 안깔았으면
if (ingre == 1 && burgerStep == 1) {
burger.append(ingre);
} else if (burgerStep == 2 && ingre == 2) {
burger.append(ingre);
} else if (burgerStep == 3 && ingre == 3) {
burger.append(ingre);
} else if (burgerStep == 4 && ingre == 1) {
//버거 완성
burger.append(ingre);
if(burgerSample.compareTo(burger) == 0){
burgers.add(burger);
answer ++;
burger = new StringBuilder(); //버거 초기화
} else {
//미완성 버거 체크 및 제거
Iterator<StringBuilder> iterator = burgers.iterator();
while(iterator.hasNext()){
StringBuilder b = iterator.next();
if(burgerSample.compareTo(burger) != 0){
burger = b;
iterator.remove();
}
}
}
}
}
return answer;
}
발견된 문제
1.isMaking 로직 오류:
현재 isMaking은 마지막 문자 비교 결과만 저장됩니다.모든 문자가 일치하는지 확인해야 하지만, 루프 밖에서 isMaking을 사용하면 마지막 비교 결과만 반영됩니다.
2.버거 완성 검사 시점 문제:버거가 완성되면(burgerStep == 4 && ingre == 1) 바로 초기화하는 대신, 완성된 패턴인지 확인해야 합니다.
3.미완성 버거 처리 문제:미완성 버거를 다시 burger에 할당하는 로직이 의도와 다르게 동작할 수 있습니다.
4.효율성 문제:
StringBuilder를 사용하는 방식이 비효율적일 수 있으며, 스택을 사용하는 것이 더 적합합니다.
GPT 제안
이 문제는 스택(Stack) 자료구조를 사용하는 것이 가장 효율적이고 간단한 해결 방법입니다. 스택을 사용하면:
재료를 순서대로 스택에 추가스택의 상위 4개 요소가 "1-2-3-1"인지 확인패턴이 발견되면 제거하고 카운트 증가
수정
public int solution(int[] ingredient){
int answer = 0;
Stack<Integer> stack = new Stack<>();
for(int ing : ingredient){
stack.push(ing);
if(stack.size() >= 4) {
//스택의 상위 4개 요소가 "1-2-3-1"인지 확인
if(stack.get(stack.size() - 4) == 1 &&
stack.get(stack.size() - 3) == 2 &&
stack.get(stack.size() - 2) == 3 &&
stack.get(stack.size() - 1) == 1){
answer ++;
// 패턴에 해당하는 재료 제거
for( int i = 0; i < 4; i++){
stack.pop(); //마지막 stack 제거
}
}
}
}
return answer;
}
알게된 점
1. Stack에 데이터 입력 stack.push(data);
2. Stack의 마지막 항목 제거 : stack.pop();
3. Stack은 LIFO (Last In First Out) 구조로 동작한다.
본 문제와 같이 데이터를 입력 순서대로 비교하여 특정 패턴을 만족하는지 판단해야 되는 경우 사용하는 것이 적절하다는 것을 알게 되었다.
반응형