JiYoung Dev πŸ–₯

[λ°±μ€€ 1874] μŠ€νƒμœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μˆ˜μ—΄ λ§Œλ“€κΈ° : Stack λ³Έλ¬Έ

Study/μ•Œκ³ λ¦¬μ¦˜, κ΅¬ν˜„ λ¬Έμ œν’€μ΄

[λ°±μ€€ 1874] μŠ€νƒμœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μˆ˜μ—΄ λ§Œλ“€κΈ° : Stack

Shinjio 2024. 11. 5. 22:46

πŸ”Ž 문제

문제 μ„€λͺ…

μŠ€νƒ (stack)은 기본적인 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  λ•Œ 자주 μ΄μš©λ˜λŠ” κ°œλ…μ΄λ‹€. μŠ€νƒμ€ 자료λ₯Ό λ„£λŠ” (push) μž…κ΅¬μ™€ 자료λ₯Ό λ½‘λŠ” (pop) μž…κ΅¬κ°€ κ°™μ•„ 제일 λ‚˜μ€‘μ— λ“€μ–΄κ°„ μžλ£Œκ°€ 제일 λ¨Όμ € λ‚˜μ˜€λŠ” (LIFO, Last in First out) νŠΉμ„±μ„ 가지고 μžˆλ‹€.

1λΆ€ν„° nκΉŒμ§€μ˜ 수λ₯Ό μŠ€νƒμ— λ„£μ—ˆλ‹€κ°€ 뽑아 λŠ˜μ–΄λ†“μŒμœΌλ‘œμ¨, ν•˜λ‚˜μ˜ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλ‹€. μ΄λ•Œ, μŠ€νƒμ— pushν•˜λŠ” μˆœμ„œλŠ” λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμ„ 지킀도둝 ν•œλ‹€κ³  ν•˜μž. μž„μ˜μ˜ μˆ˜μ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ μŠ€νƒμ„ μ΄μš©ν•΄ κ·Έ μˆ˜μ—΄μ„ λ§Œλ“€ 수 μžˆλŠ”μ§€ μ—†λŠ”μ§€, μžˆλ‹€λ©΄ μ–΄λ–€ μˆœμ„œλ‘œ push와 pop 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ‚Ό 수 μžˆλ‹€. 이λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

