짝지어 제거하기

작성자 : 조회수 :

짝지어 제거하기

 

프로그래머스 코딩테스트

 

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

 

풀이시간 : 1시간 30


처음 접근 법은 그냥 반복문을 계속 돌려서 검증하는 방법이였습니다

 

 

public static int solution(String s)

    {

        int answer = -1;

        int end = 0;

        StringBuffer sb = new StringBuffer();

        sb.append(s);

        int number = 0;

        while (end <= 2) {

            if(sb.length() == 0 || sb.length() == 1){

                answer = 1;

                break;

            }

            if (number + 1 > sb.length() - 1) {

                end++;

                number = 0;

            }

            System.out.println(sb.charAt(number) + " :::: " + sb.charAt(number+1));

            if (sb.charAt(number) == sb.charAt(number + 1)) {

                sb.deleteCharAt(number);

                sb.deleteCharAt(number);

                end = 0;

            }

            System.out.println(sb);

            number++;

        }

        if(sb.length() > 0){

            answer = 0;

        }

        return answer;

    }

 

[첫 문제풀이 코드]

 

 

하지만 제출 후 정답이지만 효율성을 보고 곰곰히 생각이 들었습니다.

 

효율을 따진다는 것은 일단 문제 자체는 간단한 문제니 최소 1번에서 2번만 순환해야 통과하겠구나

 

라는 생각이 들었습니다

 

 

 

 

 

 

 

 

 

 

 

 

 

곰곰히 생각 후 내린 결론은 stack을 사용 하자 였습니다.

 

사실 처음부터 스택을 생각해 두긴 했으나 무의식적으로 확실한 검증을 하려면

 

반복문을 여러 번 돌려야지 확실한 검증이 될거라 생각했었습니다

 

 

아래 수정된 코드입니다

 

public static int solution(String s)
    {
        int answer = -1;
        Stack<Character> stack  = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if(stack.isEmpty()){
                stack.push(s.charAt(i));
            }else{
                if(s.charAt(i) == stack.peek()){
                    stack.pop();
                }else{
                    stack.push(s.charAt(i));
                }
            }
        }
        if(stack.isEmpty()){
            answer = 1;
        }else{
            answer = 0;
        }
        return answer;
    }

 

 

이렇게 간단하게 문제를 해결할 수 있었습니다

 

스택을 통해 같은 값이 쌓이면 pop 시켜주고 아니면 push를 시켜줌으로서

 

전체 길이 한번만 순환해 만약 stack값이 남아있으면 0

 

모두 pop 되어 없어졌다면 1을 출력해줄 수 있습니다.