일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝
- 프로그래밍언어론
- 파이썬
- C++
- 시애틀
- 머신러닝
- jvm
- binary search
- DP
- spring
- 벤쿠버
- 라인
- 스프링 프레임워크
- 스타벅스
- STL
- Spring Framework
- 알고리즘
- 백트래킹
- 다이나믹프로그래밍
- BFS
- Java
- 릿코드
- 프로그래머스
- Python
- leetcode
- 백준
- 라인플러스
- dfs
- 모두를 위한 딥러닝
- C/C++
- Today
- Total
케이스윔의 개발 블로그
[백준 알고리즘][DFS] 14888번 연산자 끼워넣기 본문
문제 정의
n개의 수로 이루어진 수열과 덧셈(+), 뺄셈(-), 곱셈(x), 나눗셈(÷) 중에서 n-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.
문제 출처: 백준 온라인 저지(https://www.acmicpc.net/problem/14888)
문제 풀이
지금 내가 풀고 있는 문제들이 전부 삼성 sw 역량 테스트 문제집에 있는 문제들인데, 왠지 다 비슷한 방식으로 푸는 문제인 것 같다. 일단 대부분의 문제가 완전 탐색으로 풀 수 있었는데 이 문제에서도 N이 2이상 11이하이므로 완전 탐색을 하더라도 시간이 많이 소요되지않는다. 어떠한 연산자가 들어왔는지를 저장해놓은 다음, 연산자를 순서가 있는 n-1개로 나열할 수 있는 경우의 수를 구해야 한다. 여기서의 연산은 괄호가 없고 앞에서부터 뒤로 쭉 계산을 해나가는 것이므로 연산자의 순서에 따라서 만들어지는 식의 결과가 달라진다. 이전에 모든 경우를 구하기 위한 DFS를 사용해서 마찬가지로 풀어준다.
*처음에 최소, 최대값을 10억보다 작은 값으로 잡아줘서 틀렸습니다를 받았다.
코드
void DFS(int curr)
{
int i;
int result = 0;
visited[curr] = 1;
stack.push_back(curr);
if(stack.size() == N-1)
{
result = num[0];
for(i=0; i<N-1; i++){
if(cal[stack[i]] == 0) //덧셈
{
result += num[i+1];
}
else if(cal[stack[i]]==1) //뺄셈
{
result -= num[i+1];
}
else if(cal[stack[i]]==2) //곱셈
{
result = result * num[i+1];
}
else if(cal[stack[i]]==3) //나눗셈
{
if(result < 0)
{
result = - result;
result = result/num[i+1];
result = - result;
}
else
result = result/num[i+1];
}
}
Min = min(Min, result);
Max = max(Max, result);
}
else{
for(i=0; i<N-1; i++){
if(visited[i] != 1)
DFS(i);
}
}
visited[curr] = 0;
stack.pop_back();
}
'Algorithm' 카테고리의 다른 글
[백준 알고리즘] 14500번 테르토미노 (0) | 2018.03.31 |
---|---|
[백준 알고리즘][DFS] 14501번 퇴사 (0) | 2018.03.29 |
[백준 알고리즘][DFS][백트래킹] 6603번 로또 (0) | 2018.03.18 |
[백준 알고리즘][완전탐색][DFS][백트래킹] 14889번 스타트와 링크 (0) | 2018.03.17 |
[알고리즘] 벨만포드 알고리즘(Bellman-Ford Algorithm) (0) | 2018.03.17 |