728x90

Greedy AlgorithmπŸ‹

νƒμš• μ•Œκ³ λ¦¬μ¦˜μ€ 말 κ·Έλž˜λ„ νƒμš•μŠ€λŸ¬μš΄ μ΄λΌλŠ” 의미λ₯Ό 가지며 , μ„ νƒμ˜ μˆœκ°„μ΄ 였면 λˆˆμ•žμ— λ³΄μ΄λŠ” 졜적의 μƒν™©λ§Œμ„ κ³ λ €ν•˜μ—¬ μ΅œμ’…μ μΈ 해닡에 λ„λ‹¬ν•˜λŠ” 방법을 λ§ν•©λ‹ˆλ‹€. 이 μ•Œκ³ λ¦¬μ¦˜μ€ 각 μ„ νƒμ˜ μˆœκ°€μ—λŠ” 졜적으둜 보일 수 μžˆμ§€λ§Œ, κ·Έ 선택이 μ „μ²΄μ μœΌλ‘œ λ³΄μ•˜μ„ λ•Œ μ΅œμ μΈμ§€λŠ” 보μž₯λ˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

Greedy Algorithm  λΆˆκ°€λŠ₯ν•œ 경우

1. ν˜„μž¬ μƒν™©μ—μ„œλŠ” λ§ˆμ‹œλ©œλ‘œ 1개λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.(ν˜„μž¬ μ‹œμ μ—μ„œμ˜ μ΅œμ„ μ˜ 선택)

2. κ·ΈλŸ¬λ‚˜ 5뢄을 기닀리면 2개의 λ§ˆμ‹œλ©œλ‘œλ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€. (미래λ₯Ό κ³ λ €ν•œ 선택)

 

그리디 μ•Œκ³ λ¦¬μ¦˜μ— λ”°λ₯΄λ©΄ 각 λ‹¨κ³„μ—μ„œ ν˜„μž¬ μ΅œμ„ μœΌλ‘œ λ³΄μ΄λŠ” 선택을 ν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ μ‹œμ μ—μ„œ 1개의 λ§ˆμ‹œλ©œλ‘œλ₯Ό λ°›λŠ” 것이 선택될 κ²ƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 미래λ₯Ό κ³ λ €ν•  경우 5뢄을 κΈ°λ‹€λ¦°λ‹€λ©΄ 2개의 λ§ˆμ‹œλ©œλ‘œλ₯Ό λ°›λŠ” 것이 더 λ§Žμ€ λ§ˆμ‹œλ©œλ‘œλ₯Ό λ°›λŠ” μ΅œμ„ μ˜ μ„ νƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©΄ 항상 1개의 λ§ˆμ‹œλ©œλ‘œλ§Œ λ°›κ²Œ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 졜적의 ν•΄λ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œλŠ” 미래의 상황을 κ³ λ €ν•΄μ•Ό ν•˜λ―€λ‘œ 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ μ μ ˆν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Greedy Algorithm μ •λ‹Ήμ„± - μ΅œμ ν•΄ λ„μΆœ

νƒμš•μ  선택 속성

각 λ‹¨κ³„μ—μ„œ 졜적으둜 λ³΄μ΄λŠ” 선택을 ν•˜μ—¬λ„ μ „μ²΄μ μœΌλ‘œ 항상 졜적의 ν•΄λ₯Ό 보μž₯ν•œλ‹€λŠ” 의미, 즉 각 λ‹¨κ³„μ—μ„œμ˜ 선택이 κ·Έ μˆœκ°„μ—λŠ” 졜적으둜 λ³΄μ΄μ§€λ§Œ, μ΄λŸ¬ν•œ 선택듀이 λͺ¨μ—¬μ„œ μ΅œμ’…μ μœΌλ‘œλŠ” 전체 문제의 μ΅œμ ν•΄λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

 

문제

κ°€κ²Œμ—μ„œ 물건을 사고 λˆμ„ μ§€λΆˆν•  λ•Œ, κ±°μŠ€λ¦„λˆμœΌλ‘œ μ€˜μ•Ό ν•˜λŠ” λ™μ „μ˜ 개수λ₯Ό μ΅œμ†Œν™”ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μ˜ˆμ‹œ

