알고리즘

백준 17265번 나의 인생에는 수학과 함께 C++

영춘권의달인 2022. 12. 28. 12:36

https://www.acmicpc.net/problem/17265

 

17265번: 나의 인생에는 수학과 함께

세현이의 인생의 목표는 1분 1초 모든 순간 수학과 함께 살아가는 것이다. 그렇기 때문에 매일 수학을 생각하면서 살아가고 있다. 세현이는 밥을 먹을 때도 쌀알의 수를 계산하여 칼로리를 바로

www.acmicpc.net

 

bfs로 연산자일때와 숫자일때를 구분해서 풀었다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

struct Info {
    int row;
    int col;
    int val;
    bool isOp;
    char op;
};

int n;
int dRow[2] = { 0,1 };
int dCol[2] = { 1,0 };
vector<vector<char>> board;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n;
    board = vector<vector<char>>(n, vector<char>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> board[i][j];
        }
    }
    int maxVal = -INT_MAX;
    int minVal = INT_MAX;
    queue<Info> q;
    q.push({ 0,0,0,false,'+' });
    while (!q.empty()) {
        auto curr = q.front();
        q.pop();
        int nextVal = curr.val;
        bool nextIsOp = curr.isOp;
        char nextOp = curr.op;
        if (curr.isOp) {
            nextOp = board[curr.row][curr.col];
            nextIsOp = false;
        }
        else {
            switch (curr.op) {
            case '+':
                nextVal += board[curr.row][curr.col] - '0';
                break;
            case '-':
                nextVal -= board[curr.row][curr.col] - '0';
                break;
            case '*':
                nextVal *= board[curr.row][curr.col] - '0';
                break;
            default:
                break;
            }
            nextIsOp = true;
        }
        if (curr.row == n - 1 && curr.col == n - 1) {
            maxVal = max(maxVal, nextVal);
            minVal = min(minVal, nextVal);
        }
        for (int i = 0; i < 2; i++) {
            int nextRow = curr.row + dRow[i];
            int nextCol = curr.col + dCol[i];
            if (nextRow >= n || nextCol >= n) continue;
            q.push({ nextRow,nextCol,nextVal,nextIsOp,nextOp });
        }
    }
    cout << maxVal << " " << minVal;
}