πŸ‘©‍πŸ’»/JavaScript

[Programmers] JavaScript, νƒμš•λ²•, 체윑볡 문제 (Destructuring Assignment/fill)

ν•œλ‚˜ 2021. 3. 1. 17:35

programmers.co.kr/learn/courses/

 

ν”„λ‘œκ·Έλž˜λ° κ°•μ˜

κΈ°μ΄ˆλΆ€ν„° μ°¨κ·Όμ°¨κ·Ό, 직접 μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λ³΄μ„Έμš”.

programmers.co.kr


νƒμš•λ²• μ•Œκ³ λ¦¬μ¦˜ κ°œμš”

νƒμš•λ²• μ•Œκ³ λ¦¬μ¦˜μ„ ν™œμš©ν•˜λŠ” 문제. νƒμš•λ²•(Greedy Algorithm)은 동적 ν”„λ‘œκ·Έλž˜λ°(λ˜λŠ” 동적 κ³„νšλ²•, Dynmaic Programming) μ‚¬μš© μ‹œ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ€ 일을 ν•œλ‹€λŠ” κ²ƒμ—μ„œ κ³ μ•ˆλœ μ•Œκ³ λ¦¬μ¦˜μ΄λΌκ³  ν•œλ‹€. 두 방법은 μ„œλ‘œ 차이점이 μ‘΄μž¬ν•˜λ©°, λ³΄μ™„ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν™œμš©μ΄ λœλ‹€κ³  ν•œλ‹€.

 

동적 κ³„νšλ²•μ€ 전체 문제λ₯Ό μ—¬λŸ¬ 개의 ν•˜μœ„ 문제둜 μͺΌκ°œμ–΄ ν’€κ³ , ν•˜μœ„ 문제의 ν•΄κ²° 방법을 κ²°ν•©ν•΄ μ΅œμ’… 문제λ₯Ό ν•΄κ²°ν•œλ‹€. ν”Όλ³΄λ‚˜μΉ˜μ˜ μˆ˜μ—΄μ΄ λŒ€ν‘œμ μΈ μ˜ˆμ΄λ‹€. 이런 ν”„λ‘œκ·Έλž˜λ° 방식은 νš¨μœ¨μ„ μœ„ν•΄ ν•¨μˆ˜ κ²°κ³Ό 값을 μ €μž₯ν•˜λ©° μ΅œμ’… 결과물을 μ°ΎλŠ”λ‹€. λ‚˜λ¦„ 계산 횟수λ₯Ό μ€„μ—¬λ‚˜κ°€λ―€λ‘œ, 졜μž₯ 곡톡 λΆ€λΆ„ μˆ˜μ—΄, λΆ€λΆ„μ§‘ν•©μ˜ ν•©, λ°°λ‚­ 문제 λ“±μ˜ μ•Œκ³ λ¦¬μ¦˜ 문제λ₯Ό ν’€ 수 μžˆλ‹€.

 

νƒμš•λ²•μ˜ λŒ€ν‘œμ μΈ μ˜ˆμ œλŠ” ν™œλ™ 선택 문제 (Activity Selection Problem)κ°€ μžˆλ‹€. ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ ν™œλ™λ§Œ ν•  수 μžˆλŠ” κ°•μ˜μ‹€μ—μ„œ μ œμ•ˆλœ ν™œλ™ 쀑 κ°€μž₯ λ§Žμ€ ν™œλ™μ„ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ‹œκ°„ν‘œλ₯Ό μ§œλŠ” λ¬Έμ œμ΄λ‹€. κ°€μž₯ λ¨Όμ € λλ‚˜λŠ” ν™œλ™μ„ νƒν•˜λ©΄, 결과적으둜 μ΅œλŒ€ν•œ λ§Žμ€ ν™œλ™μ„ μ‹œκ°„ν‘œμ— 넣을 수 μžˆλ‹€.

 

νƒμš•λ²•μ€ 문제 ν•΄κ²° κ³Όμ •μ—μ„œ κ·Έ μˆœκ°„ μˆœκ°„ 졜적의 μ„ νƒμ΄λΌλŠ”, 즉 κ°€μž₯ μ’‹μ•„λ³΄μ΄λŠ” 선택을 μ·¨ν•˜λ©° μ΅œμ’… 해닡에 λ„λ‹¬ν•œλ‹€. 즉, μ•žμœΌλ‘œμ˜ μ„ νƒμ΄λ‚˜ μ΅œμ’… κ²°κ³Όλ₯Ό κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ―€λ‘œ νƒμš•λ²•μœΌλ‘œ λ„μΆœλœ ν•΄κ°€ λ°˜λ“œμ‹œ 졜적의 ν•΄λΌλŠ” 보μž₯은 μ—†λ‹€. λŒ€μ‹  계산 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆλ‹€.

