본문 바로가기
공부,일/코딩테스트

탐욕법

by fromnothing1 2021. 11. 4.

 탐욕법 

- 각 순간에 최선의 경우를 택하는 방식 

 

단 순간의 최선이 결국 최대의 최선이 만족될때에만 실행 

 

https://programmers.co.kr/learn/courses/30/lessons/42862

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

#include <string>
#include <vector>
//#include <set>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    int count = 0;
    vector<int> pure_lost;
    
    for(auto it = lost.begin();it != lost.end(); it++)
    {
        auto it_s = find(reserve.begin(),reserve.end(),(*it));
        if(it_s == reserve.end()) 
        {
            pure_lost.emplace_back(*it);
        }
        else
        {
            reserve.erase(it_s);
        }
       
    }
     /*  
    for(auto it = pure_lost.begin();it != pure_lost.end(); it++)
    {
        cout << *it << endl;
    }
    */
    
    for(auto it = pure_lost.begin();it != pure_lost.end(); it++)
    {
        auto it_l = find(reserve.begin(),reserve.end(),(*it)-1);
        auto it_r = find(reserve.begin(),reserve.end(),(*it)+1);

        if(it_l != reserve.end()) // 왼쪽에 빌릴수 있나 ?
        {
            cout << "it_l "<< *it << ',' << *it_l <<endl;
            count++;
            reserve.erase(it_l);
            
        }
        else if(it_r != reserve.end()) // 오른쪽에 빌릴수 있나 ?
        {
            cout << "it_r "<< *it << ',' << *it_r <<endl;
            count++;
            reserve.erase(it_r);
        }
       
    }
    
    for(auto it = reserve.begin();it != reserve.end(); it++)
    {
        cout << *it << endl;
    }
    answer = n - pure_lost.size() + count;
    return answer;
}

 

'공부,일 > 코딩테스트' 카테고리의 다른 글

네트워크  (0) 2021.11.06
최소 비용 신장 트리 , 섬연결하기  (0) 2021.11.05
전화번호 목록  (0) 2021.10.24
tow sum  (0) 2021.10.24
코딩 테스트 사이트 모음  (0) 2021.10.18

댓글