[백준] 연산자 끼워넣기

이정연·2023년 3월 12일
0

CodingTest

목록 보기
132/165

문제 설명

원래 문제 설명은 따로 안 적고 바로 풀이를 기록했지만 ... 간혹가다 문제 이해가 안 간 사람들이 있을 수도 있을 것 같아서 앞으로 추가하려고 한다. 나도 가끔 문제 이해가 안 되는 것들이 있어서 ㅎㅎ 역지사지!

이 문제는 주어진 숫자 리스트에서 연산자를 끼워넣는 문제이다.

예를 들어, 숫자 = [1,2,3,4,5] , 연산자 = [+,-,*,/] 라면

"1+2-3*4/5"와 같은 수식이 나올 것이다.

이 때, 숫자는 순서를 바꿀 수 없지만 연산자는 순서를 바꿀 수 있다.

따라서 위 수식 말고 "1-2+3*4/5" 이렇게 표현할 수도 있고 ..

"1*2/3+4-5" 이렇게 표현할 수도 있다.

다양한 경우의 수가 존재하는데 이 모든 경우의 수에서 연산값이 제일 큰 값과 작은 값을 추려내는 문제이다.

이 때 연산자 우선순위는 무시하며 나누기는 문제 조건을 따른다.

내가 이 문제를 틀린 이유는

  1. PyPy3로 제출 안 해서.
  2. 나누기 조건을 잘못 파악해서.

설계 및 함수 설명

main

if __name__ == '__main__':
    high = -int(1e9)
    low = int(1e9)
    N,lst,op = init()
    for case in (perm(op,N-1)): # N!
        res = calc(lst,case) # N 
        high = max(high,res)
        low = min(low,res)
    print(high)
    print(low)

op는 연산자 리스트다.

연산자의 모든 순열을 구해서 연산값을 구한다.

그리고 최대,최소를 업데이트 해준다.

모든 연산자 순열을 다 돌았을 때 최대 최소를 출력한다.

init

def init():
    N = int(input())
    lst = list(map(int,input().split()))
    op = []
    plus,minus,mult,devide = map(int,input().split())
    for i in range(plus):
        op.append('p')
    for i in range(minus):
        op.append('mn')
    for i in range(mult):
        op.append('mp')
    for i in range(devide):
        op.append('d')
    return N,lst,op

N, 숫자 리스트, 연산자 리스트 반환

calc

def calc(nums,op):
    origin = nums.copy()
    for i in range(len(op)):
        if op[i] == 'p':
            origin[i+1] = origin[i]+nums[i+1]
        if op[i] == 'mn':
            origin[i+1] = origin[i]-nums[i+1]
        if op[i] == 'mp':
            origin[i+1] = origin[i]*nums[i+1]
        if op[i] == 'd':
            if origin[i] < 0:
                origin[i+1] = -((-origin[i])//nums[i+1])
            else:
                origin[i+1] = origin[i]//nums[i+1]
    return origin[-1]

숫자 리스트와 연산자 리스트가 주어졌을 때 연산값을 반환해주는 함수.

숫자 리스트를 깊은 복사 해주지 않으면 연산값이 숫자 리스트에 영향을 준다. 조심.

코드

import sys
from itertools import permutations as perm
input = sys.stdin.readline

def init():
    N = int(input())
    lst = list(map(int,input().split()))
    op = []
    plus,minus,mult,devide = map(int,input().split())
    for i in range(plus):
        op.append('p')
    for i in range(minus):
        op.append('mn')
    for i in range(mult):
        op.append('mp')
    for i in range(devide):
        op.append('d')
    return N,lst,op

def calc(nums,op):
    origin = nums.copy()
    for i in range(len(op)):
        if op[i] == 'p':
            origin[i+1] = origin[i]+nums[i+1]
        if op[i] == 'mn':
            origin[i+1] = origin[i]-nums[i+1]
        if op[i] == 'mp':
            origin[i+1] = origin[i]*nums[i+1]
        if op[i] == 'd':
            if origin[i] < 0:
                origin[i+1] = -((-origin[i])//nums[i+1])
            else:
                origin[i+1] = origin[i]//nums[i+1]
    return origin[-1]

if __name__ == '__main__':
    high = -int(1e9)
    low = int(1e9)
    N,lst,op = init()
    for case in (perm(op,N-1)): # N!
        res = calc(lst,case) # N 
        high = max(high,res)
        low = min(low,res)
    print(high)
    print(low)
profile
0x68656C6C6F21

0개의 댓글