Contents

ν”Όλ‘œλ„ (with.Java)

   Aug 10, 2024     3 min read

ν”Όλ‘œλ„ (with.Java) λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ 회고λ₯Ό ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

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

λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 풀이

class Solution {
    public int answer = 0;
    public boolean[] visit;

    public int solution(int k, int[][] dungeons) {
        visit = new boolean[dungeons.length];

        dfs(0, k, dungeons);

        return answer;
    }

    public void dfs(int depth, int k, int[][] dungeons) {
        for (int i = 0; i < dungeons.length; i++) {
            if(visit[i] || dungeons[i][0] > k){
                continue;
            } else{
                visit[i] = true;
                dfs(depth + 1, k - dungeons[i][1], dungeons);
                visit[i] = false;
            }
        }
        answer = Math.max(answer, depth);
    }
}

풀이 μ„€λͺ…

λ§Œμ•½ μ΅œμ†Œ ν•„μš”λ„κ°€ 큰 μˆœμ„œλŒ€λ‘œ ν•œλ‹€λ©΄, [80,20],[50,40],[30,10]인데 3번째 λ˜μ „μ„ 탐색할 수 μ—†κΈ° λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•˜κ³ , μ†Œλͺ¨ ν”Όλ‘œλ„κ°€ 적은 μˆœμ„œλŒ€λ‘œ ν•œλ‹€λ©΄, [30,10], [80,20],[50,40]인데 첫 번째 λ˜μ „μ„ 돌면 남은 ν•„μš”λ„λŠ” 70이기 λ•Œλ¬Έμ— 두 번째 λ˜μ „μ„ 탐색할 수 없기에 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

즉, 완전탐색을 μ‚¬μš©ν•΄ λͺ¨λ“  경우의 수λ₯Ό νƒμƒ‰ν•˜λŠ” 방법 밖에 μ—†μ–΄ μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ DFS둜 ν’€μ΄ν–ˆμŠ΅λ‹ˆλ‹€.

dfs λ©”μ„œλ“œλŠ” μž¬κ·€μ μœΌλ‘œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

각 ν˜ΈμΆœμ€ ν˜„μž¬κΉŒμ§€μ˜ 탐색 깊이(depth), ν˜„μž¬ 레벨(k), 그리고 λ˜μ „ 정보 λ°°μ—΄(dungeons)을 인수둜 λ°›μŠ΅λ‹ˆλ‹€.

λ°˜λ³΅λ¬Έμ„ 톡해 λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ˜μ „ μ€‘μ—μ„œ μš”κ΅¬ 레벨이 ν˜„μž¬ 레벨 μ΄ν•˜μΈ λ˜μ „μ„ νƒμƒ‰ν•©λ‹ˆλ‹€.

λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ˜μ „ μ€‘μ—μ„œ κ°€μž₯ λ¨Όμ € 발견된 λ˜μ „μ„ λ°©λ¬Έν•˜κ³ , ν•΄λ‹Ή λ˜μ „μ˜ μš”κ΅¬ λ ˆλ²¨μ„ ν˜„μž¬ λ ˆλ²¨μ—μ„œ λΊ€ κ°’μœΌλ‘œ μž¬κ·€ ν˜ΈμΆœν•©λ‹ˆλ‹€.

μž¬κ·€ 호좜이 μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή λ˜μ „μ˜ λ°©λ¬Έ μ—¬λΆ€λ₯Ό λ‹€μ‹œ false둜 λ³€κ²½ν•©λ‹ˆλ‹€.

κ²°λ‘ 

λͺ¨λ“  λ˜μ „μ„ νƒμƒ‰ν•˜λ©΄μ„œ μ΅œλŒ€ 탐색 깊이λ₯Ό κΈ°λ‘ν•˜κ³ , 이λ₯Ό μ΅œμ’…μ μœΌλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€. 이 μ½”λ“œλŠ” DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜μ—¬ λͺ¨λ“  κ°€λŠ₯ν•œ 경둜λ₯Ό νƒμƒ‰ν•˜κ³ , κ·Έ μ€‘μ—μ„œ μ΅œλŒ€ 탐색 깊이λ₯Ό κ΅¬ν•˜λŠ” κ°„λ‹¨ν•œ 방법을 μ œμ‹œν•©λ‹ˆλ‹€.