백준 14888번
문제 읽으면서 쉽게 풀수있도록 많이 신경써준 문제라는 느낌이 들었다
먼저 연산자 우선순위 고려도 안해도 되었고 중간에 계산되는 식도 int범위를 초과하지 않는다고 친절히 알려주었다
아마 그래서 solved ac 실버로 측정된 것 같다ㅎㅎ
삼성 SW 기출 문제집에 있는 몇안되는 실버 문제
dfs 순열 코드를 응용해서 작성해봤다
숫자 배열은 그대로 두고 그 사이사이에 어떤 연산자가 들어갈지를 전부 찾아주었다
이때 연산자 순서는 직관적으로 확인할 수 있게 string으로 그냥 넣어주었다
전체 숫자 사이에 연산자들이 정해지면 결과를 차례로 계산하여 최소,최대값과 비교해주었다
마지막에 최소값과 최대값만 출력해주면 끝!
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
|
#include <stdio.h>
#include <string>
using namespace std;
int N;
int c[5];
int operators[5];
int arr[105];
int MAX = -1000000000;
int MIN = 1000000000;
void dfs(int cnt,string str){
if(cnt+1==N) {
int len = str.length(),res = arr[0];
for(int i = 0 ; i < len; i++){
switch (str[i])
{
case '+':
res += arr[i+1];
break;
case '-':
res -= arr[i+1];
break;
case '*':
res *= arr[i+1];
break;
case '/':
res /= arr[i+1];
break;
}
}
if(MIN>res) MIN = res;
if(MAX<res) MAX = res;
return;
}
for(int i = 0 ; i < 4 ; i++){
if(c[i]<operators[i]){
c[i]++;
if(i==0) dfs(cnt+1,str+"+");
else if(i==1) dfs(cnt+1, str+"-");
else if(i==2) dfs(cnt+1,str+"*");
else dfs(cnt+1,str+"/");
c[i]--;
}
}
}
int main(){
scanf("%d",&N);
for(int i = 0 ; i < N ; i++) scanf("%d",&arr[i]);
for(int i = 0 ; i < 4 ; i++) scanf("%d",&operators[i]);
dfs(0,"");
printf("%d\n%d\n",MAX,MIN);
}
|
cs |
'알고리즘' 카테고리의 다른 글
[C++] 프로그래머스 순위 (0) | 2021.04.22 |
---|---|
[C++] 프로그래머스 전화번호 목록 (0) | 2021.04.07 |
[C] 주사위 굴리기 (0) | 2021.03.31 |
[C] 컨베이어 벨트 위의 로봇 (0) | 2021.03.25 |
[C] 사다리 조작 (0) | 2021.03.25 |