[백준] 4889. 안정적인 문자열 (Java)

서재·2024년 9월 22일
0

백준 JAVA 풀이

목록 보기
36/36

👨‍💻 문제


✍️ 풀이

여는 괄호와 닫는 괄호로 이루어진 문자열을 올바르게 수정하는 문제이다.

문자열 압축

이미 올바르게 열리고 닫히는 괄호들은 생략한다.
스택을 사용하여 작업을 수행한다.
아래 코드에서는 덱을 사용하였지만 스택을 사용하여도 무방하다.
이 작업을 통해 }}{{와 같이 올바르지 못한 표현만 남게 된다.

            Deque<Character> shorterString = new ArrayDeque<>();
            for (char value : input.toCharArray()) {
                switch (value) {
                    case '{' :
                        shorterString.addLast('{');
                        break;
                    case '}' :
                        if (!shorterString.isEmpty() && shorterString.peekLast() == '{') {
                            shorterString.pollLast();
                        }
                        else {
                            shorterString.addLast('}');
                        }
                        break;
                }
            }

문자열 수정

위 작업 이후 남게 되는 문자열은 }{, {{, }}으로 구성되어 있다.
}{의 경우 2개 모두 수정해야 하며,
{{, }}의 경우 1개씩 수정해야 한다.

위 작업에서 사용한 덱 또는 스택을 문자열로 변환할 필요 없이 바로 작업을 수행할 수 있다.
2개씩 빼서 두 값이 다르다면 2개를, 같다면 1개를 결과값에 추가한다.

            int changeCnt = 0;
            while (!shorterString.isEmpty()) {
                char a = shorterString.pollFirst();
                char b = shorterString.pollFirst();
                if (a == b) {
                    changeCnt++;
                }
                else {
                    changeCnt += 2;
                }
            }

📄 전체 소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

public class _4889 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        for (int t=1; true; t++) {
            String input = br.readLine();
            if (input.startsWith("-")) {
                break;
            }

            Deque<Character> shorterString = new ArrayDeque<>();
            for (char value : input.toCharArray()) {
                switch (value) {
                    case '{' :
                        shorterString.addLast('{');
                        break;
                    case '}' :
                        if (!shorterString.isEmpty() && shorterString.peekLast() == '{') {
                            shorterString.pollLast();
                        }
                        else {
                            shorterString.addLast('}');
                        }
                        break;
                }
            }

            int changeCnt = 0;
            while (!shorterString.isEmpty()) {
                char a = shorterString.pollFirst();
                char b = shorterString.pollFirst();
                if (a == b) {
                    changeCnt++;
                }
                else {
                    changeCnt += 2;
                }
            }

            sb.append(String.format("%d. %d\n", t, changeCnt));
        }
        System.out.print(sb);

    }

}
profile
입니다.

0개의 댓글

관련 채용 정보