Algorithm

๋ฐฑ์ค€ 1874 | ์Šคํƒ ์ˆ˜์—ด

osean 2020. 10. 16. 19:11

์ง„์งœ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.

์–ด๋–ป๊ฒŒ๋“  ํ’€์–ด ๋ณด๊ฒ ๋‹ค๊ณ  ์•ˆ๊ฐ„ํž˜์„ ์“ด ํ”์ .

  • ๋ง์•„๋จน์„ ๋‚ด ์ฝ”๋“œ

      package ์‹ฌ์„ฑํ—Œ.์•Œ๊ณ ๋ฆฌ์ฆ˜_2์ฃผ์ฐจ;
    
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      import java.util.List;
    
      public class ์Šคํƒ์ˆ˜์—ด_1874 {
    
          static public BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
          static public int[] input(int n) throws NumberFormatException, IOException {
    
              int[] input = new int[n];
    
              for (int i = 0; i < n; i++) {
                  input[i] = Integer.parseInt(br.readLine());
              }
    
              return input;
    
          }
    
          static public void stack(int[] input) {
    
              int subPlus = 0;
              List<Integer> list = new ArrayList<Integer>();
    
              for (int i = 1; i <= input.length; i++) {
    
                  if (list.isEmpty() || !list.get(list.size() - 1).equals(input[subPlus])) {
                      list.add(i);
                      System.out.println("+");
                  } else {
                      list.remove(list.size() - 1);
                      subPlus++;
                      System.out.println("-");
                  }
    
                  for (int k = 0; k < list.size(); k++) {
                      System.out.print(list.get(k) + " ");
                  }
    
                  System.out.println(" / list.size() = " + list.size());
    
              }
    
          }
    
          public static void main(String[] args) throws NumberFormatException, IOException {
              int[] input = input(Integer.parseInt(br.readLine()));
              stack(input);
          }
    
      }

๋˜ ๋‹ค์‹œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ๋ฏธ์ณค๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ •๋ง๋กœ.
์ฒ˜์Œ์—๋Š” stack์— ๋Œ€ํ•ด์„œ ์ดํ•ด๋Š” ํ–ˆ์ง€๋งŒ ๋ฌธ์ œ ์ž์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ•  ์ง€ ๋ชฐ๋ผ์„œ ์•ž์ด ์บ„์บ„ํ–ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ฌธ์ œ๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ ๊ทธ๋Œ€๋กœ ๊ทธ๋ ธ๋”๋‹ˆ ์–ด๋Š์ •๋„ ๊ฐ์€ ์žกํ˜”๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ArrayList ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์–ด๋–ป๊ฒŒ๋“  ํ’€์–ด๋‚ด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๋‚œ ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.(๐Ÿ˜‡)

  1. Stack ํด๋ž˜์Šค์˜ ์กด์žฌ๋ฅผ ๋ชฐ๋ž๋˜ ์ .
  2. ๋‹ค์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด์ƒํ•œ ๊ณ ์ง‘.
  3. ๋“ฑ๋“ฑ...

์ •๋ง 1, 2๋ฒˆ์˜ ๋น„์ค‘์ด ๋‚˜๋ฅผ ํ™”๋‚˜๊ฒŒ ํ•˜๋Š” ํฐ ์š”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  • ์–ด๋–ป๊ฒŒ๋“  ํ’€์–ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•œ ๋‚˜์˜ ํ”์ ๋“ค..

์ฝ”๋“œ์™€ ํ•„๊ธฐ๋ฅผ ๋ณด๋ฉด ๋Œ€์ถฉ ๋Š๋‚Œ์ด ์˜ค๊ฒ ์ง€๋งŒ,
Stack ํด๋ž˜์Šค ์กด์žฌ ์œ ๋ฌด๋„ ๋ชฐ๋ž๋˜ ๋ฐ”๋ณด ์‹ฌ์„ฑํ—Œ์€ push, pop์„ ArrayList.remove()์™€ for๋ฌธ์„ ํ†ตํ•ด์„œ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.(๐Ÿคฎ)

Stack ํด๋ž˜์Šค

๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์—†๋‹ค๋Š” ์—ด๋“ฑ๊ฐ์— ์ง€๊ณ  ๋ง์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ๊ธ€์— ๊ฒ€์ƒ‰ํ–ˆ๋‹ค.
์ด ๋•Œ Stack ํด๋ž˜์Šค๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ํ•ด๋‹น ํด๋ž˜์Šค์—๋Š” push(), pop(). peek() ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์œ„์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • Stack.push(n) → Stack์— n์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…
  • Stack.pop() → Stack์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ
  • Stack.peek() → Stack์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ์ฐธ๊ณ ํ–ˆ์ง€๋งŒ, ์–ด์จŒ๋“  ๋‚ด ์†์œผ๋กœ ํ’€์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์‹ถ๋‹ค.(์ฐฉ๊ฐ์˜ ๋Šช)

  • Stack ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ

      package ์‹ฌ์„ฑํ—Œ.์•Œ๊ณ ๋ฆฌ์ฆ˜_2์ฃผ์ฐจ;
    
      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      import java.util.Stack;
    
      public class ์Šคํƒ์ˆ˜์—ด_1874 {
          public static void main(String[] args) throws NumberFormatException, IOException {
    
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              StringBuffer sb = new StringBuffer();
              Stack<Integer> stack = new Stack<Integer>();
              int n = Integer.parseInt(br.readLine());
              int[] arr = new int[n];
    
              int m = 0;
              for (int i = 0; i < n; i++) {
                  arr[i] = Integer.parseInt(br.readLine());
                  stack.push(i + 1);
                  sb.append("+ \n");
                  while (!stack.isEmpty() && stack.peek() == arr[m]) {
                      stack.pop();
                      sb.append("- \n");
                      m++;
                  }
    
              }
              if (!stack.isEmpty()) {
                  System.out.println("NO");
              } else {
                  System.out.println(sb.toString());
              }
    
          }
    
      }

