본문 바로가기
Algorithm/프로그래머스

[프로그래머스] 짝지어 제거하기 / java

by 코딩친구 2021. 7. 7.
반응형

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

 

코딩테스트 연습 - 짝지어 제거하기

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙

programmers.co.kr

 

 

[ 코드 ]

 

import java.util.*;

class Solution {
    public int solution(String s) {
        Stack<Character> stack = new Stack<Character>();

        for (char c : s.toCharArray()) {
            if(stack.isEmpty() || stack.peek() != c) {
                stack.add(c);
            }else {
                stack.pop();
            }
        }

        int answer = 0;
        if (stack.isEmpty()) answer = 1;
        return answer;
    }
}

 

 

 

 

Stack을 이용하는 문제였다.

 

그리고 Stack<String>으로 짜면

현재 자신의 문자를 볼 때

 

String.valueOf(s.charAt(i));

 

이런 식으로 확인해야하는 불편함이 있어서

Stack<Character>로 짜는것이 더 효율적인 것 같다.

 

 

 

 

[ 또 다른 정답 코드 ]

 

class Solution{
    public int solution(String s){
        StringBuilder sb = new StringBuilder();

        for(int i = 0; i < s.length(); i++) {
            if(sb.length() != 0 && sb.charAt(sb.length() - 1) == s.charAt(i)) {
                sb.delete(sb.length() - 1, sb.length());
            } else {
                sb.append(s.charAt(i));
            }
        }

        return sb.length() == 0 ? 1 : 0;
    }
}

 

Stack이 치명적인 단점이 발견되어 JAVA에서 점점 비권장 라이브러리로 가고있는 추세라고 한다.

StringBuilder를 이용한 코드도 올린다.

 

 

 

 

[ 틀린 코드 ]

 

class Solution {
    static int result;
    
    public int solution(String s) {
        result = 0;
        
        if(s.length()%2 != 0){
            return result;
        }
        
        erase(0, s);
        
        return result;
    }
    
    static void erase(int n, String s) {
        for(int i=n; i<s.length(); i++) {
            if(i+1<s.length() && s.charAt(i)==s.charAt(i+1)) {
                if(s.length()==2) {
                    result = 1;
                    return;
                }else if(i==0) {
                    s = s.substring(i+2, s.length());
                    erase(i, s);
                }else {
                    s = s.substring(0, i) + s.substring(i+2, s.length());
                    erase(i-1, s);
                }
            }
        }
    }
}

 

 

 

※ 오늘의 교훈

 

DFS, BFS, ArrayList만 말고 Stack으로도 접근해보자.

 

메소드

String.valueOf(s.charAt(i));

하지만 더 쉽게for문 안에서 s.toCharArray() 을 이용할 수 있다.

반응형