물건 가격이 520원이고 μ†λ‹˜μ΄ 1000원을 μ§€λΆˆν•œλ‹€κ³  ν•  λ•Œ μ΅œμ†Œν•œμ˜ 동전 개수둜 κ±°μŠ€λ¦„λˆμ„ μ£Όλ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

 

κ°€μž₯ 큰 λ‹¨μœ„μ˜ 동전을 μ‚¬μš©ν•˜μ—¬ κ±°μŠ€λ¦„λˆμ„ μ£ΌλŠ” 것이 졜적의 ν•΄λ₯Ό ꡬ할 수 μžˆλŠ” 경우

 

해결방법

  1. μ†λ‹˜μ΄ μ§€λΆˆν•œ 돈의 물건의 가격을 λΊ€ 480원이 κ±°μŠ€λ¦„λˆμž…λ‹ˆλ‹€.
  2. κ±°μŠ€λ¦„λˆμ„ μ£ΌκΈ° μœ„ν•΄ κ°€μž₯ 큰 λ‹¨μœ„μ˜ 동전뢀터 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€. κ°€μž₯ 큰 λ‹¨μœ„μ˜ 동전은 500μ›μž…λ‹ˆλ‹€. 
  3. κ·ΈλŸ¬λ‚˜ κ±°μŠ€λ¦„λˆμ΄ 480원 μ΄λ―€λ‘œ 500원을 μ‚¬μš©ν•™ 되면 20원이 μ΄ˆκ³Όν•˜κ²Œ λ©λ‹ˆλ‹€. λ”°λΌμ„œ 500μ›μ§œλ¦¬ 동전은 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  4. λ‹€μŒμœΌλ‘œ 큰 λ‹¨μœ„μΈ 동전 100μ›μ§œλ¦¬λ₯Ό μ‚¬μš©ν•΄ 100μ›μ§œλ¦¬ 동전 4개λ₯Ό μ£Όκ³ , 남은 κ±°μŠ€λ¦„λˆ 480 - 400 = 80 이 λ©λ‹ˆλ‹€.
  5. 남은 κ±°μŠ€λ¦„λˆ 80원에 λŒ€ν•΄ λ‹€μ‹œ 큰 λ‹¨μœ„ 동전뢀터 μ‹œλ„ν•©λ‹ˆλ‹€.
  6. 80μ›μ—μ„œ 50μ›μ§œλ¦¬ 동전을 μ‚¬μš©ν•˜λ©΄ 남은 κ±°μŠ€λ¦„λˆμ€ 30원이 λ©λ‹ˆλ‹€.
  7. 남은 κ±°μŠ€λ¦„λˆ 30원에 λŒ€ν•΄ λ‹€μ‹œ 큰 동전뢀터 μ‹œλ„ν•©λ‹ˆλ‹€.
  8. 30원 μ—μ„œ 10μ›μ§œλ¦¬ 동전 3개λ₯Ό μ‚¬μš©ν•˜μ—¬ κ±°μŠ€λ¦„λˆμ„ μ€λ‹ˆλ‹€.

 

졜적 λΆ€λΆ„ ꡬ쑰

큰 문제λ₯Ό μž‘μ€ λΆ€λΆ„ 문제둜 λ‚˜λˆŒ 수 있고, 각 λΆ€λΆ„ 문제의 μ΅œμ ν•΄κ°€ 전체 문제의 μ΅œμ ν•΄μ— κΈ°μ—¬ν•  수 μžˆλ‹€λŠ” κ°œλ…, 즉 전체 문제λ₯Ό μž‘μ€ λ‹¨μœ„λ‘œ λΆ„ν• ν•˜μ—¬ 각 λ‹¨κ³„μ—μ„œ μ΅œμ ν•΄λ₯Ό 찾으면 이λ₯Ό μ‘°ν•©ν•˜μ—¬ 전체 문제의 μ΅œμ ν•΄λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

