[PS/BOJ] 1541번. 잃어버린 괄호 - C++[cpp]

2025. 2. 16. 05:59·PS/BOJ

문제

 

이 문제는 문자열 처리와 식의 값을 최소로 만드는 방법을 요구하고 있다.

아이디어

나올 수 있는 경우의 수를 생각해보자.

  • 1 + 2 + 3 + 4 -> 그대로 더한다.
  • 1 - 2 - 3 - 4 -> 그대로 뺀다.
  • 1 - 2 + 3 - 4
    • -> (2 + 3)을 묶어버린다 
    • 1 - (2 + 3) - 4 = 1 - 2 - 3 - 4
    • 즉, - 가 한 번 나온 뒤로, 그 뒤에 오는 모든 수는 다 빼주면 된다.

코드(중요!)

아이디어는 대부분 다 떠올렸겠지만, 문자열 처리를 어떻게 할 지 고민인 분들이 많을 것이다.

이 부분이 이 글을 쓰는 이유이기도 한데,

구글링해서 나오는 코드 대부분은 아래와 같이 문자를 하나씩 입력받아 숫자, 연산자를 구분하고 있다.

#include <iostream>
#include <string>
using namespace std;
 
int main() {
    string input;
    cin >> input;
 
    int result = 0;
    string num;
    bool isMinus = false;
 
    for (int i = 0; i <= input.size(); i++) {
        
        if (input[i] == '-' || input[i] == '+' || i==input.size()) {
            if (isMinus) {
                result -= stoi(num);
                num = "";
            }
            else {
                result += stoi(num);
                num = "";
            }
        }
        else {
            num += input[i];
        }
 
        if (input[i] == '-') {
            isMinus = true;
        }    
    }
    
    cout << result;
}

 

사실 PS 환경에서는 위와 같이 구현할 필요가 없다. 이미 입력의 종료가 정해져있기 때문에 cin >> 의 반환값으로 입력의 종료를 알 수 있다. 아래 코드를 확인해보자.

#include <bits/stdc++.h>
using namespace std;

int main(void) {
    cin.tie(0)->sync_with_stdio(false);
    int x; char c;
    
    // 첫 번째 숫자 입력 받기
    cin >> x;
    int sum = x;
    
    // 처음 minus가 등장한 이후로 minus는 true가 된다.
    bool minus = false;
    while (cin >> c) { // 연산자
        cin >> x; // 정수
        if (c == '-') minus = true; // minus 최초 등장
        if (minus) sum -= x; // minus가 등장했었다면 무조건 뺀다.
        else sum += x; // 등장하지 않았다면 더한다.
    }
    cout << sum;
}

 

문제에서 숫자가 먼저 등장한다고 조건을 주었다. 첫 번째 숫자가 등장하고, {연산자, 숫자} 패턴이 반복된다. 즉, 첫 번째 숫자를 먼저 읽고, 나머지 세트를 계속해서 받으면 된다.

 

cin의 대상이 되는 타입이 정수면, cin은 정확히 정수까지만 읽어준다. 그래서 cin >> x를 하면

55-50+40

 

에서 55까지만 읽어서 저장해준다.

 

이제 {연산자, 숫자} 세트를 읽어줄텐데 이 역시 마찬가지로 cin의 대상이 char이면 문자 부분만 읽어준다. 

그래서 cin >> c 를 하면 c가 char라 '-'만 읽고, 그 다음에 cin >> x를 하면 x가 int라 50을 읽는다.

 

이 원리를 알면, 코드를 매우 짧게 작성할 수 있다.

 

 

 

'PS > BOJ' 카테고리의 다른 글

[PS/BOJ] 20166번. 문자열 지옥에 빠진 호석 - C++[cpp]  (0) 2024.10.10
[BOJ/백준] 1086번. 박성원 - C++[cpp]  (0) 2024.09.07
[BOJ/백준] 11724번. 연결 요소의 개수 - C++[cpp]  (0) 2024.07.13
[BOJ/백준] 11286번. 절댓값 힙 - C++[cpp]  (0) 2024.06.24
[BOJ/백준] 25501번. 재귀의 귀재 - C++[cpp]  (0) 2024.04.29
'PS/BOJ' 카테고리의 다른 글
  • [PS/BOJ] 20166번. 문자열 지옥에 빠진 호석 - C++[cpp]
  • [BOJ/백준] 1086번. 박성원 - C++[cpp]
  • [BOJ/백준] 11724번. 연결 요소의 개수 - C++[cpp]
  • [BOJ/백준] 11286번. 절댓값 힙 - C++[cpp]
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Spring
        • MVC
        • DB
        • 핵심 원리
        • JPA
      • WEB
        • HTML
        • CSS
        • HTTP
        • Application
      • Computer Science
        • Network
        • Database
        • OS
        • 시스템 프로그래밍
        • 컴퓨터구조
      • Algorithm
        • Divide&Conquer
        • Sort
        • Greedy
        • DP
        • Backtracking
        • NP-Complete
        • Graph
      • Data Structure
        • 자료구조
        • C++ STL
        • Java Collection
      • 소프트웨어 공학
        • 시험 공부 정리
        • Theorem
      • Programming Language
        • Python
        • Java
        • C
        • C++
        • Rust
        • Theory
      • Unix_Linux
        • Common
      • React
      • PS
        • BOJ
        • Tip
        • 프로그래머스
        • CodeForce
      • Book Review
        • Clean Code
      • Math
        • Linear Algebra
      • AI
        • DL
        • ML
        • DA
        • Concepts
      • 우아한테크코스
        • 프리코스
      • Project Review
      • LegacyPosts
      • Android
      • Apple
        • Mac
        • IPhone
        • IPad
      • 모니터
      • Diary
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lumana
[PS/BOJ] 1541번. 잃어버린 괄호 - C++[cpp]
상단으로

티스토리툴바