coding etude
[javascript] 햄버거 만들기 본문
문제 생략~~
제한사항
- 1 ≤ ingredient의 길이 ≤ 1,000,000
- ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.
입출력 예
ingredientresult
[2, 1, 1, 2, 3, 1, 2, 3, 1] | 2 |
[1, 3, 2, 1, 2, 1, 3, 1, 2] | 0 |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 상수가 포장할 수 있는 햄버거가 없습니다.
풀이
- 여러가지 방법을 생각하게 만드는 문제였다..
1. 재귀를 사용하여 잘라내고 남은 재료를 다시 돌리는 방법을 사용했는데 절반은 통과하고 절반은 실패..
시간초과가 뜨는건 아닌데.. 실패하는데 걸리는 시간이 긴걸 보면 재료의 길이가 엄청 길게 주어져서 실패 한게 아닐까..??
function solution(ingredient) {
var answer = 0;
let bugger = [];
if(ingredient.length < 4){
return answer;
}
for(let i=0; i<ingredient.length; i++){
bugger = [];
// 재로가 1로 시작하면 배열에 담는다
if(ingredient[i] === 1 && ingredient.length >= 4){
bugger.push(ingredient[i]);
bugger.push(ingredient[i+1]);
bugger.push(ingredient[i+2]);
bugger.push(ingredient[i+3]);
if(Check(bugger)){
// bugger가 1231이 맞을때 카운트를 올리고 재료를 잘라낸다
// 그리고 재귀로 나온 리턴값을 더해준다.
answer++;
ingredient.splice(i, i+2);
answer += solution(ingredient);
}
}
}
return answer;
}
// 단순 체크기능
const Check = (arr) => {
let ok = 0;
if(arr.length >=4){
if(arr[1] === 2){
ok++;
}
if(arr[2] === 3){
ok++;
}
if(arr[3] === 1){
ok++;
}
if(ok === 3){
return true;
}
}
return false;
};
2. 재귀를 빼고 좀더 단순하게 만들어 봤다. 일일이 하나씩 검사하는 방식.
근데 이것도 반은 통과 반은 실패.... splice로 삭제하는건 반만 통과하는데.. pop 하나씩 빼는건 가능하네..흠..
function solution(ingredient) {
var answer = 0;
let bugger = [];
if(ingredient.length < 4){
return answer;
}
for(let i=0; i<ingredient.length; i++){
bugger.push(ingredient[i]);
if(bugger.length >= 4){
if(bugger.slice(-4).join("") === "1231"){
answer++;
// 여기서 문제가 생기는듯.. 뒤에서 부터 4개를 삭제하는건데...
// bugger.splice(-1, -4);
bugger.pop();
bugger.pop();
bugger.pop();
bugger.pop(); // <=== 이거는 성공..
}
}
}
return answer;
}
'algorithm' 카테고리의 다른 글
[javascript]추억 점수 (1) | 2023.12.23 |
---|---|
[Javascript]달리기 경주 (0) | 2023.08.09 |
[javascript] 푸드파이트 대회 (0) | 2023.01.05 |
[Javascript] 과일 장수 (0) | 2023.01.05 |
[javascript] 기사단원의 무기 (0) | 2023.01.05 |