Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ/others

[Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ] 2020 ์นด์นด์˜ค ๋ธ”๋ผ์ธ๋“œ ๋ฆฌํฌ๋ฃจํŒ… ๊ด„ํ˜ธ ๋ณ€ํ™˜

ALiNew 2020. 7. 3. 00:58

๋ฌธ์ œ ์„ค๋ช…

์นด์นด์˜ค์— ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋กœ ์ž…์‚ฌํ•œ ์ฝ˜์€ ์„ ๋ฐฐ ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์—ญ๋Ÿ‰ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ผ๋Š” ์—…๋ฌด ๊ณผ์ œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„ ์†Œ์Šค ์ฝ”๋“œ ๋‚ด ์ž‘์„ฑ๋œ ๊ด„ํ˜ธ๊ฐ€ ๊ฐœ์ˆ˜๋Š” ๋งž์ง€๋งŒ ์ง์ด ๋งž์ง€ ์•Š์€ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •ํ•ด์•ผ ํ•  ์†Œ์Šค ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๊ณ ๋ฏผํ•˜๋˜ ์ฝ˜์€ ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ๊ด„ํ˜ธ๋ฅผ ๋ฝ‘์•„์„œ ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜๋œ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์„ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์šฉ์–ด์˜ ์ •์˜

'(' ์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ, '(' ์˜ ๊ฐœ์ˆ˜์™€ ')' ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ด๋ฅผ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— '('์™€ ')'์˜ ๊ด„ํ˜ธ์˜ ์ง๋„ ๋ชจ๋‘ ๋งž์„ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, "(()))("์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ์ด์ง€๋งŒ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— "(())()"์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ์ด๋ฉด์„œ ๋™์‹œ์— ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ์ž…๋‹ˆ๋‹ค.

'(' ์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด w๊ฐ€ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. ์ž…๋ ฅ์ด ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ, ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
2. ๋ฌธ์ž์—ด w๋ฅผ ๋‘ "๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด" u, v๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, u๋Š” "๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"๋กœ ๋” ์ด์ƒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋ฉฐ, v๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ๋ฌธ์ž์—ด u๊ฐ€ "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด" ์ด๋ผ๋ฉด ๋ฌธ์ž์—ด v์— ๋Œ€ํ•ด 1๋‹จ๊ณ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3-1. ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ u์— ์ด์–ด ๋ถ™์ธ ํ›„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
4. ๋ฌธ์ž์—ด u๊ฐ€ "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์ด ์•„๋‹ˆ๋ผ๋ฉด ์•„๋ž˜ ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4-1. ๋นˆ ๋ฌธ์ž์—ด์— ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋กœ '('๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค.
  4-2. ๋ฌธ์ž์—ด v์— ๋Œ€ํ•ด 1๋‹จ๊ณ„๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ ๋ฌธ์ž์—ด์„ ์ด์–ด ๋ถ™์ž…๋‹ˆ๋‹ค.
  4-3. ')'๋ฅผ ๋‹ค์‹œ ๋ถ™์ž…๋‹ˆ๋‹ค.
  4-4. u์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์˜ ๊ด„ํ˜ธ ๋ฐฉํ–ฅ์„ ๋’ค์ง‘์–ด์„œ ๋’ค์— ๋ถ™์ž…๋‹ˆ๋‹ค.
  4-5. ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด p๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•ด ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

 

๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…

  • p๋Š” '(' ์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด๋ฉฐ ๊ธธ์ด๋Š” 2 ์ด์ƒ 1,000 ์ดํ•˜์ธ ์ง์ˆ˜์ž…๋‹ˆ๋‹ค.

  • ๋ฌธ์ž์—ด p๋ฅผ ์ด๋ฃจ๋Š” '(' ์™€ ')' ์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋งŒ์•ฝ p๊ฐ€ ์ด๋ฏธ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด ๊ทธ๋Œ€๋กœ return ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋‚˜๋Š” ์–ด๋–ป๊ฒŒ ํ’€์—ˆ๋‚˜

import java.util.Stack;
import java.lang.StringBuilder;

class Solution {
    public String solution(String p) {
        String answer = p;
        
        if(!isCorrectParen(p)) {
            answer = toCorrectParen(p);
        }
        
        return answer;
    }
    
