λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/C++] 체윑볡(Greedy)

by nitronium102 2021. 8. 24.

문제 μ„€λͺ…

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€. λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€. ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄, λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 4번 학생은 3번 ν•™μƒμ΄λ‚˜ 5번 ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€. 체윑볡이 μ—†μœΌλ©΄ μˆ˜μ—…μ„ 듀을 수 μ—†κΈ° λ•Œλ¬Έμ— μ²΄μœ‘λ³΅μ„ 적절히 빌렀 μ΅œλŒ€ν•œ λ§Žμ€ 학생이 μ²΄μœ‘μˆ˜μ—…μ„ λ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

전체 ν•™μƒμ˜ 수 n, μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ lost, μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒλ“€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ reserveκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆλŠ” ν•™μƒμ˜ μ΅œλŒ“κ°’μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

 

μ œν•œμ‚¬ν•­

  • 전체 ν•™μƒμ˜ μˆ˜λŠ” 2λͺ… 이상 30λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν•œ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œμ˜ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ ν•™μƒμ˜ μˆ˜λŠ” 1λͺ… 이상 nλͺ… μ΄ν•˜μ΄κ³  μ€‘λ³΅λ˜λŠ” λ²ˆν˜ΈλŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ 체윑볡이 μžˆλŠ” ν•™μƒλ§Œ λ‹€λ₯Έ ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ—¬λ²Œ μ²΄μœ‘λ³΅μ„ κ°€μ Έμ˜¨ 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•Œ 이 학생은 μ²΄μœ‘λ³΅μ„ ν•˜λ‚˜λ§Œ λ„λ‚œλ‹Ήν–ˆλ‹€κ³  κ°€μ •ν•˜λ©°, 남은 체윑볡이 ν•˜λ‚˜μ΄κΈ°μ— λ‹€λ₯Έ ν•™μƒμ—κ²ŒλŠ” μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μ—†μŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예

n lost reserve return

5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1] 2

 

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

예제 #1
1번 학생이 2번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주고, 3번 ν•™μƒμ΄λ‚˜ 5번 학생이 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 5λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

예제 #2
3번 학생이 2번 ν•™μƒμ΄λ‚˜ 4번 ν•™μƒμ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주면 학생 4λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

풀이

01. λͺ¨λ“  ν•™μƒμ˜ 체윑볡 κ°œμˆ˜κ°€ λ“€μ–΄κ°ˆ 벑터λ₯Ό λ§Œλ“€κ³  0으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.

    1번 학생과 n번 ν•™μƒμ˜ μ•ž, λ’€ 학생을 ν¬ν•¨ν•˜μ—¬(μ‹€μ œλ‘œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠμŒ) n+2 크기의 벑터λ₯Ό λ§Œλ“ λ‹€.

02. μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생은 -1둜, μ—¬λΆ„μ˜ 체윑볡이 μžˆλŠ” 학생은 +1둜 값을 λ„£μ–΄μ€€λ‹€.

03. 전체 for문을 λŒλ©΄μ„œ μ²΄μœ‘λ³΅μ„ μžƒμ–΄λ²„λ¦° 학생이 μžˆλŠ” κ²½μš°μ—λŠ”, μ•žλ’€ ν•™μƒμ˜ 체윑볡 개수λ₯Ό ν™•μΈν•˜μ—¬ λΉŒλ €μ€„ 수 μžˆλŠ”μ§€ ν™•μΈν•œλ‹€. λ§Œμ•½ λΉŒλ €μ€„ 수 μžˆλ‹€λ©΄ λΉŒλ €μ€€ 학생과 받은 ν•™μƒμ˜ 체윑볡 개수λ₯Ό 0으둜 λ°”κΏ”μ€€λ‹€.

04. λ§ˆμ§€λ§‰μœΌλ‘œ for문을 λŒλ©΄μ„œ 체윑볡이 μžˆλŠ” ν•™μƒμ˜ 수λ₯Ό μ„Όλ‹€. 

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> student(n+2, 0);
    
    for (int i:lost){
        student[i]--;
    }
    
    for (int i:reserve){
        student[i]++;
    }
    
    for (int i=1; i<=n; i++){
        if (student[i] < 0){
            if (student[i-1] == 1){
                student[i]++;
                student[i-1]--;
            }
            else if (student[i+1]==1){
                student[i]++;
                student[i+1]--;
            }
        }
    }
    
    for (int i=1;i<=n;i++){
        if (student[i] >= 0)
            answer++;
    }
    
    return answer;
}

λŒ“κΈ€