문제
프로그래머스 코딩 테스트 난이도 1 - 햄버거 만들기
풀이 과정
어제에 이어서 마저 풀었다. 결국 풀이는 성공하였다.
어제와 마찬가지로 LinkedList에 값을 넣는 방법을 선택하였다. 다만 차이점은 list.add(0);을 해서 리스트가 비어 있을 때 list.getLast()를 해도 에러가 나지 않도록 조절하였다.
구체적인 풀이는 경우의 수를 나누어 생각해 보았다. 리스트에 들어갈 수 있는 값은 1,2,3 이렇게 3가지이고 각각 들어가는 값이 마주칠 getLast()로 나올 수 있는 값은 0,1,2,3 이다. 하나씩 생각해보자.
1은 마지막 값이 0,1,2 일때는 그냥 list.add()로 들어가면 된다. 그런데 마지막 값이 3이면 햄버거 하나가 완성되는 것이므로 굳이 1을 list에 넣지 않고 list의 마지막 값 3개를 없애주면 된다. 뭔가 [-3:] 같은 인덱스로 쉽게 없앨 수 있는 방법을 찾아봤지만 일단 없는 것 같아서 removeLast(0)를 3번 써주었다..ㅠㅠ
2는 마지막 값이 1일때만 list.add()로 들어가면 된다. 나머지 경우는 모두 리스트를 초기화 시키면 된다. 나머지 경우는 이번 2를 포함한 앞에 있는 모든 재료가 버려지기 때문..
3은 마지막 값이 2일때만 list.add()로 들어가면 된다. 나머지 경우는 모두 리스트를 초기화 시키면 된다.
여기서 2와 3은 코드를 동일하게 짜줄 수 있다. 마지막 값이 자신보다 1 작으면 들어가고, 아니면 전부 초기화 시키면 되기 때문이다.
에러 및 막혔던 부분
import java.util.*;
public class test {
public static void main(String[] args) {
int[] ingredient = {2, 1, 1, 2, 3, 1, 2, 3, 1};
LinkedList<Integer> list = new LinkedList<>();
int answer =0;
list.add(0);
for(int i : ingredient){
//마지막이 3일때 1일 경우
if(i==1 && list.getLast().intValue()==3) {
list.removeLast();
list.removeLast();
list.removeLast();
answer += 1;
System.out.println("1번");
}
//마지막이 3이 아닐때 1일 경우
else if(i==1){
list.add(i);
System.out.println("2번");
}
//2와 3인데 마지막 값이 1이나 2일 경우
else if(list.getLast().intValue()==i-1){
list.add(i);
System.out.println("3번");
}
//그 외의 경우는 모두 리스트 초기화. 앞에 있는 재료들이 다 버려짐
list.clear();
list.add(0);
System.out.println("4번");
}
System.out.println(answer);
}
}
분명 로직에 오류가 없는 것 같았는데 답이 이상하게 나와서 모든 중간 과정에 출력문을 넣어서 루프 과정이 어떻게 돌아가는지를 확인해 보았다. 그런데 첫 2는 정상적으로 "4번"으로 출력됐는데, "2번"이 나와야 할 두번째 1에서 "4번"이 출력된 것이다. 즉 첫 if문의 조건문을 틀리자마자 바로 모든 elif를 무시하고 밑으로 내려가서 if문 바깥에 있는 실행문들을 실행한 것이다. 결국 마지막 부분도 elif로 넣어서 해결하긴 했지만 if문에서 흐름제어가 왜 저런식으로 됐는지는 모르겠다. 이건 질문을 해봐야 할 것 같다..!
코드
import java.util.*;
public class test {
public static void main(String[] args) {
int[] ingredient = {2, 1, 1, 2, 3, 1, 2, 3, 1};
LinkedList<Integer> list = new LinkedList<>();
int answer =0;
list.add(0);
for(int i : ingredient){
//마지막이 3일때 1일 경우
if(i==1 && list.getLast().intValue()==3) {
list.removeLast();
list.removeLast();
list.removeLast();
answer += 1;
}
//마지막이 3이 아닐때 1일 경우
else if(i==1){
list.add(i);
}
//2와 3인데 마지막 값이 1이나 2일 경우
else if(list.getLast().intValue()==i-1){
list.add(i);
}
//그 외의 경우는 모두 리스트 초기화. 앞에 있는 재료들이 다 버려짐
else {
list.clear();
list.add(0);
}
}
System.out.println(answer);
}
}
'알고리즘 풀이' 카테고리의 다른 글
221121 알고리즘 풀이 6문제 (2) | 2022.11.21 |
---|---|
221119 알고리즘 풀이 8문제 (2) | 2022.11.19 |
221118 알고리즘 풀이 1 (0) | 2022.11.18 |
221113 알고리즘 풀이 (0) | 2022.11.14 |
221112 알고리즘 풀이 (0) | 2022.11.13 |