
ํด๋น ๋ฌธ์ ๋ DFS๋ก ๋ชจ๋ ํ ์ธ์จ์ ์กฐํฉ์ ๊ตฌํ๊ณ ์์ ํ์์ ์งํํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์์์ ์ต๊ณ ์ ๋ฐฉ์์ ํ์ํ๋ ๋ฌธ์ ์ด๋ค.
๐งก๋ฌธ์  ์ค๋ช
์นด์นด์คํก์์๋ ์ด๋ชจํฐ์ฝ์ ๋ฌด์ ํ์ผ๋ก ์ฌ์ฉํ  ์ ์๋ ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์
์ ์๋ฅผ ๋๋ฆฌ๋ ค๊ณ  ํฉ๋๋ค.
์ด๋ฅผ ์ํด ์นด์นด์คํก์์๋ ์ด๋ชจํฐ์ฝ ํ ์ธ ํ์ฌ๋ฅผ ํ๋๋ฐ, ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1๋ฒ ๋ชฉํ๊ฐ ์ฐ์ ์ด๋ฉฐ, 2๋ฒ ๋ชฉํ๊ฐ ๊ทธ ๋ค์์ ๋๋ค.
์ด๋ชจํฐ์ฝ ํ ์ธ ํ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค.
n๋ช
์ ์นด์นด์คํก ์ฌ์ฉ์๋ค์๊ฒ ์ด๋ชจํฐ์ฝ m๊ฐ๋ฅผ ํ ์ธํ์ฌ ํ๋งคํฉ๋๋ค.์นด์นด์คํก ์ฌ์ฉ์๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ์ค์ ๋ฐ๋ผ ์ด๋ชจํฐ์ฝ์ ์ฌ๊ฑฐ๋, ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค์ ๊ฐ์ ํฉ๋๋ค.
๋ค์์ 2๋ช ์ ์นด์นด์คํก ์ฌ์ฉ์์ 2๊ฐ์ ์ด๋ชจํฐ์ฝ์ด ์์๋์ ์์์ ๋๋ค.
| ์ฌ์ฉ์ | ๋น์จ | ๊ฐ๊ฒฉ | 
|---|---|---|
| 1 | 40 | 10,000 | 
| 2 | 25 | 10,000 | 
| ์ด๋ชจํฐ์ฝ | ๊ฐ๊ฒฉ | 
|---|---|
| 1 | 7,000 | 
| 2 | 9,000 | 
1๋ฒ ์ฌ์ฉ์๋ 40%์ด์ ํ ์ธํ๋ ์ด๋ชจํฐ์ฝ์ ๋ชจ๋ ๊ตฌ๋งคํ๊ณ , ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค ๋น์ฉ์ด 10,000์ ์ด์์ด ๋๋ฉด ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค๋ฅผ ๋ชจ๋ ์ทจ์ํ๊ณ  ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค์ ๊ฐ์
ํฉ๋๋ค.
2๋ฒ ์ฌ์ฉ์๋ 25%์ด์ ํ ์ธํ๋ ์ด๋ชจํฐ์ฝ์ ๋ชจ๋ ๊ตฌ๋งคํ๊ณ , ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค ๋น์ฉ์ด 10,000์ ์ด์์ด ๋๋ฉด ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค๋ฅผ ๋ชจ๋ ์ทจ์ํ๊ณ  ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค์ ๊ฐ์
ํฉ๋๋ค.
1๋ฒ ์ด๋ชจํฐ์ฝ์ ๊ฐ๊ฒฉ์ 7,000์, 2๋ฒ ์ด๋ชจํฐ์ฝ์ ๊ฐ๊ฒฉ์ 9,000์์ ๋๋ค.
๋ง์ฝ, 2๊ฐ์ ์ด๋ชจํฐ์ฝ์ ๋ชจ๋ 40%์ฉ ํ ์ธํ๋ค๋ฉด, 1๋ฒ ์ฌ์ฉ์์ 2๋ฒ ์ฌ์ฉ์ ๋ชจ๋ 1,2๋ฒ ์ด๋ชจํฐ์ฝ์ ๊ตฌ๋งคํ๊ฒ ๋๊ณ , ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ์ฌ์ฉ์ | ๊ตฌ๋งคํ ์ด๋ชจํฐ์ฝ | ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค ๋น์ฉ | ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์ ์ฌ๋ถ | 
|---|---|---|---|
| 1 | 1, 2 | 9,600 | X | 
| 2 | 1, 2 | 9,600 | X | 
์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์ ์๋ 0๋ช ์ด ๋์ด๋๊ณ ์ด๋ชจํฐ์ฝ ํ๋งค์ก์ 19,200์์ด ๋์ด๋ฉ๋๋ค.
ํ์ง๋ง, 1๋ฒ ์ด๋ชจํฐ์ฝ์ 30% ํ ์ธํ๊ณ 2๋ฒ ์ด๋ชจํฐ์ฝ์ 40% ํ ์ธํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ์ฌ์ฉ์ | ๊ตฌ๋งคํ ์ด๋ชจํฐ์ฝ | ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค ๋น์ฉ | ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์ ์ฌ๋ถ | 
|---|---|---|---|
| 1 | 2 | 5,400 | X | 
| 2 | 1, 2 | 10,300 | O | 
2๋ฒ ์ฌ์ฉ์๋ ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค ๋น์ฉ์ 10,000์ ์ด์ ์ฌ์ฉํ์ฌ ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค๋ฅผ ๋ชจ๋ ์ทจ์ํ๊ณ  ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค์ ๊ฐ์
ํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์, ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์
์๋ 1๋ช
์ด ๋์ด๋๊ณ  ์ด๋ชจํฐ์ฝ ํ๋งค์ก์ 5,400์์ด ๋์ด๋๊ฒ ๋ฉ๋๋ค.
์นด์นด์คํก ์ฌ์ฉ์ n๋ช
์ ๊ตฌ๋งค ๊ธฐ์ค์ ๋ด์ 2์ฐจ์ ์ ์ ๋ฐฐ์ด users, ์ด๋ชจํฐ์ฝ m๊ฐ์ ์ ๊ฐ๋ฅผ ๋ด์ 1์ฐจ์ ์ ์ ๋ฐฐ์ด emoticons๊ฐ ์ฃผ์ด์ง๋๋ค. ์ด๋, ํ์ฌ ๋ชฉ์ ์ ์ต๋ํ์ผ๋ก ๋ฌ์ฑํ์ ๋์ ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์
 ์์ ์ด๋ชจํฐ์ฝ ๋งค์ถ์ก์ 1์ฐจ์ ์ ์ ๋ฐฐ์ด์ ๋ด์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