์œ„์— ๋„์ ๊ฑฐ๋ฆฐ ํ•„๊ธฐ์™€ ๋‚˜์˜ ๊ณ ์ง‘์„ ์ด๊ฒจ๋‚ด๋ ค๋Š” ๋งˆ์Œ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.
๋จผ์ € ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์€ BufferReader ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , + / - ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด ํด๋ž˜์Šค๋Š” StringBuffer ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ StringBuilder ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋„ ๋งŽ์•˜๋‹ค.

๋น„๋ก ๋‹ค์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ๋‹ค์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” 1 ~ n๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š” ๊ฒƒ๋„ ๋˜ ๋‹ค๋ฅธ for๋ฌธ์„ ์„ ์–ธํ•ด์„œ ์ž…๋ ฅํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ BufferReader ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ค‘๋ณต๋˜๋Š” ๋ฐ˜๋ณต๋ฌธ์€ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

for๋ฌธ์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ˆ˜์—ด๋กœ ๋“ฑ๋กํ•  ๋ณ€์ˆ˜์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , stack์— i + 1๋ฅผ ์‚ฝ์ž…ํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด i ๊ฐ€ ์ปค์ง€๋ฉด์„œ stack์— ์Œ“์ด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

i = 0 / stack.get(0) = i + 1 = 1
i = 1 / stack.get(1) = i + 1 = 2
i = 2 / stack.get(2) = i + 1 = 3

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์ˆ˜์—ด์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ์™€ stack์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์œผ๋ฉด stack์˜ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋Š” pop์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทผ๋ฐ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฐ์†์œผ๋กœ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ์šฐ๋„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค!

์œ„์™€ ๊ฐ™์ด ์—ฐ์†์œผ๋กœ pop()์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฐ˜๋ณต์„ ์ˆ˜ํ–‰ํ•˜๋Š” while๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

 

pop()๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด

1.ํ˜„์žฌ(i) ์ž…๋ ฅํ•œ ์ˆ˜์—ด์˜ ๊ฐ’๊ณผ stack.peek()์˜ ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด!
2.stack์ด ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด!

์ฒ˜์Œ์—๋Š” stack์ด ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ while๋ฌธ์˜ ์กฐ๊ฑด์œผ๋กœ ๋„ฃ์ง€ ์•Š์•˜๋Š”๋ฐ, ๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด stack.peek()๊ณผ ์ˆ˜์—ด์˜ ๊ฐ’์„ ๋น„๊ตํ•  ์ˆ˜ ์—†์–ด์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
(stack์ด ๋น„์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— peek()์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.)

๋˜ ํ•œ ๊ฐ€์ง€ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ˆ˜์—ด์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ i๊ฐ€ ๋˜๋ฉด ์•ˆ๋œ๋‹ค. ์ˆ˜์—ด์˜ ๊ฒฝ์šฐ๋Š” pop()์ด ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ(์ฆ‰, while๋ฌธ์ด ์‹คํ–‰ ๋˜๋ฉด์„œ ์กฐ๊ฑด์ด true์ธ ๊ฒฝ์šฐ)์—๋งŒ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ 1์”ฉ ์ฆ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ˆ˜์—ด์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ณ„๋„๋กœ ์„ ์–ธํ–ˆ๋‹ค.


(int m = 0;)

 

์ด๋ ‡๊ฒŒ ํ’€๋ฉด ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ •์ƒ์ ์œผ๋กœ ํ•ด๊ฒฐ์ด ๋œ๋‹ค.
์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ stack์ด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์— "NO"๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ์กฐ๊ฑด์ด stack์ด ๋น„์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ž€ pop()์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ์—ฐ์‚ฐํ•  ๋•Œ ์ˆ˜์—ด์— ์ž…๋ ฅ๋œ ๊ฐ’์ด -1 ์”ฉ ๊ฐ์†Œํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
for๋ฌธ์˜ i๋Š” 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ, stack์—์„œ๋„ 1์”ฉ ์ฆ๊ฐ€ํ•œ i๋ฅผ pushํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ „์— ์ˆ˜ํ–‰๋œ ๋ฐ˜๋ณต๋ฌธ์—์„œ pop๋œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ pop ์กฐ๊ฑด์—์„œ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์—†๋‹ค.(๋งž๊ฒŒ ๋ง์„ ํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.)


์™œ๋ƒํ•˜๋ฉด ์œ„์˜ ๊ฒฝ์šฐ์— ๊ฒ€์‚ฌํ•˜์ง€ ๋ชปํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ stack์— ๋‚จ์•„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅํ•œ ์ˆ˜์—ด ๋ฐ์ดํ„ฐ๋งŒํผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๋ถ€๋ถ„์„ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๋งž์•˜์Šต๋‹ˆ๋‹ค! ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋Šฆ์—ˆ๋‹ค. ์ด์ œ ์ž˜๊ฑฐ๋‹ค. ์•ˆ๋…•!