1. ์Šคํƒ(Stack)์ด๋ž€?

 - ์Šคํƒ์€ LIFO (Last In First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (ํ”„๋ง๊ธ€์Šค..)

- ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ œ๊ฑฐ๋œ๋‹ค.

   ์˜ˆ์‹œ: ์ ‘์‹œ๋ฅผ ์Œ“๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. ์ƒˆ ์ ‘์‹œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๋งจ ์œ„์— ๋†“์ด๊ณ , ์ ‘์‹œ๋ฅผ ๊บผ๋‚ผ ๋•Œ๋„ ๋งจ ์œ„์—์„œ๋ถ€ํ„ฐ ๊บผ๋‚ธ๋‹ค.

 

2. ์Šคํƒ์˜ ์ฃผ์š” ์—ฐ์‚ฐ

1. push():

  - ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ์˜ ๋งจ ์œ„์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ์˜ˆ: stack.push(1) → ์Šคํƒ์— 1 ์ถ”๊ฐ€.

2. pop():

  - ์Šคํƒ์˜ ๋งจ ์œ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  -  ์Šคํƒ์ด ๋น„์–ด ์žˆ์„ ๊ฒฝ์šฐ, EmptyStackException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

3. peek():

  - ์Šคํƒ์˜ ๋งจ ์œ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  - ์Šคํƒ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

4. isEmpty():

  -  ์Šคํƒ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  -  ๋น„์–ด ์žˆ์œผ๋ฉด true, ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

5. size():

  - ์Šคํƒ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

6. contains(Object o):

-  ํŠน์ • ๊ฐ’์ด ์Šคํƒ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

-  ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

import java.util.Stack;

public class StackFundamental {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();

        // 1. ์š”์†Œ ์ถ”๊ฐ€
        stack.push(1);
        stack.push(2);
        stack.push(3);

        // 2. ์Šคํƒ ์ƒํƒœ ํ™•์ธ
        System.out.println(stack);  // [1, 2, 3]

        // 3. ๋งจ ์œ„ ์š”์†Œ ํ™•์ธ
        System.out.println("์ œ์ผ ๊ผญ๋Œ€๊ธฐ์˜ ๊ฐ’ : " + stack.peek());  // 3

        // 4. ์š”์†Œ ์ œ๊ฑฐ
        System.out.println("๊บผ๋‚ธ ๊ฐ’ : " + stack.pop());  // 3

        // 5. ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
        System.out.println("์Šคํƒ์ด ๋น„์—ˆ๋Š”๊ฐ€? " + stack.isEmpty());  // false

        // 6. ์Šคํƒ ํฌ๊ธฐ ํ™•์ธ
        System.out.println("์Šคํƒ์— ์ €์žฅ ๋œ ์›์†Œ ์ˆ˜ : " + stack.size());  // 2

        // 7. ํŠน์ • ์š”์†Œ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ
        System.out.println("์Šคํƒ์— 1 ์ด ์žˆ๋Š”๊ฐ€? " + stack.contains(1));  // true
    }
}

 

3.์Šคํƒ์˜ ๋™์ž‘ ์ดํ•ด

  3.1 ์š”์†Œ ์ถ”๊ฐ€๋Š” ํ•ญ์ƒ ์Šคํƒ์˜ ๋งจ ์œ„์— ์ด๋ฃจ์–ด์ง„๋‹ค.

  3.2. ์š”์†Œ ์ œ๊ฑฐ๋Š” ํ•ญ์ƒ ์Šคํƒ์˜ ๋งจ ์œ„์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค.

  3.3 ์Šคํƒ ์ƒํƒœ:

     • ์ฒ˜์Œ: [1, 2, 3].

     •pop() ์ดํ›„: [1, 2].

 

4. ์Šคํƒ์˜ ํ™œ์šฉ ์˜ˆ

