14888번 - 연산자 끼워넣기*

2022. 4. 8. 00:002022/BaekJoon_삼성 SW 역량 테스트 기출

DFS 예시
graph = dict()
 
graph['A'] = ['B', 'C']
graph['B'] = ['A', 'D']
graph['C'] = ['A', 'G', 'H', 'I']
graph['D'] = ['B', 'E', 'F']
graph['E'] = ['D']
graph['F'] = ['D']
graph['G'] = ['C']
graph['H'] = ['C']
graph['I'] = ['C', 'J']
graph['J'] = ['I']

<graph>

{'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'G', 'H', 'I'], 'D': ['B', 'E', 'F'], 'E': ['D'], 'F': ['D'], 'G': ['C'], 'H': ['C'], 'I': ['C', 'J'], 'J': ['I']}

- 스택/큐를 활용한 방식

def dfs(start, graph):
    from collections import deque
    visited = []; need_visited = deque()
    need_visited.append(start)
    
    while need_visited:
        node = need_visited.popleft()
        if node not in visited:
            visited.append(node)
            #list 형태로 extend
            need_visited.extend(graph[node])

dfs('A', graph)
need_visited visited
['A'] ['A']
['B', 'C'] ['A', 'B']
['C', 'A', 'D'] ['A', 'B', 'C']
['A', 'D', 'A', 'G', 'H', 'I'] ['A', 'B', 'C']
['D', 'A', 'G', 'H', 'I'] ['A', 'B', 'C', 'D']
['A', 'G', 'H', 'I', 'B', 'E', 'F'] ['A', 'B', 'C', 'D']
['A', 'G', 'H', 'I', 'B', 'E', 'F'] ['A', 'B', 'C', 'D']
['G', 'H', 'I', 'B', 'E', 'F'] ['A', 'B', 'C', 'D', 'G']
['H', 'I', 'B', 'E', 'F', 'C'] ['A', 'B', 'C', 'D', 'G', 'H']
['I', 'B', 'E', 'F', 'C', 'C'] ['A', 'B', 'C', 'D', 'G', 'H', 'I']
['B', 'E', 'F', 'C', 'C', 'C', 'J'] ['A', 'B', 'C', 'D', 'G', 'H', 'I']
['E', 'F', 'C', 'C', 'C', 'J'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E']
['F', 'C', 'C', 'C', 'J', 'D'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F']
['C', 'C', 'C', 'J', 'D', 'D'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F']
['C', 'C', 'J', 'D', 'D'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F']
['J', 'D', 'D'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F']
['D', 'D'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F', 'J']
['D', 'D', 'I'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F', 'J']
['D', 'I'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F', 'J']
['I'] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F', 'J']
[] ['A', 'B', 'C', 'D', 'G', 'H', 'I'. 'E', 'F', 'J']

- 재귀함수를 이용한 방식

def dfs(graph, start, visited):
    visited.append(start)
    for node in graphp[start]:
        if node not in visited:
            dfs(graph, node, visited)
    return visited
dfs(graph, 'A', [])
문제풀이
def dfs(cnt, result, add, sub, mul, div):
    global max_v
    global min_v

    if cnt == n:
        max_v = max(max_v, result)
        min_v = min(min_v, result)
        return
    
    if add > 0:
        dfs(cnt + 1, result + num_list[cnt], add-1, sub, mul, div)
    if sub > 0:
        dfs(cnt + 1, result - num_list[cnt], add, sub-1, mul, div)
    if mul > 0:
        dfs(cnt + 1, result * num_list[cnt], add, sub, mul-1, div)
    if div > 0:
        dfs(cnt + 1, -((-result) // (num_list[cnt])) if result < 0 else result // num_list[cnt] , add, sub, mul, div-1)
 
n = int(input())
num_list = list(map(int, input().split()))
add, sub, mul, div = map(int, input().split())
max_v = -1000000001
min_v = 1000000001
dfs(1, num_list[0], add, sub, mul, div)
print(max_v)
print(min_v)

< 위의 재귀식을 표로 나타내면 아래와 같다.>

1 2 3 4 5
+ 1+2 = 3 + 3+3 = 6 - 6-4 = 2 * 2*5 = 10 / 10//6 = 1
+ 1+2 = 3 + 3+3 = 6 - 6-4 = 2 / 2/5 = 0 * 0*6 = 0
+ 1+2 = 3 + 3+3 = 6 * 6*4 = 24 - 24-5 = 19 / 19-6 = 13
+ 1+2 = 3 + 3+3 = 6 * 6*4 = 24 / 24/5 = 4 - 4-6 = -2
+ 1+2 = 3 + 3+3 = 6 / 6/4 = 1 - 1-5 = -4 * -4*6 = -24
+ 1+2 = 3 + 3+3 = 6 / 6/4 = 1 * 1*5 = 5 - 5-6 = -1
+ 1+2 = 3 - 3-3 = 0 + 0+4 = 4 * 4*5 = 20 / 20/6 = 3
+ 1+2 = 3 - 3-3 = 0 + 0+4 = 4 / 4/5 = 0 * 0*6 = 0
+ 1+2 = 3 - 3-3 = 0 * 0*4 = 0 + 0+5 = 5 / 5/6 = 0
+ 1+2 = 3 - 3-3 = 0 * 0*4 = 0 / 0/5 = 0 + 0+6 = 6
+ 1+2 = 3 - 3-3 = 0 / 0/4 = 0 + 0+5 = 5 * 5*6 = 30
+ 1+2 = 3 - 3-3 = 0 / 0/4 = 0 * 0 * 5 = 0 + 0+6 = 6
+ 1+2 = 3 * 3*3 = 9 + 9+4 = 13 - 13-5 = 8 / 8/6 = 1
+ 1+2 = 3 * 3*3 = 9 + 9+4 = 13 / 13/5 = 2 - 2-6 = -4
+ 1+2 = 3 * 3*3 = 9 - 9-4 = 5 + 5+5 = 10 / 10/6 = 1
+ 1+2 = 3 * 3*3 = 9 - 9-4 = 5 / 5/5 = 1 + 1+6 = 7
+ 1+2 = 3 * 3*3 = 9 / 9/4 = 2 + 2+5 = 7 - 7-6 = 1
+ 1+2 = 3 * 3*3 = 9 / 9/4 = 2 - 2-5 = -3 + -3+6 = 3
+ 1+2 = 3 / 3/3 = 1 + 1+4 = 5 - 5-5 = 0 * 0*6 = 0
+ 1+2 = 3 / 3/3 = 1 + 1+4 = 5 * 5*5 = 25 25-6 = 19
+ 1+2 = 3 / 3/3 = 1 - 1-4 = -3 + -3+5 = 2 * 2*6 = 12
+ 1+2 = 3 / 3/3 = 1 - 1-4 = -3 * -3*5 = -15 + -15+6 = -9
+ 1+2 = 3 / 3/3 = 1 * 1*4 = 4 4+5 = 9 - 9-6 = 3
+ 1+2 = 3 / 3/3 = 1 * 1*4 = 4 - 4-5 = -1 + -1+6 = 5

* 1번이 -인 경우를 고려하면 총 경우의 수는 48개이다.

'2022 > BaekJoon_삼성 SW 역량 테스트 기출' 카테고리의 다른 글

3190 - 뱀  (0) 2022.05.03
13460 - 구슬탈출2*  (0) 2022.05.03
12100 - 2048(Easy)*  (0) 2022.05.03
14501번 - 퇴사*  (0) 2022.04.02
13458번 - 시험 감독  (0) 2022.04.01