Bleeding edge

[프로그래머스] 수식 최대화 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 수식 최대화 - 자바스크립트

codevil 2022. 4. 6. 14:01

https://yoon-dumbo.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%98%EC%8B%9D-%EC%B5%9C%EB%8C%80%ED%99%94-javascript

 

[프로그래머스] 수식 최대화 - javascript

문제 [programmers.co.kr/learn/courses/30/lessons/67257] 문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승

yoon-dumbo.tistory.com

 

function solution(expression) {
    var answer = 0
    const regex1 = /([^0-9])/g
    expression = expression.split(regex1);

    let list = []
    let operation = ['+', '-', '*']
    let order = [[0,1,2], [0,2,1], [1,0,2], [1,2,0], [2,0,1], [2,1,0]]
    //method priority
        function method(arr, operation){
        while(arr.includes(operation)){
        let index = arr.indexOf(operation)
        let input = 0;//이놈을 안써서 문제가 많았다
        if(operation==='+'){ input = Number(arr[index-1]) + Number(arr[index+1])}
        else if(operation==='-'){ input = Number(arr[index-1]) - Number(arr[index+1])}
        else if(operation==='*'){ input = Number(arr[index-1]) * Number(arr[index+1])}
        arr = [...arr.slice(0, index-1), input,...arr.slice(index+2)]
 
        }
        return arr
        }

    for(let i = 0; i<order.length; i++){
         let exp = expression
        for(let j = 0 ; j<3;j++){
            exp = method(exp, operation[order[i][j]])
                    
            if(exp.length===1){
                if(Math.abs(exp[0])>answer){
                    answer = Math.abs(exp[0])
                }
            }
                 

        }
    }
    
    return answer;
}

이 문제의 플로우는 단순하다.

1. 우선순위로  해결할 operation 리스트를 만들고, 그 리스트를 배열할 순서를 넣는다. 굳이 이 배열을, 손으로 쳐넣은 이유는, 경우의 수가 얼마 없기때문이다, 만일 operation이 많았다면 combination을 썼을꺼같다. 

2. 이 operation을 해결할 method function을 만들었다. method function은, arr를 받으면 변형된 arr을 return한다

while문에 includes를 이용하여 대입한 operation이 모두 사라질때까지 operation index -1과 operation index +1과 operation과의 조합을 이용하여 input값을 대입하고 arr을 계속 바꾸는 방법이다. 

3. for문을 이용하여 여러번 값을 return하고, 이 값중 가장 abs가 높은 값을 return하는게 solution이 되는데 이때 주의 해야할 것은, for문마다 let exp를 넣음으로써 expression을 초기화하는 것이다.

 

 

사실 어려운 문제라고 생각은 안했는데, 이상하게 한개의 for문을 실행시키면 주변값이 전에 계산했던값으로 변하는 현상이 있어서 ;ㅅ;으악 내일풀어야지 하고 미뤄뒀었던 문제다. 처음에는 let input을 안쓰고 그냥 arr[index-1] = Number(arr[index-1]) + Number(arr[index+1]) 와같이 arr의 값을 변조시켰는데 이를 input을 새로 값을 만들어서 대입을 하니 값이 변하는 것도 없고 깔끔하게 풀렸다. 이전에 풀었던 문제중에, 이상하게 집합에서 문제가 터졌던 문제도 이렇게 값을 더 넣으면 문제가 안생기지 않을까? 라는 의문이 들었으니 나중에 그런문제를 만나면 한번 더 시도해봐야겠다.

 

 

(보통 내가 문제를 푸는 순서가, 아이디어가 없다...? 이게 단순 문제풀이 방식을 모른다면, 남의 풀이를 보고 넘어간다, 만일 푸는 방식이 아니라 bfs나 dfs처럼 전혀 모른다면 풀이를 보고, 그 개념을 공부한다.

 

만일 아이디어는 있으나 틀린다. 다시 풀어보고 그래도 안되면 남의 풀이를 보는데, 남의 풀이와 유사한데 다르다면, 내 풀이에 가깝데 왜 에러가 생겼는지 찾아본다. 혹시 공부방법에 더 좋은방법이 생겨서 바뀐다면 또써놔야지! 이상!)