λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/γ„΄ problems

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 2021 Dev-Matching μ›Ή λ°±μ—”λ“œ 개발자(μƒλ°˜κΈ°) : 닀단계 칫솔 판맀

by vodkassi 2021. 10. 12.
728x90

πŸ“ 문제 μ„€λͺ…

 

λ―Όν˜ΈλŠ” 닀단계 쑰직을 μ΄μš©ν•˜μ—¬ 칫솔을 νŒλ§€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. νŒλ§€μ›μ΄ 칫솔을 νŒλ§€ν•˜λ©΄ κ·Έ 이읡이 ν”ΌλΌλ―Έλ“œ 쑰직을 타고 μ‘°κΈˆμ”© λΆ„λ°°λ˜λŠ” ν˜•νƒœμ˜ νŒλ§€λ§μž…λ‹ˆλ‹€. μ–΄λŠμ •λ„ νŒλ§€κ°€ 이루어진 ν›„, 쑰직을 μš΄μ˜ν•˜λ˜ λ―Όν˜ΈλŠ” 쑰직 λ‚΄ λˆ„κ°€ μ–Όλ§ˆλ§ŒνΌμ˜ 이득을 κ°€μ Έκ°”λŠ”μ§€κ°€ κΆκΈˆν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ―Όν˜Έκ°€ μš΄μ˜ν•˜κ³  μžˆλŠ” 닀단계 칫솔 판맀 쑰직이 μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™λ‹€κ³  ν•©μ‹œλ‹€.

λ―Όν˜ΈλŠ” center이며, νŒŒλž€μƒ‰ λ„€λͺ¨λŠ” μ—¬λŸ λͺ…μ˜ νŒλ§€μ›μ„ ν‘œμ‹œν•œ κ²ƒμž…λ‹ˆλ‹€. 각각은 μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμ— μ—°κ²°λ˜μ–΄ ν”ΌλΌλ―Έλ“œ μ‹μ˜ ꡬ쑰λ₯Ό 이루고 μžˆμŠ΅λ‹ˆλ‹€. 쑰직의 이읡 λΆ„λ°° κ·œμΉ™μ€ κ°„λ‹¨ν•©λ‹ˆλ‹€. λͺ¨λ“  νŒλ§€μ›μ€ μΉ«μ†”μ˜ νŒλ§€μ— μ˜ν•˜μ—¬ λ°œμƒν•˜λŠ” μ΄μ΅μ—μ„œ 10% λ₯Ό κ³„μ‚°ν•˜μ—¬ μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμ—κ²Œ λ°°λΆ„ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μžμ‹ μ΄ κ°€μ§‘λ‹ˆλ‹€. λͺ¨λ“  νŒλ§€μ›μ€ μžμ‹ μ΄ 칫솔 νŒλ§€μ—μ„œ λ°œμƒν•œ 이읡 뿐만 μ•„λ‹ˆλΌ, μžμ‹ μ΄ 쑰직에 μΆ”μ²œν•˜μ—¬ κ°€μž…μ‹œν‚¨ νŒλ§€μ›μ—κ²Œμ„œ λ°œμƒν•˜λŠ” 이읡의 10% κΉŒμ§€ μžμ‹ μ— 이읡이 λ©λ‹ˆλ‹€. μžμ‹ μ—κ²Œ λ°œμƒν•˜λŠ” 이읡 λ˜ν•œ λ§ˆμ°¬κ°€μ§€μ˜ κ·œμΉ™μœΌλ‘œ μžμ‹ μ˜ μΆ”μ²œμΈμ—κ²Œ λΆ„λ°°λ©λ‹ˆλ‹€. 단, 10% λ₯Ό 계산할 λ•Œμ—λŠ” 원 λ‹¨μœ„μ—μ„œ μ ˆμ‚¬ν•˜λ©°, 10%λ₯Ό κ³„μ‚°ν•œ κΈˆμ•‘μ΄ 1 원 미만인 κ²½μš°μ—λŠ” 이득을 λΆ„λ°°ν•˜μ§€ μ•Šκ³  μžμ‹ μ΄ λͺ¨λ‘ κ°€μ§‘λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, μ•„λž˜μ™€ 같은 판맀 기둝이 μžˆλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€. μΉ«μ†”μ˜ νŒλ§€μ—μ„œ λ°œμƒν•˜λŠ” 이읡은 κ°œλ‹Ή 100 μ›μœΌλ‘œ μ •ν•΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

