티스토리 뷰

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

 

15658번: 연산자 끼워넣기 (2)

N개의 수로 이루어진 수열 A1, A2, ..., AN이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다. 연산자의 개수

www.acmicpc.net

 

이제 실버2단계까지는... 그냥 손 가는대로 풀면 풀린다.

그래서 그냥 막 풀었는데 

다 풀고 나서 생각해보니 연산자 조합을 만들어 나가면서 마지막에 계산을 하는 게 아니라. 

연산자를 추가할 때마다 계산해서 그 값을 사용하는 것이 더 시간을 줄일 수 있을 것 같다. 

 

그리고 멍청하게 계속 특수문자를 사용해서 그 값을 전해줬는데. 

그냥  + 는 0 , -는 1 x는 2, %는 3 이런 식으로 할껄 그랬다. 

 

const input = require('fs').readFileSync('./dev/stdin').toString().trim().split('\n')
const N = input[0]-1;
const nums = input[1].split(' ').map(Number)
const [A,S,M,D] = input[2].split(' ').map(Number)

let max = -1000000000
let min = 1000000000

const SIGN = ['+','-','×','÷']


solve([],A,S,M,D);
console.log(max+'\n'+min)

function solve(arr,a,s,m,d){
  if(arr.length==N){
    const res = nums.reduce((r,v,i)=>{
      if(i==0){
        return v;
      }else{
        switch(arr[i-1]){
          case '+':
            return r+v;
          case '-':
            return r-v;
          case '×':
            return r*v;
          case '÷':
            if(r<0){
              return (-1)*Math.floor((-1*r)/v)
            }
            return Math.floor(r/v)
        }
      }
    },0)
    if(res>max) max = res;
    if(res<min) min = res;
    return;
  }else{
    SIGN.forEach((v,i)=>{
      if(i==0 && a>0){
        arr.push(v);
        solve(arr,a-1,s,m,d)
        arr.pop();
      }else if( i==1 && s>0){
        arr.push(v);
        solve(arr,a,s-1,m,d)
        arr.pop();
      }else if(i==2 && m>0){
        arr.push(v);
        solve(arr,a,s,m-1,d)
        arr.pop();
      }else if(i==3 && d>0){
        arr.push(v);
        solve(arr,a,s,m,d-1)
        arr.pop();
        
      }
    })
  }

}

 

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함