728x90

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

import itertools
n = int(input())                         # 수의 개수  (5)
aa = list(map(int, input().split()))     # n 개의 수  (1 2 3 4 5)
op_n = list(map(int, input().split()))   # 연산자 각 종류 수 (0 1 2 1)
op = []                          # +, -, *, // 수 만큼 삽입 [1, 2, 2, 3]
for i in range(4):               # 연산자 해당하는 번호를 op 에 삽입
    for j in range(op_n[i]):     # op = [1, 2, 2, 3]
        op.append(i)

min = 1000000000
max = -1000000000

case = list(set(list(itertools.permutations(op))))  # 연산자 순열 (중복 제거)
# [(2, 3, 2, 1), (2, 1, 3, 2), (2, 3, 1, 2), (1, 3, 2, 2), (3, 2, 2, 1),
# (2, 1, 2, 3), (2, 2, 1, 3), (3, 1, 2, 2), (3, 2, 1, 2), (2, 2, 3, 1), (1, 2, 3, 2), (1, 2, 2, 3)]
for i in range(len(case)):
    a = [str(aa[0])]             # a = ['1']  case[0] = (2, 3, 2, 1) = (*, //, *, -)
    for j in range(n-1):         # 연산자로 변경하여 a 에 삽입
        if case[i][j] == 0:      
            a.append('+')
        elif case[i][j] == 1:
            a.append('-')
        elif case[i][j] == 2:
            a.append('*')
        else:
            a.append('//')
        a.append(aa[j+1])
    # a = ['1', '*', '2', '//', '3', '*', '4', '-', '5']
    
    # 연산 작업 => (a[0] a[1] a[2])=(숫자 연산자 숫자) 계산 결과를 a[0]에 넣고 a[1], a[2] 삭제
    # a = ['1', '*', '2', '//', '3', '*', '4', '-', '5'] => ['2', '//', '3', '*', '4', '-', '5']
    # => ['0', '*', '4', '-', '5'] => ['0', '-', '5'] => ['-5']
    while len(a) > 1:
        if '*' == a[1]:
            a[0] = str(int(a[0])*int(a[2]))
            del a[1:3]

        elif '//' == a[1]:
            if int(a[0]) < 0:
                a[0] = '-' + str(int(a[0])*(-1)//int(a[2]))
            else:    
                a[0] = str(int(a[0])//int(a[2]))
            del a[1:3]

        elif '+' == a[1]:
            a[0] = str(int(a[0])+int(a[2]))
            del a[1:3]

        elif '-' == a[1]:
            a[0] = str(int(a[0])-int(a[2]))
            del a[1:3]
    
    if min > int(a[0]):    # 최솟값인지
        min = int(a[0])
    if max < int(a[0]):    # 최댓값인지
        max = int(a[0])

print(max)
print(min)
import itertools
n = int(input())                         # 수의 개수  (5)
aa = list(map(int, input().split()))     # n 개의 수  (1 2 3 4 5)
op_n = list(map(int, input().split()))   # 연산자 각 종류 수 (0 1 2 1)
op = []                          # +, -, *, // 수 만큼 삽입 [1, 2, 2, 3]
for i in range(4):               # 연산자 해당하는 번호를 op 에 삽입
    for j in range(op_n[i]):     # op = [1, 2, 2, 3]
        op.append(i)

min = 1000000000
max = -1000000000

case = list(set(list(itertools.permutations(op))))  # 연산자 순열 (중복 제거)
# [(2, 3, 2, 1), (2, 1, 3, 2), (2, 3, 1, 2), (1, 3, 2, 2), (3, 2, 2, 1),
# (2, 1, 2, 3), (2, 2, 1, 3), (3, 1, 2, 2), (3, 2, 1, 2), (2, 2, 3, 1), (1, 2, 3, 2), (1, 2, 2, 3)]
for i in range(len(case)):
    a = aa[0]             # a = ['1']  case[0] = (2, 3, 2, 1) = (*, //, *, -)
    for j in range(n-1):         # 연산자로 변경하여 a 에 삽입
        if case[i][j] == 0:      
            a = a + aa[j+1]
        elif case[i][j] == 1:
            a = a - aa[j+1]
        elif case[i][j] == 2:
            a = a * aa[j+1]
        else:
            if a < 0:
                a = - (-a // aa[j+1])
            else:    
                a = a // aa[j+1]
    
    if min > a:    # 최솟값인지
        min = a
    if max < a:    # 최댓값인지
        max = a

print(max)
print(min)

반응형

'전.py' 카테고리의 다른 글

백준 2015 수들의 합 4 (실패)  (0) 2020.12.13
백준 1002 터렛  (0) 2020.12.13
백준 1697 숨바꼭질  (0) 2020.12.13
백준 14225 부분수열의 합  (0) 2020.12.13
백준 3989 유행성 독감 (실패)  (0) 2020.12.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기