λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 1874 μŠ€νƒ μˆ˜μ—΄

by 🍊귀🍊 2024. 7. 23.

문제 

문제 링크 https://www.acmicpc.net/problem/1874

  • μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ 가지고 μžˆλ‹€.
  • 1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€.
  • μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž.
  • μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.
  • 첫 쀄에 n (1 ≤ n ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 주어진닀. λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.
  • μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

아이디어

  • λ§Œλ“€μ–΄μ•Ό λ˜λŠ” μˆ˜μ—΄μ„ λ¨Όμ € 받아놓고 배열에 μ €μž₯ν•œ ν›„, 1λΆ€ν„° nκΉŒμ§€ stack에 ν•˜λ‚˜μ”© λ„£μœΌλ©΄μ„œ μ—°μ‚°κ²°κ³Ό 배열에 ' + 'λ₯Ό λ„£μ–΄μ£Όκ³  stack의 κΌ­λŒ€κΈ° κ°’κ³Ό λ§Œλ“€μ–΄μ•Όλ˜λŠ” μˆ˜μ—΄μ˜ ν•΄λ‹Ή 번째의 μˆ«μžκ°€ κ°™λ‹€λ©΄ μ—°μ‚°κ²°κ³Ό 배열에 ' - 'λ₯Ό λ„£μ–΄μ£Όκ³  stack 제일 μœ„ 숫자λ₯Ό λΉΌμ„œ κ²°κ³Ό 배열에 λ„£λŠ”λ‹€.
  • while문을 ν†΅ν•΄μ„œ κΌ­λŒ€κΈ°κ°€ κ°™μœΌλ©΄ κ³„μ†ν•΄μ„œ λΉΌμ£Όκ³  λ§Œμ•½ 같지 μ•Šκ±°λ‚˜ stack이 λΉ„μ—ˆμ„ 경우 while문을 μ’…λ£Œν•˜κ³  λ‹€μŒ for문으둜 λŒμ•„κ°€μ„œ λ‹€μŒ 숫자λ₯Ό stack에 λ„£λŠ”λ‹€. 
  • μœ„μ˜ 과정을 λ°˜λ³΅ν•˜λ©° nκΉŒμ§€ λͺ¨λ‘ μž…λ ₯ν–ˆμ„ 경우, λ°˜λ³΅λ¬Έμ„ 끝내고 λ§Œμ•½ stack에 남은 μˆ«μžλ“€μ΄ μžˆλ‹€λ©΄ λ”°λ‘œ for문을 ν†΅ν•΄μ„œ 결과배열에 μˆœμ„œλŒ€λ‘œ λ„£μ–΄μ€€λ‹€.
  • κ·Έλ ‡κ²Œ λ§Œλ“  κ²°κ³Όλ°°μ—΄κ³Ό λ§Œλ“€μ–΄μ•Όλ˜λŠ” μˆ˜μ—΄ 배열을 λΉ„κ΅ν–ˆμ„ λ•Œ, 두 배열이 κ°™λ‹€λ©΄ μ—°μ‚°κ²°κ³Όλ₯Ό(' + ' 와 ' - 'λ₯Ό 넣은 λ°°μ—΄) 좜λ ₯ν•˜κ³  같지 μ•Šλ‹€λ©΄ 'NO'λ₯Ό 좜λ ₯ν•œλ‹€.    

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • X

였늘 μ•žμ—μ„œ ν’€μ—ˆλ˜ λ‘λ¬Έμ œλ³΄λ‹¨ λ‚˜λ¦„ μˆ˜μ›”νžˆ ν’€μ—ˆλ˜ 것 κ°™λ‹€..!

μ½”λ“œ

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

public class BOJ1874 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());

        // λ§Œλ“€μ–΄μ•Όλ  μˆ˜μ—΄
        int cal[] = new int[n];

        // κ²°κ³Ό λ°°μ—΄
        int result[] = new int[n];

        // stack을 계산할 stack
        Stack<Integer> s = new Stack<>();

        List<String> out = new ArrayList<>();

        // μˆœμ„œλŒ€λ‘œ 숫자λ₯Ό λ„£μ–΄μ€Œ
        for(int i = 0; i < n; i++){
            int num = Integer.parseInt(br.readLine());

            cal[i] = num;
        }

        // λ§Œλ“€μ–΄μ•Όλ  μˆ˜μ—΄μ˜ 순번
        int cnt = 0;

        // 1λΆ€ν„° nκΉŒμ§€ 반볡
        for(int i = 1; i <= n; i++){
            // iλ₯Ό stack에 λ„£μŒ
            s.push(i);

            // stack에 λ„£μ—ˆμœΌλ―€λ‘œ 배열에 + μΆ”κ°€
            out.add("+");

            while(true){
                // λ§Œμ•½ λ§Œλ“€μ–΄μ•Όλ˜λŠ” μˆ˜μ—΄μ˜ ν•΄λ‹Ή 순번 μˆ«μžμ™€
                // stack에 κΌ­λŒ€κΈ° μˆ«μžκ°€ κ°™λ‹€λ©΄
                // stackμ—μ„œ κΌ­λŒ€κΈ° 값을 제거 ν›„
                // κ²°κ³Όκ°’ μ €μž₯ 배열에 - μΆ”κ°€
                // 그리고 κ²°κ³Ό 배열에 ν•΄λ‹Ή 숫자 μΆ”κ°€
                if(cal[cnt] == s.peek()){
                    out.add("-");
                    result[cnt] = s.peek();
                    s.pop();
                    // λ‹€μŒ 순번으둜 λ„˜μ–΄κ°
                    cnt = cnt + 1;
                }
                // λ§Œμ•½ λ‘κ°œμ˜ μˆ«μžκ°€ 같지 μ•Šλ‹€λ©΄ whileλ¬Έ μ’…λ£Œ
                else{
                    break;
                }

                // λ§Œμ•½ 결과배열에 λκΉŒμ§€ λ‹€ λ“€μ–΄κ°”κ±°λ‚˜ stack이 λΉ„μ—ˆλ‹€λ©΄
                // whileλ¬Έ μ’…λ£Œ
                if(cnt == (n - 1) || s.isEmpty()){
                    break;
                }
            }
        }

        // nκΉŒμ§€ λͺ¨λ‘ μž…λ ₯을 ν–ˆμœΌλ―€λ‘œ stack에 남은
        // μˆ«μžλŠ” λͺ¨λ‘ λΉΌλŠ” 방법밖에 μ—†μŒ
        for(int i = 0; i < s.size(); i++){
            out.add("-");
            result[cnt] = s.peek();
            s.pop();
            // λ‹€μŒ 순번으둜 λ„˜μ–΄κ°
            cnt = cnt + 1;
        }

        // 두 μˆ˜μ—΄μ΄ 같은지 νŒλ³„ν•  λ³€μˆ˜
        boolean same = true;

        // λ§Œλ“€μ–΄μ•Όλ˜λŠ” μˆ˜μ—΄κ³Ό λ§Œλ“  μˆ˜μ—΄μ΄ 같은지 비ꡐ
        for(int i = 0; i < n; i++){
            if(cal[i] != result[i]){
                same = false;
                break;
            }
        }

        // λ§Œμ•½ 두 μˆ˜μ—΄μ΄ κ°™λ‹€λ©΄ μ—°μ‚°κ²°κ³Όλ₯Ό μ €μž₯ν•œ 배열을 좜λ ₯
        if(same){
            for(int i = 0; i < out.size(); i++){
                sb.append(out.get(i) + "\n");
            }

            System.out.println(sb);
        }
        // 같지 μ•Šλ‹€λ©΄ NO 좜λ ₯
        else{
            System.out.println("NO");
        }
    }
}



'μ•Œκ³ λ¦¬μ¦˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Java] BOJ 11047 동전 0  (2) 2024.07.23
[Java] BOJ 1764 λ“£λ³΄μž‘  (2) 2024.07.23
[Java] BOJ 1654 λžœμ„  자λ₯΄κΈ°  (10) 2024.07.22
[Java] BOJ 2108 톡계학  (2) 2024.07.22
[Java] BOJ 1966 ν”„λ¦°ν„° 큐  (0) 2024.07.21