[프로그래머스] 사칙연산(C++)

2025. 6. 30. 16:59·개발/알고리즘
728x90

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/1843

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

코드 구현

#include <iostream>
#include <vector>
#include <string>
#include <limits>

int max_val = std::numeric_limits<int>::max();
int min_val = std::numeric_limits<int>::min();

using namespace std;

int solution(vector<string> arr)
{
    int n = (arr.size() + 1) / 2; // 숫자 개수

    vector<int> nums;
    vector<char> ops;

    for (int i = 0; i < arr.size(); i++)
    {
        if (i % 2 == 0) nums.push_back(stoi(arr[i]));
        else ops.push_back(arr[i][0]);
    }

    // dp 테이블
    vector<vector<int>> dp_max(n, vector<int>(n, min_val));
    vector<vector<int>> dp_min(n, vector<int>(n, max_val));

    // 한 숫자만 있을 때는 그대로
    for (int i = 0; i < n; ++i) 
    {
        dp_max[i][i] = nums[i];
        dp_min[i][i] = nums[i];
    }

    // 길이 2 이상부터 계산
    for (int len = 2; len <= n; len++)
    {
        for (int i = 0; i <= n - len; i++)
        {
            int j = i + len - 1;

            for (int k = i; k < j; k++)
            {
                char op = ops[k];
                int a = dp_max[i][k];
                int b = dp_min[i][k];
                int c = dp_max[k + 1][j];
                int d = dp_min[k + 1][j];

                // 덧셈은 큰 수 끼리, 뺄셈은 큰 수 - 작은 수 => 최댓값
                if (op == '+') 
                {
                    dp_max[i][j] = max(dp_max[i][j], a + c);
                    dp_min[i][j] = min(dp_min[i][j], b + d);
                }
                else 
                {
                    dp_max[i][j] = max(dp_max[i][j], a - d);
                    dp_min[i][j] = min(dp_min[i][j], b - c);
                }
            }
        }
    }

    return dp_max[0][n - 1];
}

 

 

해결 방법


  • 숫자와 연산자를 분리해서 저장
  • 범위를 늘려가며 DP 계산

'개발 > 알고리즘' 카테고리의 다른 글

[백준] 1202번: 보석 도둑(C++)  (2) 2025.07.04
[프로그래머스] 거스름돈(C++)  (1) 2025.07.03
[백준] 2252번: 줄 세우기(C++)  (1) 2025.06.24
[백준] 1806번: 부분합(C++)  (1) 2025.06.13
[프로그래머스] 단속카메라(C++)  (1) 2025.06.12
'개발/알고리즘' 카테고리의 다른 글
  • [백준] 1202번: 보석 도둑(C++)
  • [프로그래머스] 거스름돈(C++)
  • [백준] 2252번: 줄 세우기(C++)
  • [백준] 1806번: 부분합(C++)
Majangnan
Majangnan
  • Majangnan
    개발 모코코
    Majangnan
  • 전체
    오늘
    어제
    • 분류 전체보기 (81)
      • 개발 (80)
        • C# (10)
        • SQL (3)
        • Unity (9)
        • Unreal (10)
        • C++ (3)
        • Server (1)
        • DX11 (8)
        • 알고리즘 (35)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 깃허브
  • 링크

    • 백준 허브
  • 공지사항

  • 인기 글

  • 태그

    dx3d
    프로그래머스
    C#
    sql
    코딩테스트
    MAC
    Mecanim
    UnReal
    알고리즘
    블루프린트
    Unity
    슈팅게임
    3dlight
    언리얼
    DX11
    blueprint
    백준
    상속
    DirectX11
    c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Majangnan
[프로그래머스] 사칙연산(C++)
상단으로

티스토리툴바