πŸ“šAlgorithm ------------/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ - νƒμš•λ²•(Greedy)/체윑볡/C++

bell22 2021. 8. 2. 14:57

μ•„λ¦¬μ•„λ‚˜μ°‘ Greedy λ…Έλž˜ μ’‹λ‹€λŠ₯

 

문제 μ„€λͺ…

μ μ‹¬μ‹œκ°„μ— 도둑이 λ“€μ–΄, 일뢀 학생이 μ²΄μœ‘λ³΅μ„ λ„λ‚œλ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.

λ‹€ν–‰νžˆ μ—¬λ²Œ 체윑볡이 μžˆλŠ” 학생이 μ΄λ“€μ—κ²Œ μ²΄μœ‘λ³΅μ„ 빌렀주렀 ν•©λ‹ˆλ‹€.

ν•™μƒλ“€μ˜ λ²ˆν˜ΈλŠ” 체격 순으둜 맀겨져 μžˆμ–΄,

λ°”λ‘œ μ•žλ²ˆν˜Έμ˜ ν•™μƒμ΄λ‚˜ λ°”λ‘œ λ’·λ²ˆν˜Έμ˜ ν•™μƒμ—κ²Œλ§Œ μ²΄μœ‘λ³΅μ„ λΉŒλ €μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, 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λͺ…이 μ²΄μœ‘μˆ˜μ—…μ„ 듀을 수 μžˆμŠ΅λ‹ˆλ‹€.

 


#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> student(n, 1);
    
    if( n < 2 || n > 30 ) return answer;
    if( lost.size() <0 || reserve.size() < 0 ) return answer;

    for ( auto l : lost )
        student[l-1]--;
    
    for ( auto r: reserve )
        student[r-1]++; 
    
    for( int i=0; i < student.size(); i++ )
    {
        if( student[i] > 0 )
            continue;
        if( i != 0 && student[i-1] >1 )
        {
            student[i-1]--;
            student[i]++;
        }
        else if( i != student.size()-1 && student[i+1] > 1 )
        {
            student[i+1]--;
            student[i]++;
        }
        else{}
    }
    

    for( auto s : student )
    {
        if( s > 0) 
            answer++;
    }
    
    return answer;
}

 

μ•„ μ²˜μŒμ— map으둜 studentλ₯Ό μ„ μ–Έν–ˆλ‹€κ°€

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•΄μ„œ vector둜 λ‹€μ‹œ ν’€μ—ˆλ‹€;;

λ‹€λ₯Έ λΆ„λ“€ 풀이 λ³΄λ‹ˆκΉŒ, intν˜• 배열을 μ„ μ–Έν•΄μ„œ ν•˜μ‹  뢄도 μžˆμ—ˆλŠ”λ°,

int ν˜• 배열도 νš¨μœ¨λ©΄μ—μ„œ 쒋을 λ“― ν•˜λ‹€

 

전체 학생 μˆ˜μ— λŒ€ν•œ studentλ₯Ό μ„ μ–Έ 해놓고, κΈ°λ³Έ 값을 1둜 μ„€μ •ν•˜μ˜€λ‹€

그리고 lost에 μžˆλŠ” 학생일 경우 ν•˜λ‚˜μ”© λΉΌμ£Όκ³ 

reserve에 μžˆλŠ” 학생일 경우 ν•˜λ‚˜μ”© 더해쀀 ν˜•μ‹μ΄λ‹€

 

그리고 μ•ž λ’€ 학생듀과 λΉ„κ΅ν•˜μ—¬ μ²΄μœ‘λ³΅μ„ 빌릴 수 μžˆλŠ”μ§€ μ²΄ν¬ν•œλ‹€

μ£Όμ˜ν•  점은 μ•ž λ’€λ₯Ό 비ꡐ할렀면

자료ꡬ쑰의 처음과 끝일 κ²½μš°λŠ” μ œμ™Έν•΄μ€˜μ•Ό ν•œλ‹€λŠ” 것이닀