๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[Javascript] ์ˆ˜์‹ ์ตœ๋Œ€ํ™” (67257)

๋ฌธ์ œ๋งํฌ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์ˆ˜์‹ ์ตœ๋Œ€ํ™”

IT ๋ฒค์ฒ˜ ํšŒ์‚ฌ๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ด์–ธ์€ ๋งค๋…„ ์‚ฌ๋‚ด ํ•ด์ปคํ†ค ๋Œ€ํšŒ๋ฅผ ๊ฐœ์ตœํ•˜์—ฌ ์šฐ์Šน์ž์—๊ฒŒ ์ƒ๊ธˆ์„ ์ง€๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋Œ€ํšŒ์—์„œ๋Š” ์šฐ์Šน์ž์—๊ฒŒ ์ง€๊ธ‰๋˜๋Š” ์ƒ๊ธˆ์„ ์ด์ „ ๋Œ€ํšŒ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋‹ค์Œ๊ณผ

programmers.co.kr

 

์ ‘๊ทผ ๋ฐฉ๋ฒ•
1. `expression = "100-200*300-500+20"` ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ๋˜์–ด์žˆ๋Š” ์‹์„ ์ˆซ์ž + ์—ฐ์‚ฐ์ž ํ˜•ํƒœ์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. => ์ •๊ทœ์‹ ์‚ฌ์šฉ
const re = /[-*+]/g;
const operationArr = expression.match(re);
// [๋ชจ๋“  ์—ฐ์‚ฐ์ž ์ถœ๋ ฅ]
const numArr = expression.split(re).map(e => parseInt(e));
// [๋ชจ๋“  ์ˆซ์ž ์ถœ๋ ฅ]โ€‹


2. ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„์˜ ์ˆœ์—ด์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค. (์ตœ๋Œ€ ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜๊ฐ€ 3๊ฐœ์ด๋ฏ€๋กœ 3!์ด ์ตœ๋Œ€)
// ์žฌ๊ท€๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆœ์—ด์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋„์ถœ
const getPermutations = function (arr, selectNumber) {
  const results = [];
  if (selectNumber === 1) return arr.map((el) => [el]);

  arr.forEach((fixed, index, origin) => {
    const rest = [...origin.slice(0, index), ...origin.slice(index+1)]
    const permutations = getPermutations(rest, selectNumber - 1);
    const attached = permutations.map((el) => [fixed, ...el]);
    results.push(...attached); 
  });

  return results;
}โ€‹

 

์ˆœ์—ด๊ณผ ์กฐํ•ฉ์„ ์ž˜ ์„ค๋ช…ํ•œ ๋ธ”๋กœ๊ทธ

3. ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 
1. ์—์„œ ๊ตฌํ•œ numArr๊ณผ operationArr์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด (expression = "100-200*300-500+20" ์ธ ๊ฒฝ์šฐ)
์—ฐ์‚ฐ์ž์™€ ํ”ผ์—ฐ์‚ฐ์ž์˜ index ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•˜์—ฌ operationArr === "์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์—ฐ์‚ฐ์ž" ์ผ๋•Œ
numArr[index], numArr[index+1] ๊ณผ operationArr[index]๋ฅผ ์—ฐ์‚ฐํ•˜๋ฉด ์šฐ์„ ์ˆœ์œ„๋Œ€๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  splice()๋ฅผ ํ†ตํ•ด ์—ฐ์‚ฐ์ด ๋๋‚œ element๋ฅผ ์ง€์›Œ์ฃผ๋ฉด ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ("*", "+", "-") ์ธ ๊ฒฝ์šฐ๋ฅผ ์ž„์˜๋กœ ์ •ํ•ด์„œ ๊ตฌํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.


๋ฐฐ์šด ๋ถ€๋ถ„

1. operationResult์—์„œ operation์„ ๋ฌธ์ž์ธ oper1, oper2, oper3์œผ๋กœ ๋ฐ›์•˜๋Š”๋ฐ,
์ด๋ฅผ ๋‹ค์‹œ numArr[i] oper1 numArr[i+1] ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฐ์‚ฐ์ž๋กœ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.
=> eval() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž๋ฅผ ์—ฐ์‚ฐ์ž๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