첫 쀄에 n (1 ≤ n ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 n개의 μ€„μ—λŠ” μˆ˜μ—΄μ„ μ΄λ£¨λŠ” 1이상 nμ΄ν•˜μ˜ μ •μˆ˜κ°€ ν•˜λ‚˜μ”© μˆœμ„œλŒ€λ‘œ 주어진닀. λ¬Όλ‘  같은 μ •μˆ˜κ°€ 두 번 λ‚˜μ˜€λŠ” 일은 μ—†λ‹€.

좜λ ₯

μž…λ ₯된 μˆ˜μ—΄μ„ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 연산을 ν•œ 쀄에 ν•œ κ°œμ”© 좜λ ₯ν•œλ‹€. push연산은 +둜, pop 연산은 -둜 ν‘œν˜„ν•˜λ„λ‘ ν•œλ‹€. λΆˆκ°€λŠ₯ν•œ 경우 NOλ₯Ό 좜λ ₯ν•œλ‹€.

 

 

🎁 풀이

ν•΄λ‹Ή λ¬Έμ œλŠ” 말 κ·ΈλŒ€λ‘œ μŠ€νƒμ„ ν™œμš©ν•΄μ„œ ν‘ΈλŠ” λ¬Έμ œμ΄λ‹€.

μ²˜μŒμ— 문제 ν•΄λ‹΅ 과정을 μ ‘ν–ˆμ„ λ•Œμ—λŠ” μŠ€νƒ ꡬ쑰가 ν•˜λ‚˜ 있고, ν•΄λ‹Ή μŠ€νƒμ„ μž…λ ₯ν•œ κ°’ λŒ€λ‘œ μŒ“μ•„μ„œ ν‘ΈλŠ” 문제인 쀄 μ•Œμ•˜λ‹€. κ·ΈλŸ¬λ‚˜ ν’€λ‹€λ³΄λ‹ˆ μŠ€νƒ ꡬ쑰λ₯Ό ν™œμš©ν•˜μ—¬ μž…λ ₯ 받은 μˆ˜μ—΄μ„ λ§Œλ“œλŠ” λ¬Έμ œμ˜€λ‹€. 

 

μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ ν’€μ–΄μ„œ μ„€λͺ…ν•˜μžλ©΄, μŠ€νƒμ„ μ΄μš©ν•΄μ„œ μž…λ ₯ 받은 μˆ˜μ—΄μ˜ κ°’κΉŒμ§€ pushλ₯Ό 톡해 μŠ€νƒμ— μŒ“μ€ ν›„ μž…λ ₯ 받은 μˆ˜μ—΄μ˜ 값이 λ‚˜μ˜€λ©΄ pop을 톡해 μŠ€νƒμ—μ„œ κΊΌλ‚΄ 좜λ ₯ν•˜λ„λ‘ ν•˜λŠ” 원리이닀. 

 

μ˜ˆμ œμ—μ„œ 

8

4

3

6

8

7

5

2

1

μ΄λΌλŠ” 데이터λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€. 

 

첫번째 8은 좜λ ₯ν•˜κ³ μž ν•˜λŠ” μˆ˜μ—΄μ˜ 크기이고, κ·Έ λ‹€μŒ 쀄뢀터가 μˆ˜μ—΄μ„ μ˜λ―Έν•œλ‹€. 

문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” μŠ€νƒμ„ ν•˜λ‚˜ μƒμ„±ν•˜κ³ , λ‘λ²ˆμ§Έ λ¬Έμžμ—΄μΈ '4'κ°€ 될 λ•ŒκΉŒμ§€ μŠ€νƒμ— 1λΆ€ν„° μ‹œμž‘ν•˜λŠ” 숫자λ₯Ό μŒ“λŠ”λ‹€(push)

이 λ•Œ μŠ€νƒμ—λŠ” 1,2,3,4κ°€ μŒ“μ—¬μžˆλ‹€.

 

숫자λ₯Ό μŒ“λ‹€κ°€ μ›ν•˜λŠ” 값인 '4'κ°€ 되면, 이 '4'λŠ” μˆ˜μ—΄λ‘œ 좜λ ₯ν•˜κΈ° μœ„ν•΄ pop()을 μ§„ν–‰ν•œλ‹€. 

κ·Έ λ‹€μŒ 숫자인 '3'을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이미 μŠ€νƒμ— '3'이 μŒ“μ—¬μžˆκΈ° λ•Œλ¬Έμ— pop()만 진행해주면 λœλ‹€. 

이 λ•Œ μŠ€νƒμ—λŠ” 1,2κ°€ μŒ“μ—¬μžˆλ‹€.

 

κ·Έ λ‹€μŒ 숫자인 '6'을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” 5λΆ€ν„° λ‹€μ‹œ μŠ€νƒμ— μŒ“μ•„μ•Ό ν•œλ‹€.(push())

또 λ‹€μ‹œ 6κΉŒμ§€ μŠ€νƒμ— μŒ“μœΌλ©΄ 6을 pop()ν•œλ‹€. 

이 λ•Œ μŠ€νƒμ—λŠ” 1,2,5κ°€ μŒ“μ—¬μžˆλ‹€.

 

κ·Έ λ‹€μŒ 숫자인 '8'을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” 6λΆ€ν„° λ‹€μ‹œ μŠ€νƒμ— μŒ“λŠ”λ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ 8κΉŒμ§€ μŒ“μœΌλ©΄ 8을 pop()ν•œλ‹€. 

이 λ•Œ μŠ€νƒμ—λŠ” 1,2,5,7이 μŒ“μ—¬μžˆλ‹€. 

 

κ·Έ λ‹€μŒ 숫자인 '7', '5', '2', '1'을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œλŠ” μŠ€νƒμ—μ„œ pop()ν•˜μ—¬ κΊΌλ‚΄λ©΄ λœλ‹€.

 

μœ„μ˜ 풀이λ₯Ό κ·œμΉ™μœΌλ‘œ μ •λ¦¬ν•˜λ©΄

λ§Œμ•½ μžμ—°μˆ˜λ³΄λ‹€ μˆ˜μ—΄μ˜ μˆ«μžκ°€ ν¬κ±°λ‚˜ κ°™λ‹€λ©΄

1. μžμ—°μˆ˜μ™€ μˆ˜μ—΄μ˜ μˆ«μžκ°€ κ°™μ•„μ§ˆ λ•ŒκΉŒμ§€ μŠ€νƒμ— μžμ—°μˆ˜λ₯Ό μŒ“λŠ”λ‹€. 

2. μžμ—°μˆ˜μ™€ μˆ˜μ—΄μ˜ μˆ«μžκ°€ 같아지면 1번 popν•œλ‹€. 

 

λ§Œμ•½ μžμ—°μˆ˜λ³΄λ‹€ μˆ˜μ—΄μ˜ μˆ«μžκ°€ μž‘λ‹€λ©΄

1. popν•œλ‹€. 

2. 이 λ•Œ popν•˜μ—¬ κΊΌλ‚Έ μˆ«μžκ°€ μˆ˜μ—΄μ˜ μˆ«μžλ³΄λ‹€ 크닀면 ν•΄λ‹Ή μˆ˜μ—΄μ€ λ§Œλ“€ 수 μ—†λ‹€. 

 

βœ” JAVA μ½”λ“œ

이λ₯Ό java둜 ν’€λ©΄ μ•„λž˜μ™€ κ°™λ‹€. 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

public class P1874_μŠ€νƒμœΌλ‘œμ˜€λ¦„μ°¨μˆœμˆ˜μ—΄λ§Œλ“€κΈ° {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int countOfNumber = Integer.parseInt(br.readLine());
        int[] numberArr = new int[countOfNumber];

        //μˆ˜μ—΄ λ°°μ—΄λ‘œ 생성
        for(int i = 0 ; i < countOfNumber ; i++){
            numberArr[i] = Integer.parseInt(br.readLine());
        }

        //μŠ€νƒ : LIFO
        Stack<Integer> stack = new Stack<>();
        int number = 1; //1λΆ€ν„° μ‹œμž‘ν•˜λŠ” μžμ—°μˆ˜
        Boolean result = true; 
        StringBuilder answer = new StringBuilder();

        //μˆ˜μ—΄μ˜ 크기만큼 λ°˜λ³΅ν•œλ‹€.
        for(int i = 0 ; i < countOfNumber ; i++){
            int su = numberArr[i]; //μˆ˜μ—΄

            //μˆ˜μ—΄μ˜ μˆ˜κ°€ μžμ—°μˆ˜λ³΄λ‹€ ν¬κ±°λ‚˜ 같을 λ•Œμ—λŠ” μˆ˜μ—΄μ˜ μˆ˜μ™€ μžμ—°μˆ˜κ°€ κ°™μ•„μ§ˆ λ•ŒκΉŒμ§€ push ν›„ λ§ˆμ§€λ§‰ ν•œ λ²ˆμ€ pop ν•œλ‹€. => pop: μˆ˜μ—΄ 좜λ ₯
            if(su >= number){
                while(su >= number){
                    stack.push(number++);
                    answer.append("+\n");
                }
                stack.pop();
                answer.append("-\n");
            }else{ //μˆ˜μ—΄μ˜ μˆ˜κ°€ μžμ—°μˆ˜λ³΄λ‹€ μž‘μ„ λ•Œμ—λŠ” popν•œλ‹€. 단, κΊΌλ‚Έ μˆ˜κ°€ μˆ˜μ—΄μ˜ μˆ˜λ³΄λ‹€ 크닀면 주어진 λ°©μ‹λŒ€λ‘œ μˆ˜μ—΄μ„ λ§Œλ“€μ§€ λͺ»ν•œλ‹€.
                int n = stack.pop();

                if(n > su){
                    System.out.println("NO");
                    result = false;
                    break;
                }else{
                    answer.append("-\n");
                }
            }
        }
        if (result) {
            System.out.println(answer.toString());
        }

    }

}