[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค / Java] - ๊ด„ํ˜ธ ๋ณ€ํ™˜

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๊ด„ํ˜ธ ๋ณ€ํ™˜
์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๊ด„ํ˜ธ ๋ณ€ํ™˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
school.programmers.co.kr

๐Ÿ’ก ๋ฌธ์ œ ํŒŒ์•…

  • '(' ์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด p ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (์—ด๊ณ  ๋‹ซ๋Š” ๊ด„ํ˜ธ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ๊ฐ™๋‹ค)
  • ๋ฌธ์ œ์—์„œ ์ •์˜ํ•œ ๋ณ€ํ™˜ ๊ทœ์น™์— ๋”ฐ๋ผ p ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊ฟ”์„œ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ž€, ์—ฌ๋Š” ๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ํ•ญ์ƒ ์ง์„ ์ด๋ฃจ๋ฉฐ ๋ฌธ์ž์—ด์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฝ์„ ๋•Œ ๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ๋ณด๋‹ค ๋จผ์ € ๋‚˜์˜ค๋Š” ์ˆœ๊ฐ„์ด ์—†๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.

๐Ÿ—๏ธ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ์žฌ๊ท€ ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

  1. p ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. p ๋ฅผ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ u, v ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ์•ž์—์„œ๋ถ€ํ„ฐ ๊ด„ํ˜ธ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋‹ค๊ฐ€ ์—ฌ๋Š” ๊ด„ํ˜ธ ์ˆ˜์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ ์ˆ˜๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ๊ฐ™์•„์ง€๋Š” ์ง€์ ๊นŒ์ง€๊ฐ€ u, ๋‚˜๋จธ์ง€๊ฐ€ v ์ด๋‹ค.
  3. u ๊ฐ€ ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด u + solution(v) ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. u ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ๋ฉด
    • "(" + solution(v) + ")" ๋ฅผ ๋งŒ๋“ค๊ณ 
    • u ์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค, ๋‚จ์€ ๋ฌธ์ž์—ด์˜ ๊ด„ํ˜ธ ๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ๋’ค์ง‘์–ด ์ด์–ด ๋ถ™์ธ๋‹ค.
  5. ์œ„ ๊ณผ์ •์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•ด ์ตœ์ข… ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ์–ป๋Š”๋‹ค.

๊ท ํ˜•์žกํžŒ ๋ฌธ์ž์—ด๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์€ ๊ด„ํ˜ธ ๊ฐœ์ˆ˜ ์นด์šดํŠธ๋งŒ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

if (open == close) {
    return new String[]{
        str.substring(0, i + 1),
        str.substring(i + 1)
    };
}

์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ์ง€๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ +1, ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ -1 ๋กœ ๋‘๊ณ  ๋ˆ„์ ํ•ฉ์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„์ด ์—†๊ณ  ์ตœ์ข…ํ•ฉ์ด 0 ์ธ์ง€๋กœ ํŒ๋‹จํ•œ๋‹ค.

if (u.charAt(i) == '(') count++;
else count--;

if (count < 0) return false;

๐Ÿงฉ ์ฝ”๋“œ ๊ตฌํ˜„

import java.util.*;

class Solution {
    public String solution(String p) {
        if (p.isBlank()) return p;

        String[] result = splitString(p);
        String u = result[0];
        String v = result[1];

        // u๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ
        if (isCorrect(u)) {
            return u + solution(v);
        }

        // u๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ
        StringBuilder sb = new StringBuilder();

        sb.append("(");
        sb.append(solution(v));
        sb.append(")");

        // u์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ด„ํ˜ธ ๋ฐฉํ–ฅ ๋’ค์ง‘๊ธฐ
        for (int i = 1; i < u.length() - 1; i++) {
            if (u.charAt(i) == '(') sb.append(')');
            else sb.append('(');
        }

        return sb.toString();

    }

    private boolean isCorrect(String str) {
        int count = 0;

        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '(') count++;
            else count--;

            if (count < 0) return false;
        }
        return count == 0;
    }

    private String[] splitString(String str) {
        int open = 0, close = 0;

        for (int i = 0; i < str.length(); ++i) {
            if (str.charAt(i) == '(') open++;
            else close++;

            if (open == close) {
                return new String[]{
                    str.substring(0, i + 1),
                    str.substring(i + 1)
                };
            }
        }
        return new String[]{str, ""};
    }
}