2. operationResult(numArr, operationArr, oper1, oper2, oper3)๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์›๋ณธ ๋ฐฐ์—ด์ธ numArr, operationArr์ด ๋ณ€ํ•ด์„œ permutationOper์˜ ๊ฐ’๋“ค์„ ๋ชจ๋‘ ์ˆœํ™˜ํ• ๋•Œ ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์—†์—ˆ๋‹ค.
=> spread ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์–•์€ ๋ณต์‚ฌ๋ฅผ ํ•˜์—ฌ์„œ ์›๋ณธ ๋ฐฐ์—ด์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก operationResult ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์˜€๋‹ค.

3. ์ฒ˜์Œ ๊ตฌํ˜„ํ•œ ๋กœ์ง์€ ์—ฐ์‚ฐ์ž๊ฐ€ 3๊ฐœ ๋ชจ๋‘ ์กด์žฌํ• ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์•˜๋‹ค. 
ํ•˜์ง€๋งŒ ์—ฐ์‚ฐ์ž๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ, ๋‘๊ฐœ์ธ ๊ฒฝ์šฐ๋„ ์žˆ์–ด์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
oper2 !== undefined, oper3 !== undefined ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. 
๋˜ํ•œ operationResult(oper1, oper2, oper3)์„ operationResult( ...e)์œผ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ๋ฐฐ์› ๋‹ค.
(permutationOper.forEach(e => )์—์„œ ๋งŒ์•ฝ e์˜ ๊ธธ์ด๊ฐ€ 2๋ผ๋ฉด oper1, oper2, ๊ธธ์ด๊ฐ€ 1์ด๋ผ๋ฉด oper1๋งŒ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” undefined๋กœ ํ• ๋‹นํ•œ๋‹ค.)

 

 

function solution(expression) {
  var answer = [];
  const re = /[-*+]/g;
  const operationArr = expression.match(re);
  const numArr = expression.split(re).map(e => parseInt(e));
  
  let uniqueOper =  new Set(operationArr);
  uniqueOper = Array.from(uniqueOper);
  
  let permutationOper =  getPermutations(uniqueOper, uniqueOper.length)
  permutationOper.forEach(e => {
      answer.push(operationResult([...numArr], [...operationArr], ...e))
  })
  
  return Math.max(...answer);
}

const operationResult = (numArr, operationArr, oper1, oper2, oper3) =>{
let result = 0;
for(let i = 0; i <= operationArr.length; i++){
  if(operationArr[i] === oper1){
    result = eval(numArr[i] +  oper1 + numArr[i+1]);
    numArr.splice(i,2,result);
    operationArr.splice(i,1);
    i = -1;
    result = 0;
    continue;
  }else if(!operationArr.includes(oper1) && operationArr[i] === oper2 && oper2 !== undefined){
    result = eval(numArr[i] +  oper2 + numArr[i+1]);
    numArr.splice(i,2,result);
    operationArr.splice(i,1);
    i = -1;
    result = 0;
    continue;
  }else if(!operationArr.includes(oper2) && operationArr[i] === oper3 && oper3 !== undefined){
    result = eval(numArr[i] +  oper3 + numArr[i+1]);
    numArr.splice(i,2,result);
    operationArr.splice(i,1);
    i = -1;
    result = 0;
    continue;
  }
}
return Math.abs(numArr[0]);
}

const getPermutations = function (arr, selectNumber) {
  const results = [];
  if (selectNumber === 1) return arr.map((el) => [el]);

  arr.forEach((fixed, index, origin) => {
    const rest = [...origin.slice(0, index), ...origin.slice(index+1)]
    const permutations = getPermutations(rest, selectNumber - 1);
    const attached = permutations.map((el) => [fixed, ...el]);
    results.push(...attached); 
  });

  return results;
}