Skip to content

TapeEquilibrium ๋ฌธ์ œ ํ•ด๊ฒฐ (Codility) โ€‹

๋ฌธ์ œ ์„ค๋ช… โ€‹

๋ฐฐ์—ด A๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„ ๋‘ ๋ถ€๋ถ„์˜ ํ•ฉ์˜ ์ฐจ์ด(์ ˆ๋Œ€๊ฐ’)๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ โ€‹

typescript
A = [3, 1, 2, 4, 3]
๊ฒฐ๊ณผ: 1

ํ•ด๊ฒฐ ์ ‘๊ทผ ๋ฐฉ์‹ โ€‹

์ด ๋ฌธ์ œ๋Š” Prefix Sum (๋ˆ„์  ํ•ฉ) ์„ ํ™œ์šฉํ•˜์—ฌ O(N) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฐ์—ด์˜ ์ „์ฒด ํ•ฉ(totalSum) ๊ตฌํ•˜๊ธฐ

    • ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•ฉ์‚ฐํ•˜์—ฌ totalSum์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์™ผ์ชฝ ๋ถ€๋ถ„ ํ•ฉ(leftSum)๊ณผ ์ตœ์†Œ ์ฐจ์ด ๊ณ„์‚ฐ

    • ๋ฐฐ์—ด์„ ํ•œ ์š”์†Œ์”ฉ ์ˆœํšŒํ•˜๋ฉฐ leftSum์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.
    • ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ํ•ฉ์€ rightSum = totalSum - leftSum์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‘ ๋ถ€๋ถ„์˜ ์ฐจ์ด |leftSum - rightSum| ์„ ๊ตฌํ•˜์—ฌ ์ตœ์†Œ๊ฐ’์„ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ตœ์†Œ ์ฐจ์ด ๋ฐ˜ํ™˜

    • ์ตœ์†Œ ์ฐจ์ด๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์ตœ์†Œ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌํ˜„ โ€‹

typescript
function solution(A: number[]): number {
  let totalSum = A.reduce((acc, num) => acc + num, 0)
  let leftSum = 0
  let minDiff = Infinity

  for (let i = 0; i < A.length - 1; i++) {
    leftSum += A[i] // ์™ผ์ชฝ ๋ถ€๋ถ„ํ•ฉ ์ฆ๊ฐ€
    let rightSum = totalSum - leftSum // ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ํ•ฉ ๊ณ„์‚ฐ
    let diff = Math.abs(leftSum - rightSum) // ์ฐจ์ด ๊ณ„์‚ฐ
    minDiff = Math.min(minDiff, diff) // ์ตœ์†Œ ์ฐจ์ด ๊ฐฑ์‹ 
  }

  return minDiff
}

์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„ โ€‹

  • totalSum์„ ๊ตฌํ•˜๋Š”๋ฐ O(N)
  • for ๋ฃจํ”„์—์„œ O(N)
    โ†’ ์ด O(N)์œผ๋กœ ์ตœ์ ์˜ ํ•ด๊ฒฐ์ฑ… ๐Ÿš€

์˜ˆ์ œ ํ…Œ์ŠคํŠธ โ€‹

typescript
console.log(solution([3, 1, 2, 4, 3])) // ์ถœ๋ ฅ: 1
console.log(solution([-10, 10])) // ์ถœ๋ ฅ: 20
console.log(solution([1, 2, 3, 4, 5])) // ์ถœ๋ ฅ: 3

๊ฒฐ๋ก  โ€‹

  • ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ์ตœ์†Œ ์ฐจ์ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐ŸŽฏ
  • O(N)์œผ๋กœ ์ตœ์ ํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ Codility ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โœ