코테준비

[2025.4.30] 백준 10828: 스택

도도돋치 2025. 5. 1. 21:06
Contents 접기
728x90

using System.Linq.Expressions;

namespace CodingTest;

class Program
{
    static void Main(string[] args)
    {
        List<int> stack = new List<int>();
        int top = -1;

        int number = int.Parse(Console.ReadLine());

        for (int i = 0; i < number; i++)
        {
            string inputString = Console.ReadLine();
            string[] command = inputString.Split(" ");
            if (command[0] == "push")
            {
                stack.Add(int.Parse(command[1]));
                top++;
            }
            else if (command[0] == "pop")
            {
                if (top == -1)
                {
                    Console.WriteLine(-1);
                }
                else
                {
                    Console.WriteLine($"{stack[top]}");
                    stack.RemoveAt(top);
                    top--;
                }

            }
            else if (command[0] == "size")
            {
                Console.WriteLine($"{top + 1}");
            }
            else if (command[0] == "empty")
            {
                if (top == -1)
                {
                    Console.WriteLine(1);
                }
                else
                {
                    Console.WriteLine(0);
                }
            }
            else if (command[0] == "top")
            {
                if (top == -1)
                {
                    Console.WriteLine(-1);
                }
                else
                {
                    Console.WriteLine($"{stack[top]}");
                }
            }


        }

    }
}

1. 공백 기준: https://manniz.tistory.com/entry/Csplit-함수에-String-을-넣어-문자열을-분리시키는-방법

2. 삼항연산자:

C#에서는 삼항 연산자가 값을 반환하는 표현식이지, 명령문을 직접 실행하진 않는다.


따라서 if-else처럼 두 개의 Console.WriteLine()을 삼항 연산자 안에 넣는 건 문법적으로 맞지 않는다.

 

잘못된 예 (내가 적었던 것)

top == -1 ? Console.WriteLine(1) : Console.WriteLine(0); // ❌

 

올바른 예

삼항 연산자의 반환값을 변수에 할당하거나, Console.WriteLine() 안에서 사용해야 한다.

Console.WriteLine(top == -1 ? 1 : 0); // ✅

혹은 함수가 아닌, 값으로 동작하는 부분에만 삼항 연산자를 쓰는 것이 일반적이다.

 

간단히 말하면:
? :
 "값을 고르는 표현식"이지, "코드를 실행하는 if-else " 아니기 때문이다.

 

3. StringBuilder -> 메모장에 다적어놓고 한꺼번에 결과 출력 

Append하면 그냥 바로 다음에 추가, AppendLine하면 엔터쳐진채로 추가

 

4. Stack을 구현하는 문제가 아니면 stack내장함수를 사용하면됨

내장함수는 시간복잡도 알고 써야됨 BigO표기법

 

굳이 int로안바꾸고 string으로 구현해도됐었다

 


String과 StringBuilder (왜 string 값에 “~~~“ + “xxx” 를 자주 사용하면 안되는가?)

  • String은 불변객체라서 무분별하게 사용하면 메모리에 안 좋아요!
  • String은 ref 타입으로 문자열 조합할 때마다 새로운 클래스가 생성된다.
    • 문자열 조합할 때마다 부하 발생

String 객체는 변경할 수 없다. System.String 클래스에서 메서드 중 하나를 사용할 때마다 메모리에 새 문자열 개체가 생성되므로, 새 객체에 대한 공간을 새로 할당 되어진다. 그러므로 문자열을 반복적으로 수정해야 하는 경우 메모리 낭비가 발생되어 비효율적인 코드가 생성된다.

 

StringBuilder 사용 시 각 각의 Console로 출력하지 말고 마지막만 출력하기. ( 훨씬 빠름 )

 

  • 우리의 문제

? 왜 어떤 사람은 시간차이가 나고 어떤사람은 다른게 없는데 시간초과가 안날까? → 가챠X

→ 메모리를 줄이는 효과?

(가설)

→ Count 쓰는 차이

근데 사실 StringBuilder쓰냐안쓰냐 차이인듯

728x90

'코테준비' 카테고리의 다른 글

[2025.5.2] 백준 10845: 큐  (0) 2025.05.09
[2025.5.7] 백준 1874번: 스택 수열  (0) 2025.05.07
[2025.5.2] 백준 9012: 괄호  (1) 2025.05.02
[2025.5.1] 백준 9093: 단어뒤집기  (0) 2025.05.02
DFS 공부  (0) 2025.04.30