๐์ ํ์ฌํญ
users์ ๊ธธ์ด = n โค 100users์ ์์๋ [๋น์จ, ๊ฐ๊ฒฉ]์ ํํ์
๋๋ค.users[i]๋ i+1๋ฒ ๊ณ ๊ฐ์ ๊ตฌ๋งค ๊ธฐ์ค์ ์๋ฏธํฉ๋๋ค.๋น์จ% ์ด์์ ํ ์ธ์ด ์๋ ์ด๋ชจํฐ์ฝ์ ๋ชจ๋ ๊ตฌ๋งคํ๋ค๋ ์๋ฏธ์
๋๋ค.๋น์จ โค 40๊ฐ๊ฒฉ์ด์์ ๋์ ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค์ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ชจํฐ์ฝ ๊ตฌ๋งค๋ฅผ ๋ชจ๋ ์ทจ์ํ๊ณ  ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค์ ๊ฐ์
ํ๋ค๋ ์๋ฏธ์
๋๋ค.๊ฐ๊ฒฉ โค 1,000,000๊ฐ๊ฒฉ์ 100์ ๋ฐฐ์์
๋๋ค.emoticons์ ๊ธธ์ด = m โค 7emoticons[i]๋ i+1๋ฒ ์ด๋ชจํฐ์ฝ์ ์ ๊ฐ๋ฅผ ์๋ฏธํฉ๋๋ค.emoticons์ ์์ โค 1,000,000emoticons์ ์์๋ 100์ ๋ฐฐ์์
๋๋ค.๐์ ์ถ๋ ฅ ์
| users | emoticons | result | 
|---|---|---|
| [[40, 10000], [25, 10000]] | [7000, 9000] | [1, 5400] | 
| [[40, 2900], [23, 10000], [11, 5200], [5, 5900], [40, 3100], [27, 9200], [32, 6900]] | [1300, 1500, 1600, 4900] | [4, 13860] | 
๐์ ์ถ๋ ฅ ์ ์ค๋ช
์ ์ถ๋ ฅ ์ #1
๋ฌธ์ ์ ์์์ ๊ฐ์ต๋๋ค.
์ ์ถ๋ ฅ ์ #2
๋ค์๊ณผ ๊ฐ์ด ํ ์ธํ๋ ๊ฒ์ด ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์ ์๋ฅผ ์ต๋ํ ๋๋ฆฌ๋ฉด์, ์ด๋ชจํฐ์ฝ ํ๋งค์ก ๋ํ ์ต๋๋ก ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
| ์ด๋ชจํฐ์ฝ | ํ ์ธ์จ | 
|---|---|
| 1 | 40 | 
| 2 | 40 | 
| 3 | 20 | 
| 4 | 40 | 
์์ ๊ฐ์ด ํ ์ธํ๋ฉด 4๋ช
์ ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ๊ฐ์
์์ 13,860์์ ํ๋งค์ก์ ๋ฌ์ฑํ  ์ ์์ต๋๋ค. ๋ค๋ฅธ ํ ์ธ์จ์ ์ ์ฉํ์ฌ ์ด๋ชจํฐ์ฝ์ ํ๋งคํ  ์ ์์ง๋ง ์ด๋ณด๋ค ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์๋น์ค ๊ฐ์
์๋ฅผ ์ต๋ํ ๋๋ฆฌ๋ฉด์, ์ด๋ชจํฐ์ฝ ํ๋งค์ก ๋ํ ์ต๋๋ก ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
๋ฐ๋ผ์, [4, 13860]์ return ํ๋ฉด ๋ฉ๋๋ค.\
๐๋์ ํ์ด
function solution(users, emoticons) {
    // ํ ์ธ์จ ํผ์ผํ
์ด์ง
    const salePercent = [10, 20, 30, 40]
    // ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๋ชจ๋  ํ ์ธ์จ
    const cases = []
    // ์์ ์ฌ์ฉ ๋ฐฐ์ด
    const arr = []
    // emoticons์ ๊ธธ์ด
    const emoLen = emoticons.length
    // ์ ๋ต ์ํฐํ๋ฌ์ค, ์๋ ๋ฐฐ์ด
    const result = [0,0]
    function saleDFS(depth = 0) {
        if(depth === emoLen) {
            cases.push([...arr])
            return
        }
        for(let i = 0 ; i < salePercent.length ; i++) {
            arr[depth] = salePercent[i]
            saleDFS(depth+1)
        }
    }
    saleDFS()
    // cases๋ฐฐ์ด ์ํ
    cases.forEach((curCase, curCaseIdx) => {
        // ํด๋น ํ ์ธ์จ์ ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ๊ฐ์
์ ์
        let emoticonPlus = 0
        // ํด๋น ํ ์ธ์จ์ ์๋
        let sumPrice = 0
        // users๋ฐฐ์ด ์ํ
        users.forEach(([buyPercent, buyPlus], userIdx) => {
            let price = 0
            let etPlusFlag = false
            // emoticons๋ฐฐ์ด ์ํ
            emoticons.every((et, etIdx) => {
                // ์ด๋ฒ ํ ์ธ์จ์ด ์ ์ ์ ์๊ตฌ ํ ์ธ์จ๋ณด๋ค ๋์ ๊ฒฝ์ฐ ์ฆ์ ๊ตฌ๋งค
                if(curCase[etIdx] >= buyPercent) {
                    price += et * (100 - curCase[etIdx]) / 100 
                }
                // ํ ์ธ์ก์ด ์ ์ ์ ์๊ตฌ ๊ธ์ก์ ๋๊ธด๋ค๋ฉด ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ๊ตฌ์
                if(price >= buyPlus) {
                    etPlusFlag = true
                    return false
                }
                return true
            })
            // ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค๋ฅผ ๊ตฌ๋งคํ๋ ์ฌ๋์ธ๊ฐ ํ๋ณ
            if(etPlusFlag) emoticonPlus++
            else sumPrice += price
        })
        // ์ด๋ฒ ํ ์ธ์จ์ด ๊ฐ์ฅ ๋ง์ ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์ฌ์ฉ์ ์๋ฅผ ๊ธฐ๋กํ๋๊ฐ
        if(emoticonPlus > result[0]) {
            result[0] = emoticonPlus
            result[1] = sumPrice
        // ์ด๋ฒ ํ ์ธ์จ์ด ์ด๋ชจํฐ์ฝ ํ๋ฌ์ค ์ฌ์ฉ์ ์๊ฐ ๊ฐ์ง๋ง, ์ด ์๋์ด ๋ ๋์๊ฐ
        } else if (result[0] === emoticonPlus && sumPrice > result[1]) {
            result[1] = sumPrice
        }
    })
    return result
}