문제 설명

문자열에 연속한 2개의 같은 문자가 존재하지 않도록 만들고 싶습니다.
연속한 2개의 같은 문자가 존재한다면 이 문자를 지우고 남은 문자열을 이어 붙입니다.
이 과정을 연속한 2개의 같은 문자가 없을 때까지 반복하면 목표한 문자열을 얻게 됩니다.
문자열 s가 주어질 때, 위와 같은 과정을 적용해서 나오는 문자열을 출력하는 프로그램을 구현하세요.


입력 형식

· S: 주어진 문자열


출력 형식

· 중복을 모두 제거한 문자열을 반환


제약 사항

· 0 < S.length <= 100000

· S는 알파벳 소문자로 이루어져 있습니다.


입출력 예시

· 입력

  · S = "aacddefg"

· 출력: "cefg"

· 설명: 중복되는 문자열 a, d를 제거하면 답안을 얻게 된다.


작성 코드

(20/20)

import java.util.Stack;
import java.util.stream.Collectors;

class Solution {
    public String solution(String S) {

        // 문자를 저장하기 위한 Stack 객체인 word를 생성
        Stack<Character> word = new Stack<>();

        /* 문자열 S의 각 문자를 하나씩 순회
         toCharArray() 메서드는 String 객체에 대해 호출할 수 있는 메서드 중 하나로,
         String 객체를 char 배열로 변환하여 반환합니다.
         */
        for (char i : S.toCharArray()) {
            // word가 비어있거나 word의 top이 현재 문자 i와 다른 경우에는 word에 i를 추가
            if(word.isEmpty() || word.peek() != i) word.push(i);
            else word.pop(); // 그렇지 않은 경우에는 word의 top을 제거
        }
        // word를 스트림으로 변환한 후, 각 문자를 문자열로 변환하여 하나의 문자열로 연결
        String strValue = word.stream()
                .map(String::valueOf)
                /* valueOf 메서드는 자바에서 매개변수로 주어진 값을 해당 자료형으로 변환하여 반환하는 메서드
                 String 클래스에서는 valueOf 메서드를 통해 매개변수로 주어진 값을 String 자료형으로 변환
                 ::는 자바에서 메서드 참조(Method Reference)를 표현하는 연산자
                 :: 연산자를 사용하면 메서드를 호출하지 않고, 해당 메서드 자체를 참조할 수 있음
                 즉, word.stream()으로 생성된 Stream<Character>에 대해 map 메서드를 호출하면서,
                 String::valueOf를 매개변수로 전달함으로써, Stream<Character>에서 문자를 문자열로 변환하는 작업을 수행
                */
                .collect(Collectors.joining());
                // Stream에서 각 문자열을 하나의 문자열로 연결합니다. 이 때, Collectors 클래스의 joining 메서드를 사용
                // 이 메서드는 구분자(delimiter)를 지정하지 않으면, 연결되는 문자열 사이에 구분자 없이 연결

        return strValue;
    }

    public static void main(String[] args) {
        Solution st = new Solution();
        String s = "aacddefg";
        System.out.println(st.solution(s));
    }
}

 

 

정답 코드

import java.util.Stack;

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

        for (char c: s.toCharArray()) {
            if (stack.size() > 0 && stack.peek() == c) {
                stack.pop();
            } else {
                stack.push(c);
            }
        }

        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }
        return sb.reverse().toString();
    }
}