[Algorithm] ๋ค๋จ๊ณ ์นซ์ํ๋งค
๐ ๋ฌธ์
๋ฏผํธ๋ ๋ค๋จ๊ณ ์กฐ์ง์ ์ด์ฉํ์ฌ ์นซ์์ ํ๋งคํ๊ณ ์์ต๋๋ค. ํ๋งค์์ด ์นซ์์ ํ๋งคํ๋ฉด ๊ทธ ์ด์ต์ด ํผ๋ผ๋ฏธ๋ ์กฐ์ง์ ํ๊ณ ์กฐ๊ธ์ฉ ๋ถ๋ฐฐ๋๋ ํํ์ ํ๋งค๋ง์ ๋๋ค. ์ด๋์ ๋ ํ๋งค๊ฐ ์ด๋ฃจ์ด์ง ํ, ์กฐ์ง์ ์ด์ํ๋ ๋ฏผํธ๋ ์กฐ์ง ๋ด ๋๊ฐ ์ผ๋ง๋งํผ์ ์ด๋์ ๊ฐ์ ธ๊ฐ๋์ง๊ฐ ๊ถ๊ธํด์ก์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฏผํธ๊ฐ ์ด์ํ๊ณ ์๋ ๋ค๋จ๊ณ ์นซ์ ํ๋งค ์กฐ์ง์ด ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค๊ณ ํฉ์๋ค.

๋ฏผํธ๋ 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 ๊ธ์ ์ด๋ด์ ์๋ฌธ ์ํ๋ฒณ ์๋ฌธ์๋ค๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
["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] |
โ๏ธ ํ์ด
๋ฌธ์ ๋ฅผ ์ฝ๊ณ ์ฒ์ ์๊ฐํ๋ ๊ฒ์ ๊ธ์ก์ ๋ค ๋ํด์ค ํ์ ๊น์ด๊ฐ ๊น์ ์ฌ๋๋ถํฐ ์์ ์ ์ถ์ฒํ ์ฌ๋์๊ฒ 10%์ฉ ๋ผ์ด์ฃผ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ค. profit ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์ enroll์ ์์๋ฅผ key๋ก, value๋ฅผ 0์ผ๋ก ์ด๊ธฐํ๋ฅผ ํด์ฃผ๊ณ seller๋ฅผ ์ํํ๋ฉด์ ๋ํด์คฌ๋ค. ์ดํ enroll์ ๋ค์ด์จ ์์๊ฐ ๋ณด์ฅ๋๋ค๋ ์ง๋ฌธ์ด ์์๊ธฐ ๋๋ฌธ์ enroll ๋ฐฐ์ด์ ๋ค์ง๊ณ ์ฐจ๋ก๋๋ก ์ํํ๋ฉฐ ์ถ์ฒํ(์์) ํ๋งค์์๊ฒ ์ด์ต์ 10%๋ฅผ ๋ผ์ด์คฌ๋ค.
ํ์ง๋ง ํ ์คํธ์ผ์ด์ค ๋๋ถ๋ถ์ ํต๊ณผํ์ง ๋ชปํ๋ค. ๋ฌธ๋ "ํ๋งค ๊ฑด๋ณ๋ก ๊ณ์ฐ์ ํด์ผ๋๋๊ฑด๊ฐ?"๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ๊ฑด๋ณ๋ก ๊ณ์ฐํ๋ฉด ๊ธ์ก์ด ์ฐจ์ด๊ฐ ๋๊ฒ ๋๋๋ฐ ์นซ์์ ํ๋ฒ์ฉ ์ด๋ฒ ํ๋งคํ์๋ ๊ฐ๋น ํ๋งค์ด์ต์ 100์์ด ๋๋๋ฐ ์ด๋ ์ถ์ฒ์์๊ฒ 10, 0์ ์์ผ๋ก ์ ๋ฌ๋๋ค. ํ์ง๋ง ํ๋ฒ์ ๊ณ์ฐํ ๊ฒฝ์ฐ ์ด์ต์ด 1000์์ผ๋ก ์ถ์ฒ์์๊ฒ 100, 10, 0์์ด ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌธ์ ๋ฅผ ๋ค์ ํ๊ธฐ ์์ํ๋ค. ๊ฑด๋น ํ๋งค์ด์ต์ด ์๋ฌด๋ฆฌ ํฌ๋๋ผ๋ 10000์์ด๊ธฐ ๋๋ฌธ์ ์์๋ก ํ๊ณ ์ฌ๋ผ๊ฐ๋ ํ์๋ ํฌ์ง ์์์ while๋ฌธ์ผ๋ก ํ๊ณ ํ๊ณ ์ฌ๋ผ๊ฐ๋ ๊ด์ฐฎ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ์ถ์ฒ์ ๊ด๊ณ๋ฅผ ๋งค๋ฒ ๋ฐฐ์ด์์ ์ฐพ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ graph๋ผ๋ ์์ ์ ์ถ์ฒ์๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์คฌ๊ณ , profit ๊ฐ์ฒด๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ ๋ค์์ seller๋ฅผ ์ํํ๋ฉด์ ์ถ์ฒ์์๊ฒ 10%์ฉ ์ ํด์ฃผ์๋ค. ์ ํด์ค ์ด์ต์ด ์๋ ๊ฒฝ์ฐ์๋ ๊ณ์ ์์ ์ถ์ฒ์๋ก ํ๊ณ ํ๊ณ ๋ฐ๋ณต๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ ํด์ฃผ๋ ๊ธ์ก์ด ์๋ ๊ฒฝ์ฐ๋ break๋ฅผ ํด์คฌ๋ค. ๋ง์ง๋ง์ผ๋ก enroll ๋ฐฐ์ด์ ์ํํ๋ฉด์ ์ด๋ฆ์ ๋ฐ๋ผ profit ๊ฐ์ฒด์์ ์ด์ต์ ์ฐพ์ answer์ pushํด์ฃผ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
โจ๏ธ ์ฝ๋
function solution(enroll, referral, seller, amount) {
var answer = [];
const profit = {};
const graph = {};
for (let i = 0; i < enroll.length; i++) {
profit[enroll[i]] = 0;
graph[enroll[i]] = referral[i];
}
for (let i = 0; i < seller.length; i++) {
let p = 100 * amount[i];
let name = seller[i];
while (graph[name]) {
if (!p) break;
const sendProfit = Math.floor(p / 10);
profit[name] += p - sendProfit;
p = sendProfit;
name = graph[name];
}
}
for (const name of enroll) answer.push(profit[name]);
return answer;
}