문제

μœ„ λ¬Έμ œλŠ” 전체 학생 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œ λ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ 주어진닀. 체윑볡이 μžˆμ–΄μ•Ό 체윑 μˆ˜μ—…μ„ λ“£λŠ”λ‹€ ν–ˆμ„ λ–„ 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” μ΅œλŒ€ 학생 수λ₯Ό ꡬ해야 ν•œλ‹€. μ΅œλŒ€ν•œ λ§Žμ€ 학생듀이 1벌 μ΄μƒμ˜ μ²΄μœ‘λ³΅μ„ 갖도둝 λΆ„λ°° ν•΄μ•Ό ν•œλ‹€.

μ½”λ“œ

풀이

μš°μ„  각 학생듀이 λͺ¨λ‘ 1벌의 μ²΄μœ‘λ³΅μ„ κ°–λŠ”λ‹€κ³  κ°€μ •ν•˜κ³ , λ„λ‚œ λ‹Ήν•œ 학생은 -1벌, μ—¬λ²Œμ΄ μžˆλŠ” κ²½μš°λŠ” +1벌둜 μ‘°μ •ν•΄μ£ΌκΈ°λ‘œ ν•œλ‹€. ES6에 μΆ”κ°€λœ 문법인 fill() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•œλ‹€. Array(n).fill(1)λŠ” n개의 μ›μ†Œλ₯Ό κ°€μ§€λŠ” 배열에 fill()의 인자둜 λ“€μ–΄μ˜¨ 1μ΄λΌλŠ” 숫자λ₯Ό 각 μ›μ†Œλ‘œ ν•΄μ€€λ‹€. indexOf()λ₯Ό 톡해 λ°°μ—΄ λ‚΄ ν•΄λ‹Ή 학생 λ²ˆν˜Έκ°€ μ‘΄μž¬ν•˜λ©΄, ν•™μƒλ“€μ˜ 체윑볡 κ°œμˆ˜κ°€ λ‹΄κΈ΄ 배열인 students의 μ›μ†Œλ₯Ό μ‘°μ •ν•œλ‹€.

 

두 번째 for문은 for ofλ₯Ό μ‚¬μš©ν•œλ‹€. 비ꡬ쑰화 ν• λ‹Ή(destructuring assignment)λ₯Ό μ‚¬μš©ν•œλ‹€. Array.prototype.entries()λŠ” λ°°μ—΄μ˜ 각 μΈλ±μŠ€μ— λŒ€ν•΄ Key/Value 쌍의 μƒˆλ‘œμš΄ Array Iterator 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. let [index, curr] of students.entries()둜 students λ°°μ—΄μ˜ μΈλ±μŠ€μ™€ value(note: curr라고 λ„€μ΄λ°ν•œ κ²ƒμ²˜λŸΌ, 이름은 λ¬΄κ΄€ν•˜λ‹€. index, value μˆœμ΄λ‹€.)λ₯Ό λ³€μˆ˜μ— μ„ μ–Έν•œλ‹€.

 

만일 ν˜„μž¬ κ°’(curr)이 0일 λ•Œ, λ‹€μŒ 번 ν•™μƒμ˜ 체윑볡 κ°œμˆ˜κ°€ 2벌 이상일 λ•Œ, students의 ν•΄λ‹Ή ν•™μƒλ“€μ˜ 체윑볡 개수λ₯Ό μ‘°μ •ν•΄μ€€λ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ ν˜„μž¬ κ°’κ³Ό 이전 값을 λΉ„κ΅ν•΄μ£ΌλŠ” λ‘œμ§μ„ ν•œ 번 μ‚¬μš©ν•œλ‹€.

이후 Array.filter ν•¨μˆ˜λ₯Ό 톡해 students λ°°μ—΄μ˜ μ›μ†Œκ°€ 1이상인 경우의 길이λ₯Ό ꡬ해 λ°˜ν™˜ν•œλ‹€.

μ°Έκ³