세상을 바꾸는 데이터문제 링크:https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net 풀이 유형:브루트포스 알고리즘, 백트래킹, 깊이 우선 탐색, 너비 우선 탐색 풀이 과정:이 문제의 풀이 과정은 2가지가 있다. ★ 첫 번째 방법은 필자가 풀은 방법인 순열 라이브러리와 BFS를 이용한 방법이다. 먼저 연산자의 기호들을 차례대로 받아 순열을 이용해 가능한 모든 경우의 수를 계산하여 큐에 삽입한다. (예를 들어 '+', '-', '+', 'x' 4가지 연산자가 있다면 24가지(=4!) 경우의 수를 모두 비교한다.) 이후에 완전탐색을 이용해 큐에서 하나씩 꺼내어 계산하고 이를 최댓값과 최솟값과 비교 후 값을 업데이트해준다. 이 방법의 단점은 시간 복잡도가 많이 소요되므로 PyPy3에서만 성공이 되고, Python3에서는 시간 초과가 뜬다. ★★ 두 번째 방법은 파이썬의 라이브러리를 사용하지 않고 DFS로만 푸는 방법이다. DFS로 이용하는 방법은 첫 번째 방법보다 시간복잡도가 훨씬 낮으며, 모범 답안에 속한다. DFS 매서드 함수에 입력받은 수열의 개수만큼 계속 반복해서 재귀적으로 함수를 수행하면 된다. 2가지 방법의 메모리와 시간복잡도 비교첫 번째 줄의 메모리와 시간은 두 번째 방법인 DFS를 이용한 방법이며. 시간은 112ms로 Python3에서 원활하게 작동된다. 반면 두 번째 줄의 순열과 BFS를 이용한 방법은 PyPy3에서만 작동되며, 시간복잡도가 2888ms로 상당히 많이 소요됨을 알 수 있다. 풀이 코드:첫 번째 방법: 순열과 BFS 이용
두 번째 방법: DFS 이용 14888번 연산자 끼워 놓기
문제 설명https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, www.acmicpc.net 주어진 숫자와 연산자로 만들 수 있는 수식의 결과값 중 최대값과 최소값을 구하면 됩니다. 풀이 과정이 문제는 DFS와 백트래킹을 이용했다. 문제에서 연산에 사용할 숫자(A1,A2...An)와 연산자의 개수(b1, b2, b3, b4)가 주어진다. 연산자는 앞에서 부터 차례대로 더하기, 빼기, 곱하기, 나누기 연산자의 개수를 나타낸다 숫자의 순서는 바뀌면 안되며, 연산자의 순서만을 바꿀 수 있다. 따라서, 숫자의 순서는 유지한채 연산자를 더하기, 빼기, 곱하기, 나누기를 써가며 식을 바꿔주면 되므로 첫 번째 숫자에 첫 연산자를 넣고 DFS를 돌린다음 다시 백트래킹을 통해 원래 상태로 돌린 후 두 번째 연산자를 넣고 DFS를 돌린다음 다시 백트래킹으로 원래 상태로 돌려 모든 경우의 수를 찾아내야 한다. 그리고 이 모든 경우의 수 중에 최댓값과 최솟값을 찾아 출력하면 된다. 이를 파이썬 코드로 나타내면 다음과 같다.
https://github.com/HongEunho 전체 문제 & 코드는 위의 깃에 정리되어 있습니다. 팔로우 & 맞팔은 환영입니다 ! |