[프로그래머스] 수식 최대화 (파이썬, 순열, javascript)

728x90
반응형

1. javascript

function solution(expression) {
    const prior=[['+','-','*'],['+','*','-'],['*','-','+'],['*','+','-'],
               ['-','+','*'],['-','*','+']]; // 순열로 돌려도 되고 최대 6가지
    const nums=[];
    const opers=[];
    let num='';
    expression.split("").map((x)=>{
        if(x>='0' && x<='9'){//숫자 계산
            num+=x;
        }else{
            nums.push(+num);//기호를 만나면 지금까지 계산한 숫자를 숫자배열에 넣어준다.
            num='';
            opers.push(x);
        }
    })
    nums.push(+num);
    
    var answer = 0;
    for(let i=0;i<prior.length;i++){
        const cnums=[...nums];//각 배열 복사
        const copers=[...opers];
        for(let j=0;j<prior[i].length;j++){
            let curOper=prior[i][j];//현재 기호
            for(let k=0;k<copers.length;k++){ // 한 문장안에 같은 기호가 있으면 그 수 먼저 계산
                if(curOper==copers[k]){
                    if(curOper==='+'){
                        cnums[k]=cnums[k]+cnums[k+1];//계산된 것을 넣고
                        cnums.splice(k+1,1);//숫자하나는 줄어듬
                        copers.splice(k,1);//연산자도 줄어듬
                        k-=1;//삭제되어 1감소시킨다.
                    }else if(curOper==='-'){
                        cnums[k]=cnums[k]-cnums[k+1];
                        cnums.splice(k+1,1);
                        copers.splice(k,1);
                        k-=1;
                    }else if(curOper==='*'){
                        cnums[k]=cnums[k]*cnums[k+1];
                        cnums.splice(k+1,1);
                        copers.splice(k,1);
                        k-=1;
                    }
                }
            }
            // console.log(cnums,copers)
        }
        answer=Math.max(answer,Math.abs(cnums[0]));
    }
    
    return answer;
}

 

2. 파이썬 풀이

from itertools import permutations
def solution(express):
    answer = 0
    temp=[]
    num=0
    for i in range(len(express)):
        if express[i].isnumeric():
            num=num*10+int(express[i])
        else:
            temp.append(num)
            temp.append(express[i])
            num=0
    temp.append(num)

    for cur in permutations(['+','-','*']): # 6가지 
        flag=False
        temp2=temp[::] #deepcopy
        for c in cur: # 3개 
            i=1
            while len(temp2)>1 and i<len(temp2): # 두번째 조건: 현재 연산자의 계산이 모두 끝나면 
                if temp2[i]==c:
                    if c=='+':
                        temp2[i]=temp2[i-1]+temp2[i+1]
                    elif c=='-':
                        temp2[i]=temp2[i-1]-temp2[i+1]
                    else:
                        temp2[i]=temp2[i-1]*temp2[i+1]
                    temp2=temp2[:i-1]+[temp2[i]]+temp2[i+2:]
                    if len(temp2)==1:
                        # print(temp2[0])
                        answer=max(answer,abs(temp2[0]))
                        flag=True
                        break
                else:
                    i+=1
            if flag:
                break 
    return answer
728x90
반응형
TAGS.

Comments