본문 바로가기

Algorithm/Implementation

(C++, Python) - 백준(BOJ) 16503 : 괄호 없는 사칙연산

반응형

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

 

16503번: 괄호 없는 사칙연산

첫 번째 줄에는 "K1 O1 K2 O2 K3" 형태로 식이 주어진다. 정수 Ki (1 ≤ Ki ≤ 1,000)는 피연산자를, 문자열 Oi는 곱셈(*), 나눗셈(/), 덧셈(+), 뺄셈(-) 중 한 가지 연산자를 의미한다. 나눗셈 연산은 정수 나

www.acmicpc.net

구현 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

1. 한 줄 수식 expr를 선언 후 입력받습니다.2. 이 후 ' '를 구분자로 문자열을 split해 list에 저장해줍니다.

📔 풀이과정

1, 3번째에 연산자가 고정되어 있으므로 맞춰서 사칙연산을 해줍니다.

우선순위는 두 가지 뿐입니다.

(a x b) + c 또는 a x (b + c)이므로 각각 res1, res2를 선언해 계산결과를 저장해줍니다.

📔 정답출력

res1, res2 중 최소 최대를 형식에 맞게 출력해줍니다.


📕 Code

C++

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

string s;
vector <string> expr, op;
int res1, res2;

vector <string> split(string input, char delimiter){
    vector <string> result;
    stringstream ss(input);
    string tmp;

    while(getline(ss,tmp,delimiter)) result.push_back(tmp);
    return result;
}

int getRes(string sa, string op, string sb){
  int a = stoi(sa), b = stoi(sb);
  if(op == "+") return a + b;
  if(op == "-") return a - b;
  if(op == "*") return a * b;
  return a / b;
}

int main(){
  getline(cin, s);
  expr = split(s, ' ');

  res1 = getRes(expr[0], expr[1], expr[2]);
  res1 = getRes(to_string(res1), expr[3], expr[4]);

  res2 = getRes(expr[2], expr[3], expr[4]);
  res2 = getRes(expr[0], expr[1], to_string(res2));

  cout << min(res1, res2) << '\n' << max(res1, res2);
}

Python

import sys
input = sys.stdin.readline

def getRes(sa, op, sb):
  a = int(sa)
  b = int(sb)
  if(op == '+'): return a + b
  if(op == '-'): return a - b
  if(op == '*'): return a * b
  return -1*(abs(a)//abs(b)) if a*b < 0 else a//b

expr = input().split()

res1 = getRes(expr[0], expr[1], expr[2]);
res1 = getRes(str(res1), expr[3], expr[4]);

res2 = getRes(expr[2], expr[3], expr[4]);
res2 = getRes(expr[0], expr[1], str(res2));

print(min(res1, res2))
print(max(res1, res2))

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.