기록하는 습관

[삼성SW기출문제] 14888번 연산자 끼워넣기 본문

알고리즘/[문제풀이] 삼성 SW 기출문제, 모의고사

[삼성SW기출문제] 14888번 연산자 끼워넣기

로그뉴 2022. 9. 14. 18:34

1. 문제 링크

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

2. 코드

이 문제는 총 2가지 풀이 방법이 있다.

 

1. 순열 구한 후, 완전 탐색으로 풀기

-> 이중 for문으로 시간복잡도 log(N^2)

-> 백준 Python3로는 시간초과 발생. PyPy3는 통과.

- 문제 소요 시간: 30분

from itertools import permutations

N = int(input())
A = list(map(int, input().split()))
o = list(map(int, input().split()))
operator = ['+', '-', '*', '/']
op = []
for i in range(len(o)):
    op += [operator[i]] * o[i]

max_ans, min_ans = -1e9, 1e9
orders = list(permutations(op, N - 1))

for order in orders:
    answer = A[0]
    for i in range(len(order)):
        if order[i] == '+':
            answer += A[i + 1]
        elif order[i] == '-':
            answer -= A[i + 1]
        elif order[i] == '/':
            if answer < 0:
                answer = -(abs(answer) // A[i + 1])
            else:
                answer //= A[i + 1]
        elif order[i] == '*':
            answer *= A[i + 1]

    max_ans = max(max_ans, answer)
    min_ans = min(min_ans, answer)

print(max_ans)
print(min_ans)

 

2. DFS 알고리즘으로 풀기 (재귀 이용)

- 문제 소요 시간: 29분

 

from itertools import permutations

N = int(input())
A = list(map(int, input().split()))
op = list(map(int, input().split())) # +, -, *, //

max_ans, min_ans = -1e9, 1e9

def dfs(i, answer, add, sub, mul, div):
    global max_ans, min_ans
    if i == N:
        max_ans = max(answer, max_ans)
        min_ans = min(answer, min_ans)
        return

    if add:
        dfs(i + 1, answer + A[i], add - 1, sub, mul, div)
    if sub:
        dfs(i + 1, answer - A[i], add, sub - 1, mul, div)
    if mul:
        dfs(i + 1, answer * A[i], add, sub, mul - 1, div)
    if div:
        dfs(i + 1, int(answer / A[i]), add, sub, mul, div - 1)


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

print(max_ans)
print(min_ans)

 

 

Comments