알고리즘 스터디

[백준] 14888 연산자 끼워넣기 파이썬

문제

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 


풀이

permutations으로 연산자 조합을 모두 만들고 set으로 중복을 제거했다.

파이썬과 c++14의 음수 나누기 방식이 달라 몇 번 틀렸었다. 

(-1) // 3 의 경우 c++14는 0, 파이썬은 -1을 반환한다.

파이썬은 내림이라는 수학적 정의에 따라 설계했다고 함..

파이썬으로 풀려면 양수로 바꾸고 몫을 취한 다음 다시 음수로 만들어줘야 한다.

 

import sys
from itertools import permutations

input = sys.stdin.readline

n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
op = []
for i, o in enumerate(b):
    op.extend([i]*o)

opc = set(permutations(op, len(op)))

results = []
for c in opc:
    res = a[0]
    for i in range(n-1):
        if c[i] == 0:
            res += a[i + 1]
        elif c[i] == 1:
            res -= a[i + 1]
        elif c[i] == 2:
            res *= a[i + 1]
        else:
            if res < 0:
                res = int(res*(-1) // a[i + 1])
                res *= -1
            else:
                res = int(res // a[i + 1])
    results.append(res)

print(max(results))
print(min(results))

그렇지만 재귀로 푸는 것이 훨씬 빠르다고 한다.

 

 


다른 사람의 코드

https://daimhada.tistory.com/93

 

Python으로 푸는 백준 14888. 연산자 끼워넣기

백준 14888. 연산자 끼워넣기 N개의 수와 N-1개의 연산자가 주어졌을 때, 수 사이에 연산자를 끼워넣어서 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오. 백준

daimhada.tistory.com