큰 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 졜적의 방법이 κ·Έ 문제λ₯Ό κ΅¬μ„±ν•˜λŠ” μž‘μ€ λΆ€λΆ„λ“€μ˜ 졜적의 ν•΄κ²° λ°©λ²•μœΌλ‘œ ꡬ성될 수 μžˆλ‹€λŠ” κ°œλ…μ΄λ©° 예λ₯Ό 듀어보면 μ„œμšΈμ—μ„œ λΆ€μ‚°κΉŒμ§€ κ°€λŠ” μ΅œλ‹¨ 경둜 문제라고 생각해 보면, 이 λ¬Έμ œλŠ” μ„œμšΈμ—μ„œ λŒ€κ΅¬κΉŒμ§€μ˜ μ΅œλ‹¨ κ²½λ‘œμ™€ λŒ€κ΅¬μ—μ„œ λΆ€μ‚°κΉŒμ§€μ˜ μ΅œλ‹¨ κ²½λ‘œλΌλŠ” 두 개의 λΆ€λΆ„ 문제둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. μ„œμšΈμ—μ„œ λŒ€κ΅¬κΉŒμ§€ κ°€λŠ” μ΅œλ‹¨ κ²½λ‘œκ°€ 200km , λŒ€κ΅¬μ—μ„œ λΆ€μ‚°κΉŒμ§€ κ°€λŠ” μ΅œλ‹¨ κ²½λ‘œκ°€ 80km일 λ•Œ 전체 경둜의 μ΅œλ‹¨ κ±°λ¦¬λŠ” 이 두 λΆ€λΆ„ 문제의 ν•΄κ²° 방법을 ν•©μΉœ 280kmκ°€ λ©λ‹ˆλ‹€. λ”°λΌμ„œ, λ³΅μž‘ν•œ 문제의 μ΅œμ ν•΄λŠ” κ·Έ 문제λ₯Ό κ΅¬μ„±ν•˜λŠ” 더 μž‘μ€ λΆ€λΆ„ λ¬Έμ œλ“€μ˜ μ΅œμ ν•΄λ₯Ό κ²°ν•©ν•¨μœΌλ‘œμ¨ 찾을 수 μžˆλ‹€λŠ” 것이 졜적 λΆ€λΆ„ ꡬ쑰의 핡심 μ›λ¦¬μž…λ‹ˆλ‹€.

 

νƒμš•λ²• 문제 적용

import java.util.*;

class Solution {
    public int solution(int n, int[] lost, int[] reserve) {

        // λ°°μ—΄λ‘œ 체윑볡 보유 μ—¬λΆ€
        int[] students = new int[n];
        
        // μžƒμ–΄λ²„λ¦° 학생
        for (int i : lost){
            students[i - 1]--;
        }
        // 가지고 μžˆλŠ” 학생
        for (int j : reserve){
            students[j - 1]++;
        }
        
        // 빌렀쀌
        for (int k = 0; k < students.length; k++){
            //λ„λ‚œ
            if(students[k] == -1){
                //μ•ž 번호 μ—¬λ²Œ 체윑볡
               if(k - 1 >= 0 && students[k-1] == 1){
                   students[k]++;
                   students[k - 1]--;
                //λ’· 번호 μ—¬λ²Œ 체윑볡
               } else if (k + 1 < students.length && students[k + 1] == 1) {
                   students[k]++;
                   students[k + 1]--;
               }
            }
        }
        // λ“£λŠ” ν•™μƒμˆ˜
        int studentsCount = 0;
        for (int s : students) {
            if(s>=0){
                studentsCount++;
            }
        }
        return studentsCount;
    }
}

초기 μ„€μ •

ν•™μƒλ“€μ˜ 체윑볡 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ λ°°μ—΄ studentsλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” ν•΄λ‹Ή ν•™μƒμ˜ 체윑볡 보유 μƒνƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€ (κΈ°λ³Έκ°’ 0: μ²΄μœ‘λ³΅μ„ λ”± 맞게 가지고 있음, -1: μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦Ό, 1: μ—¬λΆ„μ˜ 체윑볡이 있음).

 

체윑볡 μƒνƒœ μ—…λ°μ΄νŠΈ

λ¨Όμ € lost 배열을 μˆœνšŒν•˜μ—¬ μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° ν•™μƒμ˜ students λ°°μ—΄μ—μ„œ ν•΄λ‹Ή ν•™μƒμ˜ 값을 -1둜 κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.

