πŸ§‘πŸ»‍πŸ’» μ•Œκ³ λ¦¬μ¦˜/μ •λ ¬

[μ •λ ¬] 8. ν•œ 살도 μ΄ν•΄ν•˜λŠ” κ³„μˆ˜ μ •λ ¬(Counting Sort)

10000COW 2022. 11. 30. 16:57
728x90

κ³„μˆ˜ μ •λ ¬

: 주어진 λ°°μ—΄μ˜ κ°’μ˜ λ²”μœ„κ°€ μž‘μ€ 경우 λΉ λ₯Έ 속도λ₯Ό κ°–λŠ” μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

  μ΅œλŒ“κ°’κ³Ό μž…λ ₯ λ°°μ—΄μ˜ μ›μ†Œ κ°’ 개수λ₯Ό λˆ„μ ν•©μœΌλ‘œ κ΅¬μ„±ν•œ λ°°μ—΄λ‘œ 정렬을 μˆ˜ν–‰ν•œλ‹€.

 

μš°μ„ , μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ 

nums = [5, 9, 3, 6, 9, 5, 2, 10, 1] μ΄λΌλŠ” 배열이 μž…λ ₯λ˜μ—ˆκ³ , 이 nums 배열을 μ •λ ¬ν•œλ‹€κ³  ν•΄λ³΄μž.

 

μΉ΄μš΄νŒ… μ •λ ¬μ˜ 단계

0. μ •λ ¬ν•  nums λ°°μ—΄ μž…λ ₯

 

1. count λ°°μ—΄ 생성

- μž…λ ₯된 nums λ°°μ—΄μ˜ μ΅œλŒ“κ°’μ„ 길이둜 κ°–λŠ” count 배열을 μƒμ„±ν•œλ‹€.

- 각 μ›μ†Œκ°€ nums 배열에 λͺ‡ 번 λ‚˜μ˜€λŠ”μ§€ 횟수λ₯Ό count 배열에 κΈ°λ‘ν•œλ‹€.

2. μ΄μ „κΉŒμ§€μ˜ λˆ„μ κ°œμˆ˜λ₯Ό κΈ°λ‘ν•˜λŠ” λ°°μ—΄ 생성(cumCount λ°°μ—΄)

- count λ°°μ—΄μ—μ„œ 각 μ›μ†Œκ°€ λͺ‡ κ°œμ”© λ‚˜μ˜€λŠ”μ§€ μ•Œ 수 μžˆμœΌλ―€λ‘œ,

- 이λ₯Ό μ΄μš©ν•΄ μ§€κΈˆκΉŒμ§€ λͺ‡κ°œμ˜ μ›μ†Œκ°€ μ•žμ— λ‚˜μ™”λŠ”μ§€λ₯Ό κΈ°λ‘ν•˜λŠ” λˆ„μ κ°œμˆ˜ 배열을 μƒμ„±ν•œλ‹€.

3. nums λ°°μ—΄μ—μ„œ 첫번째 μ›μ†ŒλΆ€ν„° cumCount 배열에 κΈ°λ‘λ˜μ–΄ μžˆλŠ” 값에 따라 인덱슀 μœ„μΉ˜λ₯Ό μ •ν•˜λ©΄ 끝!

 

μ‹œκ°„ λ³΅μž‘λ„

:

λ§Œμ•½ μ΅œλŒ€κ°’μ΄ 주어지지 μ•Šμ€ 경우, 전체 배열을 탐색해야 ν•˜λ―€λ‘œ O(n) μ†Œμš”,

Count λ°°μ—΄ μƒμ„±ν•˜λ©΄μ„œ 갯수λ₯Ό μ„ΈλŠ” κ³Όμ • O(n) μ†Œμš”,

λˆ„μ  배열을 μƒμ„±ν•˜λ©΄μ„œ λˆ„μ  갯수λ₯Ό μ„ΈλŠ” κ³Όμ • O(n) μ†Œμš”

λ§ˆμ§€λ§‰μœΌλ‘œ answer에 배열에 값을 μž…λ ₯ν•˜λŠ” κ³Όμ • O(n) μ†Œμš”

 

λ”°λΌμ„œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n)이 λœλ‹€.

ν•˜μ§€λ§Œ, λ°°μ—΄μ˜ κΈΈμ΄μ™€λŠ” λ…λ¦½μ μœΌλ‘œ λ°°μ—΄μ˜ μ΅œλŒ“κ°’μ„ M이라고 ν•œλ‹€λ©΄, μ •λ ¬ μ‹œκ°„μ€ M을 λ”°λΌκ°€κ²Œ 될 것이닀.

λ”°λΌμ„œ O(n + M) 이라고 λ³΄λŠ” 것이 μ •ν™•ν•΄ 보인닀.

 

κ³Όμ •μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ΅œλŒ“κ°’μ΄ μž‘μœΌλ©΄ μž‘μ„μˆ˜λ‘ 정렬에 μœ λ¦¬ν•˜λ‹€.

728x90