CodingTest/Java

BOJ_1874 : μŠ€νƒ μˆ˜μ—΄

Soom_1n 2022. 11. 7. 16:50

πŸ‘‰ 문제링크

 

1874번: μŠ€νƒ μˆ˜μ—΄

1λΆ€ν„° nκΉŒμ§€μ— μˆ˜μ— λŒ€ν•΄ μ°¨λ‘€λ‘œ [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 μˆ˜ν–‰ν•˜λ©΄ μˆ˜μ—΄ [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 μžˆλ‹€.

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • μŠ€νƒμ˜ pop, push μ—°μ‚°κ³Ό ν›„μž… μ„ μΆœ κ°œλ…μ„ μ •ν™•ν•˜κ²Œ μ•Œκ³  μžˆλŠ”μ§€ λ¬»λŠ” λ¬Έμ œμ΄λ‹€.
  • μŠ€νƒμ— λ„£λŠ” μžμ—°μˆ˜ 값은 μ˜€λ¦„ 차순 정렬이닀.
    • ν˜„μž¬ μˆ˜μ—΄ κ°’ >= μžμ—°μˆ˜
      • μžμ—°μˆ˜κ°€ ν˜„μž¬ μˆ˜μ—΄ κ°’κ³Ό κ°™μ•„μ§ˆ λ•Œ κΉŒμ§€ μžμ—°μˆ˜λ₯Ό 1μ¦κ°€μ‹œν‚€λ©° μŠ€νƒμ— pushν•œλ‹€.
      • λ§ˆμ§€λ§‰μ€ 좜λ ₯ν•˜κΈ° μœ„ν•΄ 1번 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));
        StringBuffer sb = new StringBuffer();

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

        Stack<Integer> stack = new Stack<>();
        int num = 1;
        boolean result = true;
        for (int i = 0; i < n; i++){
            int su = Integer.parseInt(br.readLine());
            if (su >= num){
                while (su >= num){
                    stack.push(num++);
                    sb.append("+\n");
                }
                stack.pop();
                sb.append("-\n");
            }
            else {
                int pop = stack.pop();

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

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • Stack 클래슀λ₯Ό μ΄μš©ν•΄μ„œ μŠ€νƒμ„ μ‚¬μš©ν•œλ‹€.
  • μž…λ ₯ 받은 μˆ˜μ—΄ 값을 μ΄μš©ν•΄ μŠ€νƒ ν‘œν˜„μ΄ λ˜λŠ”μ§€ κ³„μ‚°ν•œλ‹€.

πŸ”Έ end πŸ”Έ

  • 이전에 python으둜 ν’€μ—ˆλ˜ 문제인데, λ‹€μ‹œ java둜 ν’€μ–΄λ³΄λ‹ˆ μƒˆλ‘œμ› λ‹€.
  • java의 자료ꡬ쑰 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ μ΅μˆ™μ§€ μ•Šμ€λ° 쒋은 μ—°μŠ΅μ΄ λ˜μ—ˆλ‹€.
  • ν•œ λ²ˆμ— 좜λ ₯ν•˜κΈ° μœ„ν•΄ StringBuffer도 μ‚¬μš©ν–ˆλŠ”λ°, μ΄μ „μ—λŠ” StringBuilderλ₯Ό μ‚¬μš©ν•΄μ„œ κ·Έ 차이점이 무엇인가 ν¬μŠ€νŒ…μ„ μ°Ύμ•„λ³΄μ•˜λ‹€.
    • Stringκ³Ό StringBuffer/StringBuilder의 차이점은 λ©”λͺ¨λ¦¬κ°€ λΆˆλ³€μ„±μΈμ§€ 가변성인지이닀.
      • String은 λ³€ν•˜μ§€ μ•ŠλŠ” λ¬Έμžμ—΄μ„ 자주 μ‚¬μš©ν•˜λŠ” 경우 μ‚¬μš©ν•œλ‹€.
    • StringBuffer/StringBuilderλŠ” λ¬Έμžμ—΄μ΄ κΈΈμ–΄μ§€λ©΄, κ·Έ 만큼 λ©”λͺ¨λ¦¬λ₯Ό λŠ˜λ €μ„œ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.
    • StringBuffer/StringBuilder의 차이점은 동기화(Synchronization)이닀.
      • StringBuilderλŠ” 동기화λ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ μ†λ„λŠ” StringBuffer보닀 μ„±λŠ₯이 μ’‹λ‹€.
        λ”°λΌμ„œ 단일 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄μ˜ μˆ˜μ •μ΄ λΉˆλ²ˆν•œ 경우 μ‚¬μš©ν•œλ‹€.
      • StringBufferλŠ” 동기화λ₯Ό μ§€μ›ν•˜μ—¬ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ λ™μž‘ν•œλ‹€.
        λ”°λΌμ„œ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ¬Έμžμ—΄μ˜ μˆ˜μ •μ΄ λΉˆλ²ˆν•œ 경우 μ‚¬μš©ν•œλ‹€.
    • 이 문제 ν’€μ΄μ—μ„œλŠ” StringBuilderλ₯Ό μ‚¬μš©ν•˜λŠ”κ²Œ 더 μ„±λŠ₯이 μ’‹μ•˜μ„ 것이닀.

728x90