프로그래머스 [Lv1] | 체육복

일단 코드를 후루룩 적어봤는데, 테스트가 통과돼서 제출을 했더니 오답
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for(int i=0; i<lost.size(); i++){
for(int j=0; j<reserve.size(); j++){
if(lost[i]-1 == reserve[j]){
cout<< "lost[" << i << "] = " << lost[i] << "를 삭제함 ";
lost[i] = -1;
cout<<"reserve[" << j << "] = " << reserve[j] << "를 삭제함\n";
reserve[j] = -1;
answer++;
break;
}
}
for(int j=0; j<reserve.size(); j++){
if(lost[i]+1 == reserve[j]){
cout<< "lost[" << i << "] = " << lost[i] << "를 삭제함 ";
lost[i] = -1;
cout<<"reserve[" << j << "] = " << reserve[j] << "를 삭제함\n";
reserve[j] = -1;
answer++;
break;
}
}
}
cout<< "\n\n";
for(int i=0; i<lost.size(); i++){
cout << lost[i] << " ";
}
cout<<"\n";
for(int i=0; i<reserve.size(); i++){
cout << reserve[i] << " ";
}
return n - (lost.size() - answer);
}
출력된 걸 확인해보면
아래 테스트 3개는 모두 알맞게 삭제된걸 확인할 수 있었다!!
근데 왜 틀렸을지 생각해보면... 저번에도 그랬던것처럼 vector.erase()를 하지 않고 불가능한 숫자인 -1로 값을 바꿔주면서 -1이면 삭제된 것으로 간주했다. 이 가정이 어느 테스트에서는 오류로 나타날 수 있어서 그랬던 걸까??
아니면 또 생각이 드는 것은 for문을 돌리며 lost[i]-1 을 찾은 후 없으면 lost[i]+1을 찾는 알고리즘 자체가 틀린걸까?
저 실패 2개는 도저히 어느 부분인지 모르겠어서 일단 위 블로그를 참고해서 -1로 값을 바꿨던 방법을 바꿔보기로 했다.
iterator를 써서 아예 list에서 erase를 시켜 줄 것임!!
그렇게 완성된 코드는
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = n-lost.size();
vector<int>::iterator it;
for(int i=0; i<lost.size(); i++){
int num = lost[i];
it = find(reserve.begin(), reserve.end(), num);
if(it != reserve.end()){
reserve.erase(it);
lost[i] = 0;
answer++;
}
}
for(int i=0; i<lost.size(); i++){
if(lost[i] == 0) continue;
it = find(reserve.begin(), reserve.end(), lost[i]-1);
if(it != reserve.end()){
reserve.erase(it);
answer++;
}
else {
it = find(reserve.begin(), reserve.end(), lost[i]+1);
if(it != reserve.end()){
reserve.erase(it);
answer++;
}
}
}
return answer;
}
출력문들 지워주고, for문을 돌면서 검사했던 것을 iterator을 사용해 find()로 찾았다.
그랬더니 거의 윗 블로그와 코드가 고냥 똑같은데.... 근데... 자꾸 실패2개가 뜨면서 틀린다고 한다...
도대체 뭐가 문제일까 싶어서 코드들을 위 블로그와 똑같이 바꾸었는데.. 또 실패
구글링을 해보니까 나와같은 문제를 겪고 있는 사람들이 많았다!!
그래서 아예 만점자들의 코드를 참고를 해보기로 했다.
[C++][알고리즘] 프로그래머스::체육복 풀이 (tistory.com)

고렇다면 모범 답안을 공부해보겠습니당


헉 그러고 어머나..

내가 사용했던 방법의 코드가 올라와있는데 댓글에 통과가 안된다고 뜬다. 아.. 이 방법은 프로그래머스에서 테스트케이스를 더 추가하면서 걸린듯