WalkerJei's Lifelog

백준알고리즘 10733번 제로 C# 본문

소프트웨어 개발/코딩테스트(기성 문제)

백준알고리즘 10733번 제로 C#

WalkerJei 2025. 3. 28. 20:48

세부 정보

  • 사이트: 백준알고리즘
  • 번호: 10773
  • 문제명: 제로
  • 언어: C#
  • 분류: 구현, 자료 구조, 스택
  • 비고: 

 

문제

나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.

재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.

재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.

재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!

 

입력

첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000)

이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다.

정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할 수 있다.

 

출력

재민이가 최종적으로 적어 낸 수의 합을 출력한다. 최종적으로 적어낸 수의 합은 231-1보다 작거나 같은 정수이다.

 

풀이

stack.Pop()은 스택 내용물 중 가장 나중에 들어간 내용물을 빼는 것이다.

stack.Push()는 괄호 안의 수를 스택에 넣는다.

sr.Close()와 sw.Close()는 StreamReader와 StreamWriter를 사용하기에 넣어준 것으로 깜빡하고 안 쓰면 출력이 제대로 나오지 않게 되니 반드시 빼먹지 말고 코드에 넣어야 한다.

using System.Collections;

StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

Stack stack = new Stack();

// 입력할 정수의 개수
int k = Convert.ToInt32(sr.ReadLine());
// 입력할 정수를 저장할 배열
int[] number = new int[k];
// 정수의 합계
int sum = 0;

for (int i = 0; i < number.Length; i++)
    number[i] = Convert.ToInt32(sr.ReadLine());

for (int i = 0;i < number.Length; i++)
{
    // 입력한 정수가 0이면 스택에서 뺀다.
    if (number[i] == 0)
        stack.Pop();
    // 0이 아니면 해당 수를 스택에 넣는다
    else
        stack.Push(number[i]);
}

// 스택 내의 수를 모두 더한다
foreach (int i in stack)
    sum += i;

sw.WriteLine(sum);

// 해당 부분을 작성하지 않으면 출력이 그냥 공백으로 나온다
sr.Close();
sw.Close();

 

후기

오늘 새로 배운 것은 foreach의 사용 방법, StreamReader와 StreamWriter 사용을 마치고 Close()를 사용해야 하는 이유였다. 복습한 내용으로는 Stack에서 Push()와 Pop()을 사용하는 방법이 있었다. 잠자고 있던 자료구조 지식이 깨어나는 기분이 든다.