    public String toCorrectParen(String w) {
        String u, v = "";
        String correctParen = "";
        
        if(w.equals("")) return "";
        
        // split u and v
        String[] wArr = w.split("");
        int mark = 0, balanceIndicator = 0;
        
        while(mark < wArr.length) {
            if(wArr[mark].equals("(")) balanceIndicator++;
            if(wArr[mark].equals(")")) balanceIndicator--;
            mark++;
            
            if(balanceIndicator == 0) break;
        }
        
        u = w.substring(0, mark);
        v = w.substring(mark);
                
        if(isCorrectParen(u)) { // phase 3
            return u + toCorrectParen(v);
        } 
        else { //phase 4
            StringBuilder sbd = new StringBuilder();
            sbd.append("(");
            sbd.append(toCorrectParen(v));
            sbd.append(")");
            
            String[] uArr = u.split("");
            for(int i = 1; i < uArr.length - 1; i++) {
                switch(uArr[i]) {
                    case "(":
                        sbd.append(")");
                        break;
                    case ")":
                        sbd.append("(");
                        break;
                }
            }
            
           correctParen += sbd.toString();
        }
    
        return correctParen;
    }
    
    public boolean isCorrectParen(String p) {
        String[] parenArr = p.split("");
        Stack<String> parens = new Stack<>();
        
        for(String paren : parenArr) {
            if(paren.equals("(")) parens.push(paren);
            if(paren.equals(")")) {
                if(parens.isEmpty()) return false;
                parens.pop();
            }
        }
        
        return parens.isEmpty();
    }
}

 

๋‚˜๋Š” ์™œ ์ €๋ ‡๊ฒŒ ํ’€์—ˆ๋‚˜

๋งจ ์ฒ˜์Œ  '๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด'์ธ์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋Š”๋ฐ DS์‹œ๊ฐ„์— ๋ฐฐ์šด ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ƒ๊ฐ๋‚˜ ๊ทธ ๋ฐฉ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋ฌธ์ œ์—์„œ ์•Œ๋ ค์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

 

๊ทธ ์ค‘ u์™€ v๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ถ€๋ถ„์ด ์–ด๋ ค์› ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„๋งŒ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด๋ณด๊ฒ ๋‹ค.

u๋Š” ๋” ์ด์ƒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์—†๋Š” '๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด'์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์™„์„ฑ๋˜๋ฉด ์•Œ๋ ค์ค„ ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” balanceIndicator๋ผ๋Š” intํ˜• ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. ๋ฌธ์ž์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ (๊ฐ€ ๋‚˜์˜ค๋ฉด increment๋ฅผ, )๊ฐ€ ๋‚˜์˜ค๋ฉด decrement๋ฅผ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  balanceIndicator๊ฐ€ 0์ด ๋˜๋ฉด ๊ทธ๊ฒƒ์€ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์™„์„ฑ๋˜์—ˆ๋‹ค๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋ณต๋ฌธ์„ ๋‚˜๊ฐ„ ๋’ค ๋‚˜๊ฐ„ ๊ทธ index๋ฅผ ๊ธฐ์ค€์œผ๋กœ u์™€ v๋ฅผ ๋‚˜๋ˆด๋‹ค.

 

์ฒ˜์Œ์— u์™€ v๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ถ€๋ถ„์„ ์ž˜๋ชป ์ดํ•ดํ•ด์„œ ํ•œ์ฐธ ํ—ค๋งธ๋Š”๋ฐ ์ œ๋Œ€๋กœ ๋ฌธ์ œ๋ฅผ ์ดํ•ด์‹œ์ผœ์ค€ ๊ฐ“์œ ์ง„์—๊ฒŒ ์ •๋ง์ •๋ง ๊ฐ์‚ฌํ•˜๋‹ค.๐Ÿ˜ญ

 

๋‚˜๋Š” ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜

๋ฌธ์ œ๋ฅผ ๊ผผ๊ผผ์ด ์ฝ์–ด๋ณด์ž ์ œ๋ฐœ ใ… ใ… 

๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ์œผ๋กœ StringBuilder๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋ณด๊ธฐ ์ข‹๋‹ค. ์•ž์œผ๋กœ ์• ์šฉํ•ด์•ผ๊ฒ ๋‹ค.