짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa
라면
b aa baa → bb aa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
s | result |
---|---|
baabaa | 1 |
cdcd | 0 |
입출력 예 #1
위의 예시와 같습니다.
입출력 예 #2
문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.
// 틀린 코드 //
function solution(s) {
let stack = [];
s.split("").map((e, idx) => {
stack.push(e);
if (stack.length > 1 && stack[idx - 1] === stack[idx]) {
stack.pop();
stack.pop();
}
});
return stack.length > 0 ? 0 : 1;
}
stack
이라는 빈 배열을 만들고, 문자를 하나씩 push
한다.
이후 stack
에 2개 이상의 문자열이 있고, stack
에 push
한 element
와 바로 앞 element
의 값이 같다면 pop
을 2번 해줬다.
push
를 무조건 하고, pop
을 2번 해야 한다는 게 비효율적이라고 생각을 했지만 일단 제출했다.
역시나 실패와 시간초과라는 결과가 나왔다.
// 패스한 코드 //
function solution(s) {
let stack = [];
s.split("").map(e => {
if (!stack.length || stack[stack.length - 1] !== e) stack.push(e);
else stack.pop();
});
return stack.length ? 0 : 1;
}
stack
이 비어있거나 stack
의 마지막 문자가 현재 element
와 같지 않다면 stack
에 element
를 push했다.
이외의 경우가 stack
의 마지막 문자가 현재 element
와 같은 경우라서 stack
의 마지막 문자를 pop
했다.
이전 코드와 달리 중복된 요소를 stack
에 저장하지 않고, 조건문과 스택 조작을 최소화하여 더 효율적인 코드를 작성하였고, 문제를 패스할 수 있었다.