๊ด„ํ˜ธ ๊ฒ€์‚ฌ: ์—ด๊ณ  ๋‹ซ๋Š” ๊ด„ํ˜ธ์˜ ์ง์ด ๋งž๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ.

DFS (๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰): ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์—์„œ ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ.

Undo ๊ธฐ๋Šฅ ๊ตฌํ˜„: ์ž‘์—… ๊ธฐ๋ก์„ ์ €์žฅํ•˜์—ฌ ์ด์ „ ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•  ๋•Œ ์‚ฌ์šฉ.

 

์Šคํƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ์ˆœ์„œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฌธ์ œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.


๊ณผ์ œ 1. ์™„๋ฒฝํ•œ ๊ด„ํ˜ธ

  • Stack ์„ ํ™œ์šฉํ•˜์—ฌ ๊ด„ํ˜ธ์˜ ์—ด๊ณ  ๋‹ซํž˜์ด ์™„๋ฒฝํ•œ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ true, ์•„๋‹Œ ๊ฒฝ์šฐ false ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” solution ์ฝ”๋“œ๋ฅผ ์™„์„ฑํ•˜์„ธ์š”

 


1. ๋ฌธ์ œ ๋ถ„์„

   1.1 ๋ชฉํ‘œ : ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์ด “์™„๋ฒฝํ•œ ๊ด„ํ˜ธ”์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜ solution์„ ์ž‘์„ฑํ•œ๋‹ค.

   1.2 ์กฐ๊ฑด : 

 ์—ด๋ฆฐ ๊ด„ํ˜ธ (๋Š” ๋‹ซํžŒ ๊ด„ํ˜ธ )์™€ ์ •ํ™•ํžˆ ์ง์„ ์ด๋ฃจ์–ด์•ผ ํ•œ๋‹ค.

 ๋ชจ๋“  ๋‹ซํžŒ ๊ด„ํ˜ธ๋Š” ์Šคํƒ์— ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ง์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

 ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ํ™•์ธํ–ˆ์„ ๋•Œ ์Šคํƒ์ด ๋น„์–ด ์žˆ์–ด์•ผ ์™„๋ฒฝํ•œ ๊ด„ํ˜ธ์ด๋‹ค.

 

2. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

๊ด„ํ˜ธ์˜ ์—ด๋ฆผ๊ณผ ๋‹ซํž˜์˜ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด LIFO๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ ์œ„ํ•ด ์Šคํƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

์—ด๋ฆฐ ๊ด„ํ˜ธ(๋Š” ์Šคํƒ์— ๋„ฃ๊ณ , ๋‹ซํžŒ ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์Šคํƒ์—์„œ ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ด์„œ ๋งค์นญํ•œ๋‹ค. 

 

3. ์•Œ๊ณ ๋ฆฌ์ฆ˜.

1) ๋ฌธ์ž์—ด s๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋ฌธ์ž c๋ฅผ ํ™•์ธํ•œ๋‹ค.

2) ์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ์—๋Š”, ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.

3) ๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ์—๋Š”, ์Šคํƒ์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด ๋‹ซํžŒ ๊ด„ํ˜ธ์™€ ๋งค์นญ๋  ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ์Šคํƒ์—์„œ ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ฅผ ํ•˜๋‚˜๋ฅผ ๊บผ๋‚ธ๋‹ค.

4) ๋ฌธ์ž์—ด ์ˆœํšŒ๊ฐ€ ๋๋‚œ ํ›„: 

     ์Šคํƒ์ด ๋น„์–ด ์žˆ๋‹ค๋ฉด ์™„๋ฒฝํ•œ ๊ด„ํ˜ธ์ด๋‹ค. - true ๋ฐ˜ํ™˜

     ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค. - false ๋ฐ˜ํ™˜

 

4. ๋ฌธ์ œ ๋ถ„์„

 4.1 ์—ด๋ฆฐ ๊ด„ํ˜ธ์™€ ๋‹ซํžŒ ๊ด„ํ˜ธ์˜ ์ง์„ ํ™•์ธ :

