๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿงฉ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿต ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java ] ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ

by carrot0911 2025. 3. 26.

๋ฌธ์ œ ์„ค๋ช…

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

๊ด„ํ˜ธ๊ฐ€ ๋ฐ”๋ฅด๊ฒŒ ์ง์ง€์–ด์กŒ๋‹ค๋Š” ๊ฒƒ์€ '(' ๋ฌธ์ž๋กœ ์—ด๋ ธ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ์ง์ง€์–ด์„œ ')' ๋ฌธ์ž๋กœ ๋‹ซํ˜€์•ผ ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

  • "()()" ๋˜๋Š” "(())()" ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค.
  • ")()(" ๋˜๋Š” "(()(" ๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ์ž…๋‹ˆ๋‹ค.

'(' ๋˜๋Š” ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด s๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฌธ์ž์—ด s๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ์ด๋ฉด true๋ฅผ return ํ•˜๊ณ , ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ์ด๋ฉด false๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด : 100,000 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ๋ฌธ์ž์—ด s๋Š” '(' ๋˜๋Š” ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

s answer
"()()" true
"(()()" true
")()(" false
"(()(" false

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1,2,3,4

  • ๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

import java.util.*;

class Solution {
    boolean solution(String s) {
        boolean answer = true;

		// ๊ด„ํ˜ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด ์Šคํƒ ์ƒ์„ฑ
        Stack<Character> stack = new Stack<>();
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ๊ด„ํ˜ธ ํ™•์ธ
        for (char c : s.toCharArray()) {
            // ๋งŒ์•ฝ ์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
            if (c == '(') {
                // ์Šคํƒ์— ๋ฌธ์ž c ์ถ”๊ฐ€
                stack.push(c);
            }
            
            // ๋งŒ์•ฝ ๋‹ซํžŒ ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ
            if (c == ')') {
                // ๋งŒ์•ฝ ์Šคํƒ์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ 
                if (stack.isEmpty()) {
                    // false ๋ฐ˜ํ™˜
                    return false;
                }
                // ๋งˆ์ง€๋ง‰ ๊ฐ’ ์‚ญ์ œ
                stack.pop();
            }
        }
        
        // ๋งŒ์•ฝ ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ
        if (!stack.isEmpty()) {
            // answer์— false ์ €์žฅ
            answer = false;
        }
        
        // answer ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

  • ๊ด„ํ˜ธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์Šคํƒ ํ•„์š”
  • ์—ด๋ฆฐ ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ ์ €์žฅ, ๋‹ซํžŒ ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ ์Šคํƒ์— ์ €์žฅ๋œ ์—ด๋ฆฐ ๊ด„ํ˜ธ ํ•˜๋‚˜ ์‚ญ์ œ
  • ์Šคํƒ์— ๊ฐ’์ด ์—†์„ ๋•Œ ๋‹ซํžŒ ๊ด„ํ˜ธ์ด๊ฑฐ๋‚˜, ๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋œ ํ›„ ์Šคํƒ์— ๊ฐ’์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด false

์Šคํƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ

class Solution {
    boolean solution(String s) {
        boolean answer = true;

        // ๋ณ€์ˆ˜ count์— 0 ์ €์žฅ
        int count = 0;
        
        // ๋ฐ˜๋ณต๋ฌธ์„ ํ™œ์šฉํ•˜์—ฌ ๊ด„ํ˜ธ ํ™•์ธ
        for (char c : s.toCharArray()) {
            // ๋งŒ์•ฝ ์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
            if (c == '(') {
                // count +1
                count++;
            }
            // ๋งŒ์•ฝ ๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
            if (c == ')') {
                // ๋งŒ์•ฝ count ๊ฐ’์ด 0์ผ ๊ฒฝ์šฐ
                if (count == 0) {
                    // false ๋ฐ˜ํ™˜
                    return false;
                }
                // count -1
                count--;
            }
        }
        
        // ๋งŒ์•ฝ count๊ฐ€ 0์ด ์•„๋‹ ๊ฒฝ์šฐ
        if (count != 0) {
            // false ๋ฐ˜ํ™˜
            return false;
        }
        
        // answer ๋ฐ˜ํ™˜
        return answer;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

  • ์—ด๋ฆฐ ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ count +1, ๋‹ซํžŒ ๊ด„ํ˜ธ์ผ ๊ฒฝ์šฐ count -1
  • count ๊ฐ’์ด 0์ผ ๋•Œ ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด false
  • ๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋œ ํ›„ count ๊ฐ’์ด 0์ด ์•„๋‹ˆ๋ผ๋ฉด false