λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm

[Algorithm] μŠ€νƒ€ μˆ˜μ—΄

πŸ“‹ 문제

λ‹€μŒκ³Ό 같은 것듀을 μ •μ˜ν•©λ‹ˆλ‹€.

  • μ–΄λ–€ μˆ˜μ—΄ x의 λΆ€λΆ„ μˆ˜μ—΄(Subsequence)μ΄λž€, x의 λͺ‡λͺ‡ μ›μ†Œλ“€μ„ μ œκ±°ν•˜κ±°λ‚˜ κ·ΈλŸ¬μ§€ μ•Šκ³  남은 μ›μ†Œλ“€μ΄ μ›λž˜ μˆœμ„œλ₯Ό μœ μ§€ν•˜μ—¬ 얻을 수 μžˆλŠ” μƒˆλ‘œμš΄ μˆ˜μ—΄μ„ λ§ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, [1,3]은 [1,2,3,4,5]의 λΆ€λΆ„μˆ˜μ—΄μž…λ‹ˆλ‹€. μ›λž˜ μˆ˜μ—΄μ—μ„œ 2, 4, 5λ₯Ό μ œκ±°ν•΄μ„œ μ–»μ„ μˆ˜ μžˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • λ‹€μŒκ³Ό 같은 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ” μˆ˜μ—΄ xλ₯Ό μŠ€νƒ€ μˆ˜μ—΄μ΄λΌκ³  μ •μ˜ν•©λ‹ˆλ‹€.
    • x의 κΈΈμ΄κ°€ 2 μ΄μƒμ˜ μ§μˆ˜μž…λ‹ˆλ‹€. (빈 μˆ˜μ—΄μ€ ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
    • x의 κΈΈμ΄λ₯Ό 2n이라 ν•  λ•Œ, λ‹€μŒκ³Ό κ°™μ€ n개의 μ§‘ν•© {x[0], x[1]}, {x[2], x[3]}, ..., {x[2n-2], x[2n-1]} μ˜ κ΅μ§‘ν•©μ˜ μ›μ†Œμ˜ κ°œμˆ˜κ°€ 1 μ΄μƒμž…λ‹ˆλ‹€.
    • x[0] != x[1], x[2] != x[3], ..., x[2n-2] != x[2n-1] μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, [1,2,1,3,4,1,1,3]은 μŠ€νƒ€ μˆ˜μ—΄μž…λ‹ˆλ‹€. {1,2}, {1,3}, {4,1}, {1,3} μ˜ κ΅μ§‘합은 {1} μ΄κ³ , κ° μ§‘ν•© λ‚΄μ˜ μˆ«μžλ“€μ΄ μ„œλ‘œ λ‹€λ₯΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

1차원 μ •μˆ˜ λ°°μ—΄ aκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. a의 λͺ¨λ“  λΆ€λΆ„ μˆ˜μ—΄ μ€‘μ—μ„œ κ°€μž₯ κΈΈμ΄κ°€ κΈ΄ μŠ€νƒ€ μˆ˜μ—΄μ˜ κΈΈμ΄λ₯Ό return ν•˜λ„둝 solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. μ΄λ•Œ, a의 λͺ¨λ“  λΆ€λΆ„ μˆ˜μ—΄ μ€‘μ—μ„œ μŠ€νƒ€ μˆ˜μ—΄μ΄ μ—†λ‹€λ©΄, 0을 return ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • a의 κΈΈμ΄λŠ” 1 μ΄μƒ 500,000 μ΄ν•˜μž…λ‹ˆλ‹€.
    • a의 λͺ¨λ“  μˆ˜λŠ” 0 μ΄μƒ (a의 κΈΈμ΄) λ―Έλ§Œμž…λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆ

[0] 0
[5,2,3,3,5,3] 4
[0,3,3,0,7,2,0,2,2,0] 8

 

✏️ 풀이

λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό μ°Έκ³ ν–ˆλ‹€. λ³΄λ©΄μ„œ 깨달은 사싀인데 λ‚΄κ°€ 문제λ₯Ό 잘λͺ» μ΄ν•΄ν–ˆμŒμ„ μ•Œκ²Œ λ˜μ—ˆλ‹€. 문제의 μ§€λ¬Έ 쀑에 각 μ§‘ν•© λ‚΄μ˜ μˆ«μžλ“€μ΄ μ„œλ‘œ 달라야 ν•œλ‹€λŠ” 것을 λ§Œμ•½ {1, 2}, {1, 2}둜 각 μ§‘ν•©μ˜ λ‹€λ₯Έ μˆ«μžλ“€μ΄ κ°™μœΌλ©΄ μ•ˆλœλ‹€κ³  μ΄ν•΄ν–ˆμ—ˆλ‹€...

 

a의 길이가 500,000이기 λ•Œλ¬Έμ— λͺ¨λ“  경우λ₯Ό νƒμƒ‰ν•˜λŠ” 것은 λ‹Ήμ—°νžˆ μ•ˆλ  것이라고 μƒκ°μ—ˆν–ˆλ‹€. 풀이λ₯Ό λ³΄κ³ μ„œ 깨달은 점이 κ°€μž₯ κ°€λŠ₯성이 큰 μˆ«μžλΆ€ν„° νƒμƒ‰ν•˜λ©΄ 효과적으둜 경우의 수λ₯Ό 쀄일 수 μžˆλ‹€λŠ” μ μ΄μ—ˆλ‹€. λ”°λΌμ„œ a μˆ˜μ—΄μ—μ„œ κ°€μž₯ 많이 λ‚˜μ˜¨ μˆ«μžλΆ€ν„° νƒμƒ‰ν•œλ‹€. λ§Œμ•½ (1, 3, 3, 2, 3, 2, 2, 2, 2, 2, 2, 2) 이런 경우 2κ°€ 제일 많이 λ“±μž₯ν•˜μ§€λ§Œ 닡은  {1, 3}, {3, 2}, {3, 2}으둜 6이 λœλ‹€. ν•˜μ§€λ§Œ 2λ₯Ό ν•œλ²ˆ νƒμƒ‰ν•˜κ³  λ‹€μŒμœΌλ‘œ 많이 λ“±μž₯ν•˜λŠ” 3을 κΈ°μ€€μœΌλ‘œ νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ— 경우의 μˆ˜κ°€ 쀄어든닀. μ΄λŠ” μˆ˜μ—΄μ˜ 길이가 길수둝 효과적일 것이라고 μƒκ°ν•œλ‹€. λ”°λΌμ„œ 배열을 돌며 Map에 μ €μž₯ν–ˆλ‹€. (Map을 μ‚¬μš©ν•œ μ΄μœ λŠ” 졜근 문제λ₯Ό ν’€λ©΄μ„œ μ‚½μž…, μ‚­μ œκ°€ 많이 λ“±μž₯ν• μˆ˜λ‘ 객체({})λ³΄λ‹€λŠ” Map이 더 큰 νš¨μœ¨μ„±μ„ λ³΄μž„μ„ μ•Œκ²Œ λ˜μ—ˆκΈ° λ•Œλ¬Έ!) 그리고 λ°°μ—΄λ‘œ λ³€ν™˜ 후에 λ“±μž₯ν•œ 횟수λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν–ˆλ‹€.

 

이제 이 μ •λ ¬λœ 배열을 반볡문으둜 돌며 μˆ˜νƒ€μˆ˜μ—΄μ˜ 기쀀이 λ˜λŠ” 수λ₯Ό λ°”κΏ”μ£Όλ©° νƒμƒ‰ν•œλ‹€. a 배열을 μ²˜μŒλΆ€ν„° λκΉŒμ§€ λŒλ©΄μ„œ 두 개의 μš”μ†Œλ₯Ό λΉ„κ΅ν•˜λ©° 기쀀에 λΆ€ν•©ν• λ•Œ μˆ˜μ—΄μ˜ 길이에 2λ₯Ό 더해쀀닀.

 

  • ν•˜λ‚˜μ˜ μˆ˜λŠ” μŠ€νƒ€μˆ˜μ—΄μ˜ 기쀀이 λ˜λŠ” μˆ˜μ΄μ—¬μ•Ό ν•œλ‹€.
  • μΈμ ‘ν•œ 두 μˆ˜κ°€ λ™μΌν•˜λ©΄ μ•ˆλœλ‹€.

이에 λΆ€ν•©ν•˜λ©΄ μŠ€νƒ€μˆ˜μ—΄μ˜ 길이λ₯Ό μ˜λ―Έν•˜λŠ” starCntλ₯Ό 2 μ¦κ°€μ‹œμΌœμ€¬λ‹€. 그리고 ν•΄λ‹Ή μΈλ±μŠ€κΉŒμ§€ μŠ€νƒ€μˆ˜μ—΄μ˜ μš”μ†Œλ‘œ λΉ μ§€λ―€λ‘œ μΆ”κ°€μ μœΌλ‘œ 1의 인덱슀λ₯Ό μ¦κ°€μ‹œμΌœμ€¬λ‹€.

 

 λ§Œμ•½ ν˜„μž¬μ˜ answer보닀 ν˜„μž¬ μŠ€νƒ€μˆ˜μ—΄μ˜ 기쀀이 λ˜λŠ” 수의 λ“±μž₯ 회수 * 2κ°€ 적닀면 μ ˆλŒ€ μ΅œλŒ€κ°’ 갱신을 ν•  수 μ—†μœΌλ―€λ‘œ λ°˜λ³΅λ¬Έμ„ μ’…λ£Œν•œλ‹€.

 

λͺ‡κ°€μ§€ 경우의 μ˜ˆμ‹œλ₯Ό λ“€μ–΄ μ„€λͺ…ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  1. (1, 2, 2, 2, 4, 4)의 경우 (맨 처음 2λ₯Ό κΈ°μ€€)
    • 맨 μ²˜μŒμ— 1, 2λ₯Ό 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 있음(2κΉŒμ§€λŠ” 비ꡐ할 수 μ—†μœΌλ―€λ‘œ 인덱슀λ₯Ό μΆ”κ°€μ μœΌλ‘œ 1증가)
    • 2, 2 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 μ—†μŒ 패슀
    • 2, 4 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 있음
    • {1, 2}, {2, 4}둜 닡은 4
  2. (1, 2, 1, 3, 4, 4, 4, 4, 4)의 경우 (맨 처음 4λ₯Ό κΈ°μ€€)
    • 1, 2 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ λ˜λŠ” κΈ°μ€€ 수(4)κ°€ μ—†μœΌλ―€λ‘œ 패슀(μ΄ν›„λ‘œλ„ μ­‰ 패슀)
    • 3, 4 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 있음
    • 4, 4 비ꡐ -> 값이 κ°™μœΌλ―€λ‘œ μŠ€νƒ€μˆ˜μ—΄μ΄ 될수 μ—†μŒ(μ΄ν›„λ‘œλ„ λ§ˆμ°¬κ°€μ§€)
    • {3, 4}둜 μŠ€νƒ€μˆ˜μ—΄ ꡬ성
    • λ‹€μŒμœΌλ‘œ λ§Žμ€ 수 1을 κΈ°μ€€μœΌλ‘œ λ‹€μ‹œ 반볡(ν˜„μž¬ answer = 2, 1의 개수 2)
    • 1, 2비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 있음
    • 1, 3 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 있음
    • 4, 4 비ꡐ -> μŠ€νƒ€μˆ˜μ—΄μ΄ 될 수 μ—†μŒ 패슀(이후 λ§ˆμ°¬κ°€μ§€)
    • {1, 2}, {1, 3}으둜 닡은 4

 

⌨️ μ½”λ“œ

function solution(a) {
  var answer = -1;

  const hash = new Map();
  for (const num of a) {
    hash.set(num, (hash.get(num) || 0) + 1);
  }

  const hashArr = [...hash.entries()].sort((a, b) => b[1] - a[1]);

  for (const [num, cnt] of hashArr) {
    if (answer > cnt * 2) break;

    let starCnt = 0;
    for (let i = 1; i < a.length; i++) {
      if (a[i - 1] === a[i]) continue;
      if (a[i - 1] !== num && a[i] !== num) continue;

      starCnt += 2;
      i += 1;
    }
    answer = Math.max(answer, starCnt);
  }

  return answer;
}