체μ‘볡
https://programmers.co.kr/learn/courses/30/lessons/42862#
λ¬Έμ
λ¬Έμ μ€λͺ
μ μ¬μκ°μ λλμ΄ λ€μ΄, μΌλΆ νμμ΄ μ²΄μ‘볡μ λλλΉνμ΅λλ€. λ€νν μ¬λ² 체μ‘λ³΅μ΄ μλ νμμ΄ μ΄λ€μκ² μ²΄μ‘볡μ λΉλ €μ£Όλ € ν©λλ€. νμλ€μ λ²νΈλ 체격 μμΌλ‘ λ§€κ²¨μ Έ μμ΄, λ°λ‘ μλ²νΈμ νμμ΄λ λ°λ‘ λ·λ²νΈμ νμμκ²λ§ 체μ‘볡μ λΉλ €μ€ μ μμ΅λλ€. μλ₯Ό λ€μ΄, 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λͺ
μ΄ μ²΄μ‘μμ
μ λ€μ μ μμ΅λλ€.
μ½λ
- μ΄λ ΅κ² μκ°ν νμ΄ (ν΅κ³Ό x)
#include <string>
#include <vector>
using namespace std;
int getSuit(vector<int>& lost, vector<int> reserve, int attempt){
if(attempt>=lost.size()) // λͺ¨λ lost νμμ λ€ κ³ λ €νμ λ
return reserve.size();
if(reserve.size()==0) // λͺ¨λ reserve νμμ΄ μ²΄μ‘볡μ λ€ λΉλ €μ€¬μ λ
return 0;
int reserve_num = reserve.size();
int lost_num = lost[attempt]; // 체μ‘볡μ μ°Ύμμ€μΌνλ νμ
int flag =0;
for(int i=0; i<reserve.size(); i++){
auto pos = reserve.begin()+i;
if(reserve[i]==lost_num-1){ // reserveκ° μμΌλ©΄ reserveμμ μμ€ ν μ¬κ· νΈμΆ
reserve.erase(pos);
int tmp = getSuit(lost, reserve, attempt+1);
reserve.insert(pos, lost_num-1);
if(reserve_num > tmp)
reserve_num = tmp;
flag =1;
}else if(reserve[i]==lost_num+1){
reserve.erase(pos);
int tmp = getSuit(lost, reserve, attempt+1);
reserve.insert(pos, lost_num+1);
if(reserve_num > tmp)
reserve_num = tmp;
flag =1;
}
}
if(flag==0){ // λ§λ reserveκ° μμ
int tmp = getSuit(lost, reserve, attempt+1); // λ€λ₯Έ lost νμ 체μ‘볡 μ°Ύμμ£ΌκΈ°
if(reserve_num > tmp)
reserve_num = tmp;
}
return reserve_num;
}
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
int num_of_give = reserve.size()-getSuit(lost, reserve, 0);
int num_of_left_lost = lost.size()-num_of_give;
answer = n-num_of_left_lost;
return answer;
}
쑰건μ μ°Ύμμ μ¬κ·λ‘ νΈλ λ°©μ
- μ½κ² μκ°ν νμ΄ (ν΅κ³Όo)
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
int size = lost.size();
int r_size = reserve.size();
int count = 0; // lost μ€ μ²΄μ‘볡μ μ»μ νμ μ
for(int i=0; i<size; i++){
for(int j=0; j<r_size; j++){
if(lost[i]==reserve[j]) { // λλλΉν νμ == μ¬λ² 체μ‘볡 νμ
count++;
lost[i]=-1;
reserve[j]=-1;
break;
}
}
}
for(int i=0; i<size; i++){
if(lost[i]==-1) // μ΄λ―Έ 체μ‘볡μ μ»μ μμ΄μ΄λ©΄
continue;
for(int j=0; j<r_size; j++){
if(lost[i]+1 == reserve[j] || lost[i]-1 == reserve[j]){
reserve[j]=-1;
// lost[i]=-1;
count++;
break;
}
}
}
answer = n-size+count;
return answer;
}
νμ΄
μ΄λ κ² μ λ ₯μ λ²μκ° μμ λ¬Έμ λ κ·Έλ₯ λΉ λ₯΄κ² μμ νμμΌλ‘ νμ΄μΌνλ€. μμ κ°λ¨ν νμ΄λΌκ³ μ μ΄λ κ²λ λ€λ₯Έ μ¬λμ νμ΄λ₯Ό 보λ μ¬μ€μ 볡μ‘λκ° λμ νμ΄μλ€.
κ°λ¨ν νμ΄λ student λ°°μ΄μ λ§λ€μ΄ lostμ ν΄λΉνλ νμμ -1, reserveμ ν΄λΉνλ νμμ +1 ν ν, -1μΈ νμλ€λ§ μ£Όμμ 1μΈ νμμ΄ μλμ§ λ΄μ£Όλ©΄ λλ μμ΄λ€. μ΄λ κ² νλ©΄ O(n)λ§μ ν μ μλ€.
κ°λ¨ν λ¬Έμ μΌ μλ‘ λ³΅μ‘νκ² μκ°ν΄μ λ μ΄λ €μ΄ κ² κ°λ€..! μ λ ₯μ μκ° μμΌλ©΄ Greedy. κΈ°μ΅νμ.
Comment