ν‹°μŠ€ν† λ¦¬ λ·°

문제

문제 μ„€λͺ…

XXκ²Œμž„μ—λŠ” ν”Όλ‘œλ„ μ‹œμŠ€ν…œ(0 μ΄μƒμ˜ μ •μˆ˜λ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€)이 있으며, 일정 ν”Όλ‘œλ„λ₯Ό μ‚¬μš©ν•΄μ„œ λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ, 각 λ˜μ „λ§ˆλ‹€ νƒν—˜μ„ μ‹œμž‘ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 λ˜μ „ νƒν—˜μ„ λ§ˆμ³€μ„ λ•Œ μ†Œλͺ¨λ˜λŠ” "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ μžˆμŠ΅λ‹ˆλ‹€. "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” ν•΄λ‹Ή λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄ 가지고 μžˆμ–΄μ•Ό ν•˜λŠ” μ΅œμ†Œν•œμ˜ ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λ‚΄λ©°, "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” λ˜μ „μ„ νƒν—˜ν•œ ν›„ μ†Œλͺ¨λ˜λŠ” ν”Όλ‘œλ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"κ°€ 80, "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ 20인 λ˜μ „μ„ νƒν—˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” μœ μ €μ˜ ν˜„μž¬ 남은 ν”Όλ‘œλ„λŠ” 80 이상 이어야 ν•˜λ©°, λ˜μ „μ„ νƒν—˜ν•œ ν›„μ—λŠ” ν”Όλ‘œλ„ 20이 μ†Œλͺ¨λ©λ‹ˆλ‹€.

이 κ²Œμž„μ—λŠ” ν•˜λ£¨μ— ν•œ λ²ˆμ”© νƒν—˜ν•  수 μžˆλŠ” λ˜μ „μ΄ μ—¬λŸ¬κ°œ μžˆλŠ”λ°, ν•œ μœ μ €κ°€ 였늘 이 λ˜μ „λ“€μ„ μ΅œλŒ€ν•œ 많이 νƒν—˜ν•˜λ € ν•©λ‹ˆλ‹€. μœ μ €μ˜ ν˜„μž¬ ν”Όλ‘œλ„ k와 각 λ˜μ „λ³„ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"κ°€ λ‹΄κΈ΄ 2차원 λ°°μ—΄ dungeons κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μœ μ €κ°€ νƒν—˜ν• μˆ˜ μžˆλŠ” μ΅œλŒ€ λ˜μ „ 수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

μ œν•œμ‚¬ν•­

  • kλŠ” 1 이상 5,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • dungeons의 μ„Έλ‘œ(ν–‰) 길이(즉, λ˜μ „μ˜ 개수)λŠ” 1 이상 8 μ΄ν•˜μž…λ‹ˆλ‹€.
    • dungeons의 κ°€λ‘œ(μ—΄) κΈΈμ΄λŠ” 2 μž…λ‹ˆλ‹€.
    • dungeons의 각 행은 각 λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"] μž…λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 항상 "μ†Œλͺ¨ ν”Όλ‘œλ„"보닀 ν¬κ±°λ‚˜ κ°™μŠ΅λ‹ˆλ‹€.
    • "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"와 "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 1 이상 1,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
    • μ„œλ‘œ λ‹€λ₯Έ λ˜μ „μ˜ ["μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„", "μ†Œλͺ¨ ν”Όλ‘œλ„"]κ°€ μ„œλ‘œ 같을 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

kdungeonsresult

80 [[80,20],[50,40],[30,10]] 3

μž…μΆœλ ₯ 예 μ„€λͺ…

ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80μž…λ‹ˆλ‹€.

λ§Œμ•½, 첫 번째 → 두 번째 → μ„Έ 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 20μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 20이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μž…λ‹ˆλ‹€. λ”°λΌμ„œ μ„Έ 번째 λ˜μ „μ€ νƒν—˜ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ§Œμ•½, 첫 번째 → μ„Έ 번째 → 두 번째 λ˜μ „ μˆœμ„œλ‘œ νƒν—˜ν•œλ‹€λ©΄

  • ν˜„μž¬ ν”Όλ‘œλ„λŠ” 80이며, 첫 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„" λ˜ν•œ 80μ΄λ―€λ‘œ, 첫 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 20μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 60μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 60이며, μ„Έ 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 30μ΄λ―€λ‘œ, μ„Έ 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ„Έ 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 10μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 50μž…λ‹ˆλ‹€.
  • 남은 ν”Όλ‘œλ„λŠ” 50이며, 두 번째 λ˜μ „μ„ λŒκΈ°μœ„ν•΄ ν•„μš”ν•œ "μ΅œμ†Œ ν•„μš” ν”Όλ‘œλ„"λŠ” 50μ΄λ―€λ‘œ, 두 번째 λ˜μ „μ„ νƒν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 번째 λ˜μ „μ˜ "μ†Œλͺ¨ ν”Όλ‘œλ„"λŠ” 40μ΄λ―€λ‘œ, λ˜μ „μ„ νƒν—˜ν•œ ν›„ 남은 ν”Όλ‘œλ„λŠ” 10μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 이 경우 μ„Έ λ˜μ „μ„ λͺ¨λ‘ νƒν—˜ν•  수 있으며, μœ μ €κ°€ νƒν—˜ν•  수 μžˆλŠ” μ΅œλŒ€ λ˜μ „ μˆ˜λŠ” 3μž…λ‹ˆλ‹€.

 

λ¬Έμ œν’€μ΄

