[BoJ][JAVA] 1874 - ์Šคํƒ ์ˆ˜์—ด

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

๋ฌธ์ œ ๋งํฌ - https://www.acmicpc.net/problem/1874

๐Ÿ” ๋ฆฌ๋ทฐ

์ฒด๊ฐ ๋‚œ์ด๋„: โญ๏ธโญ๏ธโญ๏ธ

โญ๏ธ - EZ
โญ๏ธโญ๏ธ - ๊ณ ๋ฏผ ์ข€ ํ–ˆ๋‹ค..
โญ๏ธโญ๏ธโญ๏ธ - ๋ชปํ’€์—ˆ๋‹ค… ํ•ด์„ค ๋ดค์Œ
โญ๏ธโญ๏ธโญ๏ธโญ๏ธ - ํ•ด์„ค ๋ด๋„ ๋ชจ๋ฅด๊ฒ ์–ด
โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ - ์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ํ’€์—ˆ์ง€ ๋‚ด๊ฐ€..?

๋ฌธ์ œ ์ดํ•ด

์ด ๋ฌธ์ œ์—์„œ๋Š” ์ž…๋ ฅ์˜ ๋ถ„๋ฅ˜๊ฐ€ ๋‘ ๊ฐ€์ง€๋‹ค.

  • ์ฒซ์งธ ์ค„: ์ˆ˜์—ด์˜ ํฌ๊ธฐ N์„ ์ž…๋ ฅ,
  • ๋‘˜์จฐ ์ค„๋ถ€ํ„ฐ ~ N๋ฒˆ์งธ ์ค„: N๊ฐœ์˜ ์ˆ˜์—ด์˜ ์š”์†Œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

Stack์— 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ฐจ๋ก€๋กœ ๊ฐ ์š”์†Œ๋ฅผ push ํ˜น์€, popํ•˜์—ฌ pop์„ ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ˆ˜์—ด์˜ ์ˆœ์„œ์™€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.

์—ฐ์‚ฐ ์ค‘์— push๋ฅผ ํ•œ๋‹ค๋ฉด ‘+’๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , pop์„ ํ•œ๋‹ค๋ฉด ‘-’๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋งŒ์•ฝ ์–ด๋– ํ•œ ์—ฐ์‚ฐ์œผ๋กœ๋„ ์Šคํƒ์—์„œ popํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์ˆ˜์—ด๊ณผ ๋™์ผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ‘NO’๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๋‚ด ์ฝ”๋“œ

import java.io.*;
import java.util.Stack;

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());

        Stack<Integer> s = new Stack<>(); // Stack
        int current = 1; // ํ˜„์žฌ ์Šคํƒ์— ๋„ฃ์„ ์ˆซ์ž (1๋ถ€ํ„ฐ ์‹œ์ž‘)
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < n; i++) {
            int target = Integer.parseInt(br.readLine());

            while (current <= target) { // ํ˜„์žฌ ๊ฐ’์ด ์ž…๋ ฅ๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด push
                s.push(current);
                result.append("+\\n");
                current++;
            }

            // ์Šคํƒ์˜ top์ด target๊ณผ ๊ฐ™๋‹ค๋ฉด pop
            if (s.peek() == target) {
                s.pop();
                result.append("-\\n");
            } else { // target์„ ๋งŒ๋“ค ์ˆ˜ ์—†์œผ๋ฉด NO ์ถœ๋ ฅ ํ›„ ์ข…๋ฃŒ
                bw.write("NO\\n");
                bw.flush();
                return;
            }
        }

        // ์ข…๋ฃŒ
        bw.write(result.toString());
        bw.flush();
        bw.close();
    }
}

ํ•ด์„ค

