[프로그래머스 레벨투] 짝지어 제거하기 👯‍♂️🧽

9rganizedChaos·2021년 10월 2일
0
post-thumbnail

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/12973

✍🏼 나의 수도 코드

// 첫 번째 수도코드
1) 재귀를 활용하자! 
2) 짝지어 제거하기 함수를 만든다. 
3) 재귀 함수가 리턴한 값이 기존의 문자열과 같으면 0(false)을 출력한다.
4) 문자열의 길이가 0이 되면, 1(true)을 출력한다.
// 두 번째 질문하기를 보고, 스택을 사용하라는 힌트를 얻었다.
1) 스택을 활용한다.
2) s를 split해 splitArr를 만든다.
3) splitArr를 반복문을 돌리면서 요소들을 스택에 옮겨 담는다.
4) 옮겨 담을 때 짝이 생기면 제거해준다.
5) 마지막에 splitArr와 스택이 모두 빈 배열이 되면 1을 리턴한다.

👨🏻‍💻 나의 문제 풀이

// 정확도에서 일부, 효율성 전체 실패 코드
function deletePairStr(s){
    let strArr = s.split("");
    for(let i = 0; i < strArr.length; i++){
        if(strArr[i] === strArr[i + 1]){
            strArr.splice(i, 2, "0", "0")
        }
    }
    let filteredArr = strArr.filter((item) => item !== "0");
    return filteredArr.join("");
}

function solution(s){
    if(s.length === 0){
        return 1
    } else if(s === deletePairStr(s)){
        return 0;
    } else {
        return solution(deletePairStr(s));
    }
}
function solution(s){
    let stack = [];
    let splitArr = s.split("");
    for(let i = 0; i < splitArr.length; i++){
        stack.push(splitArr[i]);
        let l = stack.length
        if(stack[l - 2] === stack[l - 1]){
            stack.pop();
            stack.pop();
        }
    }
    if (stack.length === 0) {
        return 1;
    } else {
        return 0;
    }
}

👩🏻‍💻 다른 사람의 코드

// 나처럼 먼저 옮겨 담은 후에 비교한 것이 아니라,
// 비교를 먼저하고 pop과 push의 여부를 결정했다는 점에서 내 코드보다 좀 더 효율적이다.
function solution(s)
{
    var stringToArray = s.split('');
    var res = [];

    for (var val of stringToArray){
        if( val === res[res.length -1]){
            res.pop() 
        } else { res.push(val)}
    } 
    return res.length === 0 ? 1 : 0 ;
}

🍯 알게 된 것들

  • 자료구조들을 적극적으로 활용하자. (재귀가 무조건 효율적인 것은 결코 아니다.)
  • 시간복잡도를 고려하자.
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글