코딩테스트
프로그래머스 - 짝지어 제거하기
오쟝
2024. 3. 11. 19:01
처음에 생각한 방법은 함수를 따로 빼 중복 확인을 하고, 중복 제거를 위해 splice를 사용하는 방법이었습니다.
그렇게 짠 코드는
function solution(s)
{
return check(s).length == 0 ? 1 : 0
}
function check(s){
let str = s.split('')
for(let i = 0; i<str.length; i++){
if(str[i] === str[i + 1]) {
str.splice(i, 2)
i = -1
}
}
return str
}
i를 -1로 준 이유는 1로 주면 i++ 때문에 0부터가 아닌 1부터 배열이 돌기 때문이었습니다.
이 코드의 문제는 -1로 돌아감으로써 불필요한 반복이 늘어났습니다. 따라서 효율성 테스트를 통과하지 못 했습니다. 그래서 생각한 방법은
stack을 사용하는 방법입니다.
stack은 LIFO (Last In First Out)의 형태입니다. 따라서 나중에 넣은 데이터가 먼저 나오게 됩니다.
function solution(s)
{
const stack = []
for(let i = 0; i<s.length; i++){
if(!stack.length || stack[stack.length - 1] !== s[i]) stack.push(s[i])
else stack.pop()
}
return stack.length ? 0 : 1
}
stack이 비어있거나 stack 안의 마지막 값이 s[i]과 다르면 stack에 s[i] 값을 넣어줍니다. 만약 stack에 값이 들어있고, stack 안의 마지막 값과 s[i]이 같다면 stack의 마지막 값을 제거해줍니다. (중복 제거)
이 과정을 통해 마지막 stack의 길이를 확인해 만약 stack에 값이 들어있다면 짝지어 제거하기가 실패했기 때문에 0을, 값이 들어있지 않다면 성공했기 때문에 1을 리턴해줍니다.
오늘의 코테는 여기서 마무리~
그럼 20000~