DKU-STUDY/Algorithm

JS 코드 관련 질문 올립니다

Closed this issue · 3 comments

/**
 * 평균이 최소인 Slice의 시작 위치
 * @param A
 */
function solution(A) {
  const len = A.length
  const sum = (a, b) => a + b
  let min = Infinity, i = 0, resolve = -1
  do {
    const arr1 = A.slice(i, i + 2), avg1 = arr1.reduce(sum) / arr1.length
    const arr2 = A.slice(i, i + 3), avg2 = arr2.reduce(sum) / arr2.length
    let tmp = Math.min(avg1, avg2, min)
    if (tmp !== min) ([ resolve, min ] = [ i, tmp ])
    i += 1
  } while (i < len - 1)
  return resolve
}

const testCase = require("./test.json")
testCase.forEach(({ input, output }) => console.log(input.toString(), '\n', solution(...input), output))

@JunilHwang 형이 작성한 코드인데

    if (tmp !== min) ([ resolve, min ] = [ i, tmp ]) 

이 부분이 어떤 코드? 인지 모르겠어서 올립니다.

eyabc commented

let tmp = Math.min(avg1, avg2, min) 에서 새로운 최소 값을 찾아냅니다. 만일 새로운 최소 값이라면
tmp 값은 이전값인 min 과 다를 것이고 최소 값을 만족하는 인덱스와 최소값을 재할당해 줍니다.

let tmp = Math.min(avg1, avg2, min) 에서 새로운 최소 값을 찾아냅니다. 만일 새로운 최소 값이라면
tmp 값은 이전값인 min 과 다를 것이고 최소 값을 만족하는 인덱스와 최소값을 재할당해 줍니다.

저런식으로 값이 할당 가능하군요! 감사합니다

혹시 문법적인 것 때문에 궁금한 것이라면..

const [ a, b ] = [ 0, 1 ]
console.log(a) // 0
console.log(b) // 1

let [ c, d ] = [ 33, 44 ]
console.log(c); // 33
console.log(d); // 44

// 이 상태에서 다시 c, d에다 새로운 값을 할당할 때는 괄호를 씌워줘야합니다.
([ c, d ] = [ 100, 200 ]);
console.log(c) // 100
console.log(d) // 200

image

원래 python에 있던 기능들인데 js에도 생겼달까..

이러한 문법을 구조분해할당(destructuring) 이라고 합니다!


특히 다음과 같은 상황에 굉장히 효과적입니다.

let a = 10, b = 20;
([ a, b ] = [ b, a]);
console.log(a, b)

image


비슷하게 Object 또한 구조분해할당이 가능합니다

const obj = { a: 10, b: 20, c: 30, d: 40 }
const { a, b } = obj
let { c, d } = obj

console.log(a, b) // 10, 20
console.log(c, d); // 30, 40

// 재 할당
({ c, d } = { c: 100, d: 200 });
console.log(c, d) // 100, 200

image

알아두면 굉장히 유용한 문법!