[BOJ] 백준 10773번: 제로 (C++)

2025. 4. 6. 18:41·프로그래밍/Algorithm

 

- 문제 출처 : https://www.acmicpc.net/problem/10773


1. 생각

3번째로 가져온 문제도 스택 문제를 가져와봤다.

최근에 코딩 테스트 문제를 풀기 위해 java를 처음 사용해봤는데,

확실히 언어에 대한 이해도가 낮아 문제를 푸는데도 너무 오래 걸리고

여전히 C 스타일로 많이 짜게 되는 경향이 있어 C++을 사용해서 문제를 풀어야하나 고민이 있었다.

 

고민의 결론은, 기존에 C를 많이 사용했던터라, C++ 로 먼저 객체지향 언어를 익숙하게 사용해본 뒤,

Java로 넘어가서 조금 더 쉽게 언어를 익히는 게 좋을 것 같다는 결론이 나왔다.

따라서 이번 문제부터는 C++로 푸는 것으로 결정!

 

우선 이번 문제는 '재민'이라는 인물이 장부에 수를 적는 역할,

'재현'이라는 인물이 장부에 적힌 마지막 수를 지우는 역할로 등장한다.

 

따라서 스택이라는 자료구조를 사용한다는 것을 알아차리게 된다면,

재민은 push / 재현은 pop의 역할을 한다는 것을 짐작할 수 있다.

일반 숫자가 오면 해당 숫자를 push, 0이 오면 가장 최신의 숫자를 pop해서 비우면 될 듯 하다.

 

2. 난관 & 해결 방법

#include <iostream>
#include <stack>

 

C++ 에서는 stack 자료구조를 템플릿 라이브러리를 통해 사용할 수 있다.

그를 위해 #include <stack> 을 작성해준다.

 

std::stack<int> st;

 

stack을 선언하는 방법은 stack 뒤에 '<자료형> + 이름'을 작성해주면 해당 자료형의 스택을 만들 수 있다.

템플릿 라이브러리를 사용하니 상당히 간단하게 만들 수 있다.

물론 이전 문제들처럼 직접 배열로 만들어도 되지만, 이번엔 라이브러리를 활용해보았다.

 

std::cin >> n;
for (int i = 0; i < n; i ++){
    std::cin >> cost;
    if (cost == 0)
        st.pop();
    else
        st.push(cost);
}
while (st.empty() == 0){
    sum += st.top();
    st.pop();
}
std::cout << sum;

 

0이 입력되었을 때를 제외하고는 모두 push해서 담고, 0일시에는 pop으로 빼버린다.

그 이후 만들어진 스택을 empty()를 이용해 텅 빌때까지 top의 값을 sum에 쌓고, pop하는 과정을 거치면

이번 문제를 간단하게 해결할 수 있다.

 

자, C++에서는 위와 같이 std::cin 과 std::cout 으로 입출력을 사용한다.

하지만 이 방식은 C에서의 printf, scanf 보다 느리다고 하는데, 이를 극복하기 위해서 방법이 하나 있다.

 

std::ios::sync_with_stdio(false);

 

이 줄을 하나 추가해준다면,

 

(위 : 한줄을 추가한 코드 / 아래 : 기존 코드)

 

2배 이상 시간이 빨라진 것을 확인할 수 있다.

이 코드는 동기화를 비활성화하여 속도를 증가시키는 것인데,

싱글 스레드 상황에서만 사용할 수 있어 일종의 편법처럼 사용한다고 한다.

 

이번 문제는 반복이 적어서 영향은 없겠지만 좀 더 큰 문제들에서는 필요할 수도 있으니 알아두자.

 

3. 코드 및 결론

[ 전체 코드 ]

#include <iostream>
#include <stack>

int main(){
    std::stack<int> st;
    int n, cost, sum = 0;
    std::ios::sync_with_stdio(false);
    std::cin >> n;
    for (int i = 0; i < n; i ++){
        std::cin >> cost;
        if (cost == 0)
            st.pop();
        else
            st.push(cost);
    }
    while (st.empty() == 0){
        sum += st.top();
        st.pop();
    }
    std::cout << sum;
    return (0);
}

 

[ 결론 ]

 

이번에는 C++과 C++ STL(Standard Template Library)의 stack 을 활용하여 문제를 풀어보았다.

문제 자체는 너무 쉬웠지만 또 새롭게 알아가는 정보들이 많아 유익했다.

확실히 C를 자주 써서 그런지 더 익숙하고 편한 감이 없지 않아 있다.

 

추후 C++ 문제 푸는게 많이 익숙해진 뒤에는 Java로도 문제를 풀어보도록 하겠다.

저작자표시 (새창열림)

'프로그래밍 > Algorithm' 카테고리의 다른 글

[BOJ] 백준 2164번: 카드 2 (C++)  (0) 2025.04.07
[BOJ] 백준 18258번: 큐 2 (C++)  (0) 2025.04.07
[BOJ] 백준 4949번: 균형잡힌 세상 (C++)  (0) 2025.04.06
[BOJ] 백준 10828번: 스택 (JAVA)  (0) 2025.04.05
[BOJ] 백준 9012번: 괄호 (JAVA)  (0) 2025.04.04
'프로그래밍/Algorithm' 카테고리의 다른 글
  • [BOJ] 백준 18258번: 큐 2 (C++)
  • [BOJ] 백준 4949번: 균형잡힌 세상 (C++)
  • [BOJ] 백준 10828번: 스택 (JAVA)
  • [BOJ] 백준 9012번: 괄호 (JAVA)
doyoucode
doyoucode
  • doyoucode
    Do You Coding?
    doyoucode
  • 전체
    오늘
    어제
  • Programming Collection
    • 전체글 (72)
      • 프로그래밍 (68)
        • CS (7)
        • Algorithm (15)
        • C (42)
        • C++ (2)
        • Java (0)
        • Linux (2)
      • ETC (4)
        • 정보처리기사 (1)
        • TOEIC Speaking (0)
        • OPIc (0)
        • 영어 (2)
        • 특강, 컨퍼런스 (1)
        • 후기 (0)
  • hELLO· Designed By정상우.v4.10.3
doyoucode
[BOJ] 백준 10773번: 제로 (C++)
상단으로

티스토리툴바