Algorithm

[Algorithm] 연속 νŽ„μŠ€ λΆ€λΆ„ μˆ˜μ—΄μ˜ ν•©

ghkdu2 2023. 3. 19. 15:53

πŸ“‹ 문제

μ–΄λ–€ μˆ˜μ—΄μ˜ μ—°μ† λΆ€λΆ„ μˆ˜μ—΄μ— κ°™μ€ κΈΈμ΄μ˜ νŽ„μŠ€ μˆ˜μ—΄μ„ κ° μ›μ†ŒλΌλ¦¬ κ³±ν•˜μ—¬ μ—°μ† νŽ„μŠ€ λΆ€λΆ„ μˆ˜μ—΄μ„ λ§Œλ“€λ € ν•©λ‹ˆλ‹€. νŽ„μŠ€ μˆ˜μ—΄μ΄λž€ [1, -1, 1, -1 …] λ˜λŠ” [-1, 1, -1, 1 …] κ³Ό κ°™μ΄ 1 λ˜λŠ” -1둜 μ‹œμž‘ν•˜λ©΄μ„œ 1κ³Ό -1이 λ²ˆκ°ˆμ•„ λ‚˜μ˜€λŠ” μˆ˜μ—΄μž…λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ μˆ˜μ—΄ [2, 3, -6, 1, 3, -1, 2, 4]의 μ—°μ† λΆ€λΆ„ μˆ˜μ—΄ [3, -6, 1]에 νŽ„μŠ€ μˆ˜μ—΄ [1, -1, 1]을 κ³±ν•˜λ©΄ μ—°μ† νŽ„μŠ€ λΆ€λΆ„μˆ˜μ—΄μ€ [3, 6, 1]이 λ©λ‹ˆλ‹€. λ˜ λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ μ—°μ† λΆ€λΆ„ μˆ˜μ—΄ [3, -1, 2, 4]에 νŽ„μŠ€ μˆ˜μ—΄ [-1, 1, -1, 1]을 κ³±ν•˜λ©΄ μ—°μ† νŽ„μŠ€ λΆ€λΆ„μˆ˜μ—΄μ€ [-3, -1, -2, 4]이 λ©λ‹ˆλ‹€.
μ •μˆ˜ μˆ˜μ—΄ sequenceκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ—°μ† νŽ„μŠ€ λΆ€λΆ„ μˆ˜μ—΄μ˜ ν•© μ€‘ κ°€μž₯ ν° κ²ƒμ„ return ν•˜λ„둝 solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œ 사항

  • 1 ≤ sequence의 κΈΈμ΄ ≤ 500,000
  • -100,000 ≤ sequence의 μ›μ†Œ ≤ 100,000
    • sequence의 μ›μ†ŒλŠ” μ •μˆ˜μž…λ‹ˆλ‹€.

 

μž…μΆœλ ₯ μ˜ˆ

[2, 3, -6, 1, 3, -1, 2, 4] 10



✏️ 풀이

처음 μ ‘κ·Ό 방법은 배열을 ν•˜λ‚˜ μ„ μ–Έν•˜κ³  μΈμ ‘ν•œ λ‘μˆ˜λ₯Ό λ”ν•΄μ„œ μ„ μ–Έν–ˆλ˜ 배열에 λ„£μœΌλ©° λ°°μ—΄μ˜ 길이가 1μΌλ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λŠ” λ‘œμ§μ„ μƒκ°ν–ˆλ‹€. ν•˜μ§€λ§Œ μƒκ°ν•΄λ³΄λ‹ˆ [1, 2, 3]μ΄λΌλŠ” 배열이 μžˆλŠ” 경우 [1, 2, 3] -> [3, 5] -> [8] μ΄λ ‡κ²Œ 진행이 될텐데 μ€‘λ³΅μœΌλ‘œ μˆ˜κ°€ 더해지기 λ•Œλ¬Έμ— μ™„μ „νžˆ 잘λͺ»λœ μƒκ°μž„μ„ κΉ¨λ‹¬μ•˜λ‹€.

 

λ‹€μ‹œ μƒκ°ν•œ 방법은 λˆ„μ ν•©μ„ μ΄μš©ν•˜λŠ” λ°©λ²•μ΄μ—ˆλ‹€. 5번재 μˆ˜κΉŒμ§€ 더해진 κ°’μ—μ„œ 2번째 μˆ˜κΉŒμ§€ 더해진 값을 λΉΌλ©΄ 3λ²ˆμ§ΈλΆ€ν„° 5λ²ˆμ§ΈκΉŒμ§€ λ”ν•œ 값을 ꡬ할 수 μžˆλ‹€λŠ” μƒκ°μ—μ„œ μ‹œμž‘ν–ˆλ‹€.

 