reserve 배열을 μˆœνšŒν•˜μ—¬ μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ 가진 ν•™μƒμ˜ students λ°°μ—΄μ—μ„œ ν•΄λ‹Ή ν•™μƒμ˜ 값을 1둜 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

 

체윑볡 빌렀주기

students 배열을 μˆœνšŒν•˜λ©΄μ„œ μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생(-1)을 μ°ΎμŠ΅λ‹ˆλ‹€.

각 μžƒμ–΄λ²„λ¦° 학생에 λŒ€ν•˜μ—¬, μ•ž 번호 학생뢀터 μ—¬λΆ„μ˜ 체윑볡(1)을 가진 학생이 μžˆλŠ”μ§€ ν™•μΈν•˜κ³ , μžˆλ‹€λ©΄ κ·Έ ν•™μƒμœΌλ‘œλΆ€ν„° μ²΄μœ‘λ³΅μ„ λΉŒλ¦½λ‹ˆλ‹€. μ•ž 번호 ν•™μƒμ—κ²Œμ„œ 빌릴 수 μ—†λŠ” 경우, λ’· 번호 ν•™μƒμ—κ²Œμ„œ λΉŒλ¦½λ‹ˆλ‹€.

μ—¬λΆ„μ˜ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ λ•Œλ§ˆλ‹€ ν•΄λ‹Ή ν•™μƒμ˜ students λ°°μ—΄ 값을 μ‘°μ •ν•˜μ—¬, μ²΄μœ‘λ³΅μ„ 빌린 학생은 0으둜 (μ²΄μœ‘λ³΅μ„ 가진 μƒνƒœλ‘œ), μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€€ 학생은 1μ—μ„œ 0으둜 μ‘°μ •ν•©λ‹ˆλ‹€.

 

체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” 학생 수 계산

λ§ˆμ§€λ§‰μœΌλ‘œ, students 배열을 μˆœνšŒν•˜λ©΄μ„œ μ²΄μœ‘λ³΅μ„ 가지고 μžˆλŠ” ν•™μƒμ˜ 수λ₯Ό μ„Έμ–΄ (students λ°°μ—΄μ˜ 값이 0 λ˜λŠ” 1인 학생), 이λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

 

νƒμš•μ  μ„ νƒμ˜ 적용

이 λ¬Έμ œμ—μ„œ νƒμš•μ  선택은 μžƒμ–΄λ²„λ¦° 학생이 μ²΄μœ‘λ³΅μ„ 빌릴 수 μžˆμ„ λ•Œ, κ°€λŠ₯ν•œ ν•œ κ°€κΉŒμš΄ 번호의 ν•™μƒμœΌλ‘œλΆ€ν„° λΉŒλ¦¬λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 방식은 각 λ‹¨κ³„μ—μ„œ μ§€μ—­μ μœΌλ‘œ 졜적의 선택을 ν•˜μ—¬, μ „μ²΄μ μœΌλ‘œλ„ μ΅œλŒ€ν•œ λ§Žμ€ 학생이 체윑 μˆ˜μ—…μ„ 듀을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ§€μ—­μ μœΌλ‘œ μ΅œμ μ΄λž€, μžƒμ–΄λ²„λ¦° 학생 λ°”λ‘œ μ•žμ΄λ‚˜ λ°”λ‘œ λ’€μ˜ ν•™μƒμœΌλ‘œλΆ€ν„° μ²΄μœ‘λ³΅μ„ λΉŒλ¦¬λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ νƒμš•μ  μ ‘κ·Ό 방식은 이 문제의 ꡬ쑰와 λ§žμ•„λ–¨μ–΄μ Έ, μ „μ²΄μ μœΌλ‘œλ„ 졜적의 κ²°κ³Ό(μ΅œλŒ€ν•œ λ§Žμ€ 학생이 체윑 μˆ˜μ—…μ„ λ“£λŠ” 것)λ₯Ό λ„μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

728x90

'μ•Œκ³ λ¦¬μ¦˜' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

μˆ˜μ‹ ν‘œκΈ°λ²•  (0) 2024.02.26
ν•΄μ‹œλ²•  (0) 2024.02.20
기수 μ •λ ¬  (0) 2024.01.04