1은 빵, 2는 야채, 3은 고기를 의미한다.
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 |
ArrayList
를 사용했다.1) 배열을 ArrayList를 재정의
2) 0부터 시작하여1
을 만날 경우, 해당 인덱스부터 +3까지 각각2
,3
,1
로 이뤄지는지 확인
- 그렇다면,remove
를 이용하여, 햄버거 갯수 증가 및 해당 재료를 뺀 후, 다시 -3번째 부터 다시 탐색
- 그렇지 않다면, 탐색 index 값 증가
import java.util.*;
class Solution {
public int solution(int[] ingredient) {
int answer = 0;
ArrayList<Integer> ingreList = new ArrayList<>();
for(int i=0;i<ingredient.length;i++) {
ingreList.add(ingredient[i]);
}
int i=0;
while (i < ingreList.size()) {
if (i+3 >=ingreList.size())
break;
if (i>=0 && ingreList.get(i)==1 && ingreList.get(i+1)==2 && ingreList.get(i+2) == 3 && ingreList.get(i+3) == 1) {
for(int j=0;j<4;j++) {
ingreList.remove(i);
}
i-=3;
answer++;
continue;
}
i++;
}
return answer;
}
}
탐색 결과 햄버거가 완성될 경우, 해당 재료를 뺀 후 0부터 다시 탐색을 시작하도록 구성해봤다.
이럴 경우, 시간 초과가 발생하게 된다.
아예 처음부터가 아닌 뺀 재료만큼 앞으로 즉, i-3만큼 앞으로 이동하여 다시 탐색하도록 하자. 햄버거는 4개의 재료로 이뤄져 있기 때문에, 빠진 재료의 다음 재료는 최대 -3번째 재료에게까지 영향을 미쳐 햄버거가 될 수도 있기 때문이다.
처음부터 다시 탐색해야겠구나 생각만 했지만, 바로 이전꺼부터 다시 탐색하면 되는구나는 생각을 못 했다. 뭐든 기준이 중요하다는 생각이 들었다.