μš°μ„  νŽ„μŠ€ μˆ˜μ—΄[1, -1, 1, -1 ...]을 배열에 곱해쀬닀. μ—¬κΈ°μ„œ μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν–ˆλ˜ 점은 1둜 μ‹œμž‘ν•˜λŠ” νŽ„μŠ€ μˆ˜μ—΄μ΄ κ³±ν•΄μ§€λ˜ μ•„λ‹ˆλ©΄ -1둜 μ‹œμž‘ν•˜λŠ” μˆ˜μ—΄μ΄ κ³±ν•΄μ§€λ˜μ§€ 상관이 μ—†λ‹€λŠ” 점이닀. 닡을 λ„μΆœν–ˆμ„ λ•Œ μ΅œλŒ€κ°’μ΄λ‚˜ μ΅œμ†Œκ°’μ„ λ‘˜λ‹€ κ΅¬ν•΄μ„œ μ–‘μˆ˜λ‘œ λ§Œλ“€μ–΄ μ€€ λ‹€μŒ λΉ„κ΅ν•˜λ©΄ λœλ‹€. μ™œλƒν•˜λ©΄ μ΅œμ†Œκ°’μ΄ 닡이 λ˜λŠ” 경우 음수인 κ²½μš°μΌν…λ° 이 경우 νŽ„μŠ€μˆ˜μ—΄μ˜ μ‹œμž‘μ„ λ°˜λŒ€(1 λ˜λŠ” -1)둜 ν–ˆμ„ λ•Œ μ΅œλŒ€κ°’μ΄ 닡이 λ˜λŠ” 경우이기 λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ sequence 배열을 μˆœνšŒν•˜λ©΄μ„œ 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ 짝수일 λ•Œ λ˜λŠ” ν™€μˆ˜μΌ λ•Œλ₯Ό κ΅¬λΆ„ν•˜μ—¬ 음수둜 λ³€ν™˜ν•΄μ€¬λ‹€.

 

λˆ„μ ν•©μ„ μƒˆλ‘œμš΄ 배열에 λ„£κ³  좜λ ₯ν•΄λ³΄λ‹ˆ 문제의 μ˜ˆμ‹œλ‘œλŠ” [-2, 1, 7, 8, 5, 4, 2, 6] λΌλŠ” 값이 λ‚˜μ™”λ‹€. 이λ₯Ό 보고 λ“  생각이 κ·Έλƒ₯ κ΅¬ν•œ λˆ„μ ν•© λ°°μ—΄μ—μ„œ μ΅œλŒ€κ°’μ—μ„œ μ΅œμ†Œκ°’μ„ λΉΌλ©΄ 항상 κ°€μž₯ μ΅œλŒ€κ°€ λ˜λŠ” μˆ˜κ°€ λ‚˜μ˜€μ§€ μ•Šμ„κΉŒ?λΌλŠ” 생각이 λ“€μ—ˆλ‹€. 문제의 μ˜ˆμ‹œλ₯Ό 예둜 4번째 κ°’κΉŒμ§€ λ”ν•œ κ°’ 8이 μ΅œλŒ€μ΄κ³ , 1λ²ˆμ§ΈκΉŒμ§€ λ”ν•œ -2κ°€ μ΅œμ†Œκ°’μ΄λ‹€. μ΅œλŒ€κ°’ - μ΅œμ†Œκ°’ (8 - -2)λ₯Ό ν•˜λ©΄ 10이 λ‚˜μ˜€λŠ”λ° μ΄λ•Œ 2λ²ˆμ§ΈλΆ€ν„° 4번째 κ°’κΉŒμ§€ λ”ν•œ 값이 λ‚˜μ˜€κ²Œ 되기 λ•Œλ¬Έμ΄λ‹€.

 

μ΅œμ†Œκ°’κ³Ό μ΅œλŒ€κ°’μ„ κ΅¬ν•˜κ³  닡을 κ΅¬ν–ˆλŠ”λ° 경우의 μˆ˜κ°€ 3κ°€μ§€ μžˆμ—ˆλ‹€.

  1. λ‘˜ λ‹€ 음수인 경우: λͺ¨λ‘ 음수인 경우둜 μ΅œμ†Œκ°’μ„ μ‚¬μš©ν•΄μ„œ 닡을 κ΅¬ν•œλ‹€.
  2. λ‘˜ λ‹€ μ–‘μˆ˜μΈ 경우: λͺ¨λ‘ μ–‘μˆ˜μΈ 경우둜 μ΅œλŒ€κ°’μ„ μ‚¬μš©ν•΄μ„œ 닡을 κ΅¬ν•œλ‹€.
  3. λΆ€ν˜Έκ°€ μ„œλ‘œ λ‹€λ₯Έ 경우: 음수 μ–‘μˆ˜κ°€ μ„žμ—¬μžˆλŠ” 경우둜 μ΅œλŒ€κ°’κ³Ό μ΅œμ†Œκ°’μ„ μ‚¬μš©ν•˜μ—¬ 닡을 κ΅¬ν•œλ‹€.

1번째 경우일 λ•Œ μ΅œμ†Œκ°’μ˜ λΆ€ν˜Έλ₯Ό λ°”κΏ”μ„œ answer에 ν• λ‹Ή, 2번째 경우일 λ•Œ  μ΅œλŒ€κ°’μ„ ν• λ‹Ή, λ§ˆμ§€λ§‰ 3번째 경우일 λ•Œ μ–‘μˆ˜λ‘œ λ³€ν™˜ν•˜κ³  더해쀬닀.

 

⌨️ μ½”λ“œ

function solution(sequence) {
  var answer = 0;

  let sum = 0;
  let max = -Infinity;
  let min = Infinity;
  for (let i = 0; i < sequence.length; i++) {
    const s = i % 2 ? sequence[i] : -sequence[i];
    sum += s;

    if (max < sum) max = sum;
    if (min > sum) min = sum;
  }

  if (max > 0 && min > 0) answer = max;
  else if (max < 0 && min < 0) answer = -min;
  else answer = Math.abs(max) + Math.abs(min);

  return answer;
}