νŒλ§€μ› μˆ˜λŸ‰ 이읡금
young 12 1,200 원
john 4 400 원
tod 2 200 원
emily 5 500 원
mary 10 1,000 원

νŒλ§€μ› young 에 μ˜ν•˜μ—¬ 1,200 μ›μ˜ 이읡이 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. young 은 이 쀑 10% 에 ν•΄λ‹Ήν•˜λŠ” 120 원을, μžμ‹ μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μΆ”μ²œμΈμΈ edward μ—κ²Œ λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 1,080 원을 κ°€μ§‘λ‹ˆλ‹€. edward λŠ” young μ—κ²Œμ„œ 받은 120 원 쀑 10% 인 12 원을 mary μ—κ²Œ λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 108 원을 κ°€μ§‘λ‹ˆλ‹€. 12 원을 edward λ‘œλΆ€ν„° 받은 mary λŠ” 10% 인 1 원을 센터에 (즉, λ―Όν˜Έμ—κ²Œ) λ°°λΆ„ν•˜κ³  μžμ‹ μ€ λ‚˜λ¨Έμ§€μΈ 11 원을 κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

κ·Έ ν›„, νŒλ§€μ› john 에 μ˜ν•˜μ—¬ 400 μ›μ˜ 이읡이 λ°œμƒν•©λ‹ˆλ‹€. john 은 10% 인 40 원을 센터에 λ°°λΆ„ν•˜κ³  μžμ‹ μ΄ λ‚˜λ¨Έμ§€μΈ 360 원을 κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

또 κ·Έ ν›„μ—λŠ” νŒλ§€μ› tod 에 μ˜ν•˜μ—¬ 200 원 이읡이 λ°œμƒν•˜λŠ”λ°, tod μžμ‹ μ΄ 180 원을, μΆ”μ²œμΈμΈ jaimie κ°€ κ·Έ 쀑 10% 인 20 원을 λ°›μ•„μ„œ 18 원을 가지고, jaimie 의 μΆ”μ²œμΈμΈ mary λŠ” 2 원을 λ°›μ§€λ§Œ μ΄κ²ƒμ˜ 10% λŠ” 원 λ‹¨μœ„μ—μ„œ μ ˆμ‚¬ν•˜λ©΄ λ°°λΆ„ν•  κΈˆμ•‘μ΄ μ—†κΈ° λ•Œλ¬Έμ— mary λŠ” 2 원을 λͺ¨λ‘ κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

κ·Έ λ‹€μŒμœΌλ‘œ emily κ°€ 칫솔 판맀λ₯Ό ν†΅ν•˜μ—¬ 얻은 이읡 500 원은 λ§ˆμ°¬κ°€μ§€μ˜ κ·œμΉ™μ— 따라 emily μ—κ²Œ 450 원, mary μ—κ²Œ 45 원, 그리고 센터에 5 μ›μœΌλ‘œ λΆ„λ°°λ©λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ, νŒλ§€μ› mary λŠ” 1,000 μ›μ˜ 이읡을 λ‹¬μ„±ν•˜κ³ , 이 쀑 10% 인 100 원을 센터에 λ°°λΆ„ν•œ ν›„ κ·Έ λ‚˜λ¨Έμ§€μΈ 900 원을 μžμ‹ μ΄ κ°€μ§‘λ‹ˆλ‹€. 이 μƒνƒœλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

μœ„μ™€ 같이 ν•˜μ—¬ λͺ¨λ“  쑰직 κ΅¬μ„±μ›λ“€μ˜ 이읡 달성 ν˜„ν™© 집계가 λλ‚¬μŠ΅λ‹ˆλ‹€. μ§€κΈˆκΉŒμ§€ 얻은 이읡을 λͺ¨λ‘ ν•©ν•œ κ²°κ³Όλ₯Ό 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

이 κ²°κ³Όκ°€ λ―Όν˜Έκ°€ νŒŒμ•…ν•˜κ³ μž ν•˜λŠ” 이읡 λ°°λΆ„ ν˜„ν™©μž…λ‹ˆλ‹€.

 

