티스토리 뷰

알고리즘

백준 14888 - 파이썬

취뽀가자!! 2023. 6. 4. 20:48

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

이 문제를 보고 어떻게 풀어야 할지 감도 안 잡혀서 바로 다른 사람들의 풀이를 찾아 보았다.

import sys
input = sys.stdin.readline

n = int(input())

nums = list(map(int, input().split()))
op = list(map(int, input().split()))

max_value, min_value = -1e9, 1e9 # 최대값과 최소값을 비교하기 위해 초기값 지정

def dfs(num, idx, add, sub, mul, div):
  global max_value, min_value

  if idx == n: # 깊이가 입력된 길이와 같아질때 max, min 함수 실행
    max_value = max(max_value, num)
    min_value = min(min_value, num)

  # add가 0보다 커야 +연산자가 존재.
  if add > 0:
    # + 연산자이기 때문에 가장 먼저 더해주고, idx+1을 해주며 add-1을 통해 +연산자 하나 줄여줌.
    dfs(num + nums[idx], idx+1, add - 1, sub, mul, div)
  if sub > 0:
    # sub, mul, div도 add와 같음.
    dfs(num - nums[idx], idx + 1, add, sub -1, mul, div)
  if mul > 0:
    dfs(num * nums[idx], idx + 1, add, sub, mul - 1, div)
  if div > 0:
    dfs(int(num / nums[idx]), idx + 1, add, sub, mul, div - 1)

dfs(nums[0], 1, op[0], op[1], op[2], op[3])

print(max_value)
print(min_value)

이 문제를 백트래킹으로 풀 수 있는 이유는 연산자 순서 없이 먼저 입력된 순서대로 연산되기 때문이다. 어찌보면 겁먹지 않고 생각하다보면 스스로 풀 수 있었을지도 모른다. 하지만 요즘 시간이 많이 없기에 조금 생각해보고 모르겠으면 다른 사람의 풀이를 보곤 했다. 이렇게 푸는 방법이 생각의 힘을 기르기에는 부족할 수 있어도, 경험을 쌓기에는 좋은거 같다. 앞으로도 시간이 없을땐 이렇게 풀곤 해야겠다.

'알고리즘' 카테고리의 다른 글

백준 16236 - 파이썬  (2) 2023.06.08
백준 2206 - 파이썬  (0) 2023.06.06
백준 15649 - 파이썬  (0) 2023.05.29
백준 9663 - 파이썬  (0) 2023.05.28
백준 7562 - 파이썬  (0) 2023.05.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함