https://choi95.tistory.com/137?category=881084

 

[냅색 μ•Œκ³ λ¦¬μ¦˜]λ™μ „κ΅ν™˜

문제 https://choi95.tistory.com/119?category=854389 [DFS-Cut Edge]λ™μ „κ΅ν™˜ 문제 λ‹€μŒκ³Ό 같이 μ—¬λŸ¬ λ‹¨μœ„μ˜ 동전듀이 μ£Όμ–΄μ Έ μžˆμ„λ•Œ κ±°μŠ€λ¦„λˆμ„ κ°€μž₯ 적은 수의 λ™μ „μœΌλ‘œ κ΅ν™˜ν•΄μ£Όλ €λ©΄ μ–΄λ–»κ²Œ μ£Όλ©΄ λ˜λŠ”κ°€?각..

choi95.tistory.com

일전에 ν’€μ—ˆλ˜ λ™μ „κ΅ν™˜ λ¬Έμ œμ™€ 같이 μ‚¬μš©μžμ˜ 남아 μžˆλŠ” ν”Όλ‘œλ„λ₯Ό κΈ°μ€€μœΌλ‘œ 각 μ†ŒλΉ„ ν”Όλ‘œλ„μ— 따라 돌 수 μžˆλŠ” μ΅œλŒ€ λ˜μ „μ˜ 횟수λ₯Ό 냅색 μ•Œκ³ λ¦¬μ¦˜μ„ 톡해 ν’€μ΄ν•˜μ˜€λ‹€.

 

μ½”λ“œ

function solution(k, dungeons) {
    var answer = -1;
    let dy = Array.from({length: k + 1}, () => 0);

    for(let i = 0; i < dungeons.length; i++) {
        let need = dungeons[i][0];
        let spend = dungeons[i][1];
        for(let j = k; j >= spend; j--) {
            dy[j] = Math.max(dy[j], dy[j - spend] + 1)
        }
    }
    
    answer = dy[k];
    
    return answer;
}

 

μ˜€λ‹΅

μ˜ˆμ‹œ μΌ€μ΄μŠ€λŠ” λͺ¨λ‘ ν†΅κ³Όν•˜μ˜€μ§€λ§Œ λͺ‡ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ μ˜€λ‹΅ μ²˜λ¦¬λ˜μ—ˆλ‹€.

 

원인을 μ°Ύμ•„λ³΄λ‹ˆ DPλ₯Ό 톡해 ν’€κ²Œ 되면 λͺ¨λ“  경우 μˆ˜μ— λŒ€ν•΄μ„œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•¨μ„ 확인할 수 μžˆμ—ˆλ‹€.

 

ν•΄λ‹Ή λ¬Έμ œλŠ” λ˜μ „μ„ λ°©λ¬Έν•˜λŠ” μˆœμ„œκ°€ λ³„λ„λ‘œ μ§€μ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

κ·Έλž˜μ„œ λ§Œμ•½μ— μž…μž₯에 ν•„μš”ν•œ ν”Όλ‘œκ°€ 큰 μˆœμ„œλŒ€λ‘œ κ°„λ‹€λ©΄ 3번째 λ˜μ „μ„ λͺ» 돌기 λ•Œλ¬Έμ— μ•ˆλ˜λ©° λ°˜λŒ€λ‘œ μž‘μ€ μˆœμ„œλŒ€λ‘œ κ°€κ²Œ λœλ‹€λ©΄ μž…μž₯에 ν•„μš”ν•œ 피도도가 큰 것이 λ‚˜μ€‘μ— λ‚˜μ˜€κΈ° λ•Œλ¬Έμ— λͺ¨λ“  경우의 수λ₯Ό νŒŒμ•…ν•˜μ§€ λͺ»ν•˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€.

 

이에 λ˜μ „μ˜ 진행 횟수λ₯Ό depth둜 μ§€μ •ν•˜κ³  λ˜μ „μ˜ λ°©λ¬Έ 여뢀와 λ˜μ „μ„ ν†΅κ³Όν•œ μ‹œμ μ— 남은 ν”Όλ‘œλ„λ₯Ό λ³„λ„λ‘œ κ³„μ‚°ν•΄μ£ΌλŠ” 깊이 탐색(DFS)을 톡해 문제λ₯Ό 풀이해야 됨을 ν™•μΈν•˜μ˜€λ‹€.

 

μ½”λ“œ

function solution(k, dungeons) {
        let max = Number.MIN_SAFE_INTEGER;

        function DFS(f, pass, nonPass) {
          if (dungeons.length === pass.length + nonPass.length) {
            max = max > pass.length ? max : pass.length;
          } else {
            for (let i = 0; i < dungeons.length; i++) {
              if (!pass.includes(i) && !nonPass.includes(i)) { // λ°©λ¬Έ μ—¬λΆ€λ₯Ό 확인
                if (f >= dungeons[i][0]) { // 남아 μžˆλŠ” ν”Όλ‘œλ„κ°€ 더 λ§Žμ„ 경우
                  pass.push(i);
                  DFS(f - dungeons[i][1], pass, nonPass);
                  pass.pop();
                } else { // 남아 μžˆλŠ” ν”Όλ‘œλ„κ°€ λͺ¨μžλž€ 경우
                  nonPass.push(i);
                  DFS(f, pass, nonPass);
                  nonPass.pop();
                }
              }
            }
          }
        }
        DFS(k, [], []);
        return max;
      }
λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
TAG
more
Β«   2024/10   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
κΈ€ 보관함