각 νŒλ§€μ›μ˜ 이름을 담은 λ°°μ—΄ enroll, 각 νŒλ§€μ›μ„ 닀단계 쑰직에 μ°Έμ—¬μ‹œν‚¨ λ‹€λ₯Έ νŒλ§€μ›μ˜ 이름을 담은 λ°°μ—΄ referral, νŒλ§€λŸ‰ 집계 λ°μ΄ν„°μ˜ νŒλ§€μ› 이름을 λ‚˜μ—΄ν•œ λ°°μ—΄ seller, νŒλ§€λŸ‰ 집계 λ°μ΄ν„°μ˜ 판맀 μˆ˜λŸ‰μ„ λ‚˜μ—΄ν•œ λ°°μ—΄ amountκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 각 νŒλ§€μ›μ΄ λ“ν•œ μ΄μ΅κΈˆμ„ λ‚˜μ—΄ν•œ 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. νŒλ§€μ›μ—κ²Œ λ°°λΆ„λœ 이읡금의 총합을 κ³„μ‚°ν•˜μ—¬(μ •μˆ˜ν˜•μœΌλ‘œ), μž…λ ₯으둜 주어진 enroll에 이름이 ν¬ν•¨λœ μˆœμ„œμ— 따라 λ‚˜μ—΄ν•˜λ©΄ λ©λ‹ˆλ‹€.

 


πŸ“ μ œν•œ 사항

 

enroll의 κΈΈμ΄λŠ” 1 이상 10,000 μ΄ν•˜μž…λ‹ˆλ‹€.

- enroll에 민호의 이름은 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ enroll의 κΈΈμ΄λŠ” 민호λ₯Ό μ œμ™Έν•œ 쑰직 κ΅¬μ„±μ›μ˜ 총 μˆ˜μž…λ‹ˆλ‹€.

 

referral의 κΈΈμ΄λŠ” enroll의 길이와 κ°™μŠ΅λ‹ˆλ‹€.

- referral λ‚΄μ—μ„œ i λ²ˆμ§Έμ— μžˆλŠ” 이름은 λ°°μ—΄ enroll λ‚΄μ—μ„œ i λ²ˆμ§Έμ— μžˆλŠ” νŒλ§€μ›μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μ‚¬λžŒμ˜ μ΄λ¦„μž…λ‹ˆλ‹€.

- μ–΄λŠ λˆ„κ΅¬μ˜ μΆ”μ²œλ„ 없이 쑰직에 μ°Έμ—¬ν•œ μ‚¬λžŒμ— λŒ€ν•΄μ„œλŠ” referral λ°°μ—΄ 내에 μΆ”μ²œμΈμ˜ 이름이 κΈ°μž…λ˜μ§€ μ•Šκ³  “-“ κ°€ κΈ°μž…λ©λ‹ˆλ‹€. μœ„ μ˜ˆμ œμ—μ„œλŠ” john κ³Ό mary κ°€ μ΄λŸ¬ν•œ μ˜ˆμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€.

- enroll 에 λ“±μž₯ν•˜λŠ” 이름은 쑰직에 μ°Έμ—¬ν•œ μˆœμ„œμ— λ”°λ¦…λ‹ˆλ‹€.

- 즉, μ–΄λŠ νŒλ§€μ›μ˜ 이름이 enroll 의 i λ²ˆμ§Έμ— λ“±μž₯ν•œλ‹€λ©΄, 이 νŒλ§€μ›μ„ 쑰직에 μ°Έμ—¬μ‹œν‚¨ μ‚¬λžŒμ˜ 이름, 즉 referral 의 i 번째 μ›μ†ŒλŠ” 이미 λ°°μ—΄ enroll 의 j 번째 (j < i) 에 λ“±μž₯ν–ˆμŒμ΄ 보μž₯λ©λ‹ˆλ‹€.

 

seller의 κΈΈμ΄λŠ” 1 이상 100,000 μ΄ν•˜μž…λ‹ˆλ‹€.

- seller λ‚΄μ˜ i λ²ˆμ§Έμ— μžˆλŠ” 이름은 i 번째 판맀 집계 데이터가 μ–΄λŠ νŒλ§€μ›μ— μ˜ν•œ 것인지λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

- seller μ—λŠ” 같은 이름이 μ€‘λ³΅ν•΄μ„œ λ“€μ–΄μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

amount의 κΈΈμ΄λŠ” seller의 길이와 κ°™μŠ΅λ‹ˆλ‹€.

- amount λ‚΄μ˜ i λ²ˆμ§Έμ— μžˆλŠ” μˆ˜λŠ” i 번째 판맀 집계 λ°μ΄ν„°μ˜ νŒλ§€λŸ‰μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

- νŒλ§€λŸ‰μ˜ λ²”μœ„, 즉 amount 의 μ›μ†Œλ“€μ˜ λ²”μœ„λŠ” 1 이상 100 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

 

