Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- TDD
- 테스트주도개발
- 구슬탈출
- c++
- 데이터 링크 계층
- LOLIN D32
- stl
- 백준
- 13459
- Vite 사용 이유
- WebRTC란
- mediastream
- 자료구조
- 풀이
- 백준 2133
- TDD란?
- 적두트리
- 1796
- 9996
- 메모리계층
- RBT
- 3XN 타일링
- OpenVidu
- tfjs
- 구현
- 2623
- dp
- 페이지교체알고리즘
- ESP32
- REACT
Archives
- Today
- Total
그냥 블로그
[C++/백준] 16637 괄호 추가하기 본문
반응형
16637번: 괄호 추가하기
첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가
www.acmicpc.net
[문제 요악]
1. 0보다 크고 9보다 작은 수와 수식( + - * )이 있다. ( 길이 <= 19 )
- 수식의 우선순위는 동일하다.
2. 중복 괄호를 칠 수 없고, 괄호 안에는 연산자가 하나만 들어가야 한다.
3. 괄호를 적절하게 쳐서 최대값이 되는 값을 찾아라.
[아이디어 구현 과정]
일단 문제를 읽고 정리하면서 풀이과정을 두 가지가 떠올랐다.
1. 완전 탐색
2. 트리 + 메모이제이션 (혹시..)
그럼 완전 탐색으로 생각해 봤을 때,
첫 번쨰로 시간 복잡도를 봤다. -> 시간 제한 0.5초 -> 5000만 정도
보면 수식의 최대 길이가 19이고, 그 중 숫자만 뽑아낸다고 했을 떄 최대 10이다.
경우를 따져보면, 내 바로 뒤에 숫자를 그 다음 숫자와 묶을 것이냐?로 분기가 나뉘어 진다.
N 번쨰 숫자에 있을 때, N+1 번째 숫자를 그대로 연산할거냐 (N+1과 N+2를 연산) 하고 더할거냐
이런식인데 이렇게 계산하면 2^10 정도 겠구만~ 그럼 천번 정도의 경우가 나오는데,
이정도는 완전 탐색으로 가능하겠다고 생각했다.
[코드]
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int N, max_V=-2e9;
vector<char> num; // 숫자 넣음
vector<char> op; // OPERATOR 넣음
int calculator(int n1, int n2, char _op) {
if (_op == '+')
return n1 + n2;
if (_op == '-')
return n1 - n2;
if (_op == '*')
return n1 * n2;
}
/*
* idx1 : 이번에 더할 숫자
* idx2 : 이번에 사용할 연산자
* result : 이 전까지 더한 결과
*/
void find_max(int idx1, int idx2, int result) {
// 기저 조건 : 숫자가 더 이상 없을 때
if (idx1 >= num.size()) {
max_V = max(max_V, result);
return;
}
int f; // 임시로 값을 담음
f = calculator(result, num[idx1], op[idx2]);
// 괄호 없이 더한 경우
find_max(idx1 + 1, idx2 + 1, f);
// 괄호를 사용하기 전에, 마지막 숫자면 ㄴㄴ
if (idx1 + 1 >= num.size())
return;
// 괄호를 사용한 경우
f = calculator(result, calculator(num[idx1], num[idx1 + 1], op[idx2 + 1]),op[idx2]);
find_max(idx1 + 2, idx2 + 2, f);
}
int main() {
cin >> N;
string s;
cin >> s;
for (int i = 0; i < N; i++) {
if (s[i] >= '0' && s[i] <= '9')
num.push_back(int(s[i]-'0'));
else
op.push_back(s[i]);
}
find_max(1, 0, num[0]);
cout << max_V;
return 0;
}
'C++ > 백준' 카테고리의 다른 글
[C++/백준] 11066 파일 합치기 (0) | 2024.04.14 |
---|---|
[C++/백준] 16434 드래곤 앤 던전 (1) | 2024.04.07 |
[C++ / 백준] 2133 타일 채우기 (0) | 2024.03.23 |
[C++/백준] 2623 음악 프로그램 (0) | 2024.03.10 |
[C++/백준] 11404 플로이드 (0) | 2024.03.02 |