이 영역을 누르면 첫 페이지로 이동
hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

페이지 맨 위로 올라가기

hoonDEV

BOJ 1541 - 잃어버린 괄호 문제풀이

  • 2020.04.07 01:38
  • 알고리즘/문제풀이

문제를 읽고 이해하기

세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 50인 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다.

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.

괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오.

입력

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다.

출력

첫째 줄에 정답을 출력한다.

재정의와 추상화

주어진 식에 괄호를 적절히 쳐서 최솟값을 만들기 위해서는 빼는 수가 최대가 되게 만들면 된다.

따라서, -가 나오기 전까지 모두 더했다가, -가 나오면 다음 -가 나오기 전까지 - 이후의 수의 합을 구한다. 그리고 그 수를 총합에서 뺀다. 다음 -가 나오면 이 과정을 반복하고, 만약 다음 -가 나오지 않으면, 수식의 끝까지 간 경우이므로 함수를 종료한다.

필자는 이 기능을 구현하기 전에, string으로 읽어들인 문자열을 Tokenize 하는 작업을 거쳤다. int형 vector에 숫자는 숫자로, 부호는 -면 -1, +면 -2로 저장해놓았다.

그리고, 토큰화된 정수와 부호(-1, -2로 표현됨)를 읽고 최솟값을 만들어내는 함수를 만들었다.

코드 작성

#include <iostream>
#include <vector>
using namespace std;

vector<int> tokens;

void tokenize(string target) {
    auto it = target.begin();
    while (it != target.end()) {
        if (*it == '-') {
            tokens.push_back(-1);
            it++;
        } else if (*it == '+') {
            tokens.push_back(-2);
            it++;
        } else {
            auto begin = it;
            for (; *it >= '0' && *it <= '9'; it++) {}
            tokens.push_back(stoi(string(begin, it)));
        }
    }
}

int minimized_value() {
    int total = *tokens.begin();

    auto it = tokens.begin() + 1;
    while (it != tokens.end()) {
        if (*it == -1) {
            it++;
            int temp = 0;
            for (;*it != -1 && it != tokens.end(); it++) {
                if (*it != -2) {
                    temp += *it;
                }
            }
            total -= temp;
        } else if (*it == -2) {
            total += *(++it);
            it++;
        } else {
            total += *it;
            it++;
        }
    }
    return total;
}

int main() {
    string input;
    cin >> input;
    tokenize(input);
    cout << minimized_value();
    return 0;
}

'알고리즘 > 문제풀이' 카테고리의 다른 글

BOJ 1654 - 랜선 자르기 문제풀이  (0) 2020.04.07
BOJ 1436 - 영화감독 숌  (0) 2020.04.07
BOJ 11399 - ATM 문제풀이  (0) 2020.04.05
BOJ 7569 - 토마토 문제풀이  (0) 2020.04.05
BOJ 7576 - 토마토 문제풀이  (0) 2020.04.05

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • BOJ 1654 - 랜선 자르기 문제풀이

    BOJ 1654 - 랜선 자르기 문제풀이

    2020.04.07
  • BOJ 1436 - 영화감독 숌

    BOJ 1436 - 영화감독 숌

    2020.04.07
  • BOJ 11399 - ATM 문제풀이

    BOJ 11399 - ATM 문제풀이

    2020.04.05
  • BOJ 7569 - 토마토 문제풀이

    BOJ 7569 - 토마토 문제풀이

    2020.04.05
다른 글 더 둘러보기

정보

hoonDEV 블로그의 첫 페이지로 이동

hoonDEV

  • hoonDEV의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그

카테고리

  • 분류 전체보기 (91)
    • 일상 (13)
      • 후기 (1)
      • 계획 (11)
    • 공지사항 (1)
    • 알고리즘 (54)
      • 문제풀이 (53)
      • 이론 (1)
    • 공부 (19)
      • React (0)
      • Angular (5)
      • Java (3)
      • C, C++ (3)
      • JavaScript (6)
      • WEB (2)
    • 디자인 (1)
      • UI, UX (1)
    • 개발 (0)
      • boom (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • javascript
  • 이분탐색
  • 그리디
  • 백준
  • 문제풀이
  • 알고리즘
  • dp
  • es6

나의 외부 링크

정보

훈개발자의 hoonDEV

hoonDEV

훈개발자

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © 훈개발자. Designed by Fraccino.

티스토리툴바