칫솔 ν•œ 개λ₯Ό νŒλ§€ν•˜μ—¬ μ–»μ–΄μ§€λŠ” 이읡은 100 μ›μœΌλ‘œ μ •ν•΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  쑰직 κ΅¬μ„±μ›λ“€μ˜ 이름은 10 κΈ€μž μ΄λ‚΄μ˜ 영문 μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ“€λ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

 


πŸ“ μž…μΆœλ ₯ 예

 

enroll referral seller amount result
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["young", "john", "tod", "emily", "mary"] [12, 4, 2, 5, 10] [360, 958, 108, 0, 450, 18, 180, 1080]
["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["sam", "emily", "jaimie", "edward"] [2, 3, 5, 4] [0, 110, 378, 180, 270, 450, 0, 0]

 


πŸ“ μž…μΆœλ ₯ 예 μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1: 문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2: λ¬Έμ œμ— 주어진 μ˜ˆμ‹œμ™€ λ™μΌν•œ 쑰직 ꡬ성에 쑰금 λ‹€λ₯Έ νŒλ§€λŸ‰ 집계λ₯Ό μ μš©ν•œ κ²ƒμž…λ‹ˆλ‹€. 이읡을 λΆ„λ°°ν•˜λŠ” κ·œμΉ™μ΄ λ™μΌν•˜λ―€λ‘œ, κ°„λ‹¨ν•œ 계산에 μ˜ν•˜μ—¬ ν‘œμ— 보인 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

πŸ“ λ‚˜μ˜ μ†”λ£¨μ…˜

 

function solution(enroll, referral, seller, amount) {
    
    const link = {};
    const result = {};
    for (let i=0; i<enroll.length; i++){
        link[enroll[i]] = referral[i];
        result[enroll[i]] = 0;
    }
    
    function taxation(person, price){
        if (person === '-' || price === 0) {
            return;
        }
        const tax = Math.floor(price * 0.10);
        const margin = price - tax;
        if (price * 0.10 >= 1) {
            result[person] += margin;
            taxation(link[person], tax);
        } else {
            result[person] += price
        }  
    }
    
    seller.forEach((el, idx) => {
        taxation(el, amount[idx] * 100)
    })
    return Object.values(result);
}

 

πŸ“ μ ‘κ·Ό 방법

 

1. ν•˜μœ„ λ…Έλ“œμ™€ μ—°κ²°λœ μƒμœ„ λ…Έλ“œλ₯Ό λ°”λ‘œ 확인할 수 μžˆλ„λ‘ 객체λ₯Ό λ§Œλ“€μ–΄ μ€€λ‹€. κ·Έ κ²°κ³Ό λ‹€μŒκ³Ό 같은 객체가 λ§Œλ“€μ–΄μ§„λ‹€.

{ 
  "john":"-",
  "mary":"-",
  "edward":"mary",
  "sam":"edward",
  "emily":"mary",
  "jaimie":"mary",
  "tod":"jaimie",
  "young":"edward"
}

2. 각 λ…Έλ“œμ˜ 총앑을 담아쀄 객체도 λ§Œλ“€μ–΄μ€€λ‹€. 

3. μž¬κ·€λ₯Ό μ‹€ν–‰ν•˜μ—¬, 칫솔을 νŒλ§€ν•œ 첫 인물뢀터 μƒμœ„ λ…Έλ“œμΈ "-" 에 도달할 λ•ŒκΉŒμ§€ 10%μ”© μ°¨κ°ν•˜μ—¬ 총앑을 λ”ν•œλ‹€. 

4. μž¬κ·€λ₯Ό μ‹€ν–‰ν•˜λŠ” 도쀑 값이 0이 되면 λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ μž¬κ·€λ₯Ό μ€‘μ§€ν•œλ‹€. 

5. seller 의 각 인물에 λŒ€ν•΄ κ°œλ³„μ μœΌλ‘œ μž¬κ·€λ₯Ό μ‹€ν–‰ν•œλ‹€. 

 

μ œμ‹œλ¬Έμ΄ 쑰금 λΆˆμΉœμ ˆν•˜μ—¬ Math.floor λ₯Ό μ“°κΈ°κΉŒμ§€ 쑰금 μ‹œκ°„μ΄ κ±Έλ Έλ‹€. (Math.round κ°€ 정닡인 쀄 μ•Œκ³  μžˆμ—ˆλ‹€) 이 뢀뢄이 쑰금 더 λͺ…ν™•ν–ˆλ‹€λ©΄ 훨씬 λΉ λ₯΄κ²Œ ν’€μ—ˆμ„ λ¬Έμ œμ΄λ‹€. 

λŒ“κΈ€