Stack์„ S, ์ˆ˜์—ด์˜ Tํ˜„์žฌ ๊ฐ’์„ t๋ผ๊ณ  ํ•œ๋‹ค๋ฉด,

  1. ์šฐ์„  ‘+’, ‘-’๋ฅผ ์ €์žฅํ•  StringBuilder๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Š” ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ถœ๋ ฅํ•ด๋ฒ„๋ฆฐ๋‹ค๋ฉด ‘NO’๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•  ๋•Œ, ‘NO’๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ.
  2. ๋˜ํ•œ, ๋ฐ˜๋ณต๋ฌธ์—์„œ Stack์— ๋“ค์–ด ๊ฐˆ ๊ฐ’์„ ๊ธฐ์–ตํ•  ๋ณ€์ˆ˜(current)๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  3. Stack์— 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ฑ„์›Œ์•ผ ํ•œ๋‹ค → ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ
  4. ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ ์ˆ˜์—ด์˜ ์š”์†Œ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ๊ทธ ๊ฐ’๊ณผ ํ˜„์žฌ ๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค
  5. ๋น„๊ตํ•˜์—ฌ ํ˜„์žฌ stack์— ‘๋“ค์–ด๊ฐˆ’ ๊ฐ’์ด ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๋ฉด ๊ณ„์† pushํ•ด๋ฒ„๋ฆฌ๊ณ 
  6. pushํ•  ๋•Œ๋งˆ๋‹ค ํ˜„์žฌ ‘๋“ค์–ด ๊ฐˆ’ ๊ฐ’์„ ๋‹ด๋Š” ๋ณ€์ˆ˜(current)๋ฅผ 1 ์ฆ๊ฐ€์‹œ์ผœ์ค€๋‹ค.
  7. stack์— ‘๋“ค์–ด ๊ฐˆ’ ๊ฐ’์ด ์ž…๋ ฅ๋ฐ›์€ ์š”์†Œ๋ณด๋‹ค ํฌ๋‹ค๋ฉด push๋ฅผ ๋ฉˆ์ถ”๊ณ 
  8. stack์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’(Last Input)์„ ์ž…๋ ฅ๋ฐ›์€ ์š”์†Œ์™€ ๋น„๊ตํ•œ๋‹ค
  9. ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€ ์ผ์น˜ํ•œ๋‹ค๋ฉด popํ•œ๋‹ค.
  10. ์ฒซ ๋ฒˆ์งธ pop์€ ์ผ์น˜ํ•  ์ˆ˜๋ฐ–์— ์—†๋‹ค. 1๋ถ€ํ„ฐ n๊นŒ์ง€ ์ค‘์— ์ˆ˜์—ด์— ๋“ค์–ด๊ฐˆ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฐ’์€ ๋ฌด์กฐ๊ฑด ์ฐพ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  11. ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ๊ฒฝ์šฐ๋Š” ์ ˆ๋Œ€ ์ˆ˜์—ด๊ณผ ๋งŒ์กฑํ•˜๋Š” OutStack์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค.
    1. Stack{ 1, 2, 3, 4, 5} / ์ˆ˜์—ด์— ๋“ค์–ด๊ฐˆ ์š”์†Œ ์ž…๋ ฅ๊ฐ’: 5 ์ผ๋•Œ ์ˆ˜์—ด์„ { 5 }๊ฐ€ ๋˜๊ณ , ์Šคํƒ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด popํ•ด์ค€๋‹ค.
    2. Stack{1, 2, 3, 4} / OutStack{ 5 } = ์ˆ˜์—ด{ 5 } ์ธ ์ƒํ™ฉ์ด๋ผ ๋™์ผํ•ด์ง„๋‹ค
    3. ํ•˜์ง€๋งŒ ๊ทธ ๋‹ค์Œ ์ˆ˜์—ด์— ๋“ค์–ด๊ฐˆ ์š”์†Œ์ž…๋ ฅ์ด 3์ด๋ผ๋ฉด?
    4. Stack{1, 2, 3, 4} / OutStack{ 5 } / ์ˆ˜์—ด { 5, 3 } ์ด๋ ‡๊ฒŒ ๋์„ ๊ฒฝ์šฐ, ์ ˆ๋Œ€๋กœ popํ•ด์„œ OutStack์œผ๋กœ ๋‹ด๋Š”๋‹ค๊ณ  ํ•ด๋„ { 5, 4, 3 }์ด ๋˜์ง€ { 5, 3 }์ด ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    5. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ๊ฒฝ์šฐ, else์—์„œ ‘NO’๋ฅผ์ถœ๋ ฅ์„ ํ•ด์ค€๋‹ค.