짱아의 개발 기록장

[Algorithm] 삼성전자 코딩테스트 - 연산자 끼워넣기(c++) 본문

Algorithm/삼성 sw 역량테스트 기출

[Algorithm] 삼성전자 코딩테스트 - 연산자 끼워넣기(c++)

jungahshin 2020. 9. 23. 00:42
반응형

여러가지 풀이 방법이 있겠지만, 글쓴이는 조합을 활용해서 문제를 풀었다.

벡터에 사용되는 연산자의 개수만큼 해당 연산자의 idx값을 넣어주었다. ex) 1 1 0 1 -> [0, 1, 3] / 2 0 0 2 -> [0, 0, 3, 3]

그리고 조합(next_permuation사용)을 통해 계산을 하고 최소, 최대값을 갱신해주었다.

 

 

코드 첨부

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// 연산자 끼워넣기
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;
 
int n, m, l;
vector<int> v;
vector<int> op;
char OP[4= {'+''-''*''/'};
int ans_min = INT_MAX;
int ans_max = -INT_MAX;
 
void cal()
{
    int total = v[0];
    for(int i=1; i<v.size(); i++){
        int a = v[i];
        int idx = op[i-1];
 
        if(OP[idx]=='+'){
            total += a;
        }else if(OP[idx]=='-'){
            total -= a;
        }else if(OP[idx]=='*'){
            total *= a;
        }else if(OP[idx]=='/'){
            total /= a;
        }
    }
 
    ans_min = min(ans_min, total);
    ans_max = max(ans_max, total);
}
 
int main()
{
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>m;
        v.push_back(m);
    }
 
    for(int i=0; i<4; i++){
        cin>>l;
        for(int j=0; j<l; j++){
            op.push_back(i);
        }
    }
 
    do{
        cal();
    }while(next_permutation(op.begin(), op.end()));
 
    cout<<ans_max<<"\n";
    cout<<ans_min<<"\n";
 
    return 0;
}
cs

 

문제 첨부

www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, ��

www.acmicpc.net

 

github첨부

github.com/jungahshin/algorithm/blob/master/c:c%2B%2B/14888_review_2.cpp

 

jungahshin/algorithm

algorithm study. Contribute to jungahshin/algorithm development by creating an account on GitHub.

github.com

반응형
Comments