- ์—ด๋ฆฐ ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์— ์ €์žฅํ•œ๋‹ค.

- ๋‹ซํžŒ ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚  ๋•Œ๋งˆ๋‹ค ์Šคํƒ์—์„œ ์—ด๋ฆฐ ๊ด„ํ˜ธ ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐ(pop)ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ซํžŒ ๊ด„ํ˜ธ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ถ”๊ฐ€๋œ ์—ด๋ฆฐ ๊ด„ํ˜ธ์™€ ๋งค์นญ๋œ๋‹ค. 

 4.2 ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ ๋ฐœ์ƒ :

- ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ์™”์„ ๋•Œ ์Šคํƒ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋งค์นญ๋  ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์—†๋‹ค๋Š” ๋œป์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ์ฆ‰์‹œ false ๋ฐ˜ํ™˜.

 4.3 ๋ฌธ์ž์—ด์„ ๋ชจ๋‘ ํ™•์ธ ํ›„ ์Šคํƒ ์ƒํƒœ ํ™•์ธ :

- ๋ชจ๋“  ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋งค์นญ๋˜์—ˆ๋‹ค๋ฉด ์Šคํƒ์€ ๋น„์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. 

- ์Šคํƒ์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋งค์นญ๋˜์ง€ ์•Š์€ ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ๋‚จ์•„ ์žˆ๋‹ค๋Š” ๋œป์œผ๋กœ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

import java.util.Stack;

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

				// ์˜์‚ฌ(Pseudo) ์ฝ”๋“œ
        // 1. ์—ด๋ฆฐ ๊ด„ํ˜ธ ”(“ ๋ฅผ ๋งŒ๋‚˜๋ฉด? ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค (push)
        // 2. ๋‹ซํžŒ ๊ด„ํ˜ธ๋ฅผ ”)” ๋งŒ๋‚˜๋ฉด? ์Šคํƒ์— ์žˆ๋Š” ์• ๋ฅผ ๋ฝ‘๋Š”๋‹ค (pop)
        // 3. ๋ฌธ์ž์—ด์ด ๋๋‚ฌ์–ด์š”
        //    ์Šคํƒ์ด ๋น„์—ˆ์œผ๋ฉด? -> ์™„๋ฒฝํ•œ ๊ด„ํ˜ธ -> True
        //    ์Šคํƒ์ด ์•ˆ๋น„์—ˆ์œผ๋ฉด? -> False
        // 4. ๋ฌธ์ž์—ด์ด ์•ˆ๋๋‚ฌ์–ด์š”
        //    ์Šคํƒ์ด ๋น„์—ˆ์œผ๋ฉด? -> False
        
        for (char c : s.toCharArray()) {
            if (c == '(') {
            // ์—ด๋ฆฐ ๊ด„ํ˜ธ๋Š” ์Šคํƒ์— ์ถ”๊ฐ€
            stack.push(c);
        }  else if (c == ')') {
             // ๋‹ซํžŒ ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ
             if (stack.isEmpty()) {
                 // ๋งค์นญ๋  ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์—†์œผ๋ฉด false
                 return false;
             }
             stack.pop(); // ๋งค์นญ๋˜๋Š” ์—ด๋ฆฐ ๊ด„ํ˜ธ ์ œ๊ฑฐ
        }
      }
       // ๋ชจ๋“  ๋ฌธ์ž์—ด ์ˆœํšŒํ›„ ์Šคํƒ์ด ๋น„์–ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        String tc1 = "()()"; // true
        String tc2 = "()()("; // false
        String tc3 = "())"; // false
        String tc4 = "((((((()))()()))))()()())(())))"; // false

        System.out.println(solution(tc1));
        System.out.println(solution(tc2));
        System.out.println(solution(tc3));
        System.out.println(solution(tc4));
    }
}

 

+ Recent posts