//체육복 level 1
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
if (!(2 <= n && n <= 30))
return false;
int answer = n;
int lostSize = lost.size();
int cnt = 0;
if (reserve.size() == 0) {
return answer = n - lostSize;
}
// 여벌의 체육복을 가져온 사람은 다른 사람한테 빌려주는게 아니라 꼭 자신이 입어야함!
// 그래서 먼저 처리해야 하는 것이다
for (int i = 0; i < lost.size(); i++) {
for (int j = 0; j < reserve.size(); j++) {
if (lost[i] == reserve[j]) {
lost[i] = -50; //임의의 수이자 학생번호가 아닌 수
reserve[j] = -100; //임의의 수이자 학생번호가 아닌 수이며 lost[i]와 일치하지 않는 수
cnt++;
break;
}
}
}
for (int i = 0; i < lost.size(); i++) {
for (int j = 0; j < reserve.size(); j++) {
if (lost[i] - 1 == reserve[j] || lost[i] + 1 == reserve[j]) {
lost[i] = -50; //임의의 수이자 학생번호가 아닌 수
reserve[j] = -100; //임의의 수이자 학생번호가 아닌 수이며 lost[i]와 일치하지 않는 수
cnt++;
break;
}
}
}
answer = answer - lostSize + cnt;
return answer;
}
int main() {
//int n = 5;
//vector<int> lost = { 2, 4 };
//vector<int> reserve = { 1, 3, 5 };
//cout << solution(5, lost, reserve) << endl;
//int n = 5;
//vector<int> lost = { 2, 4 };
//vector<int> reserve = { 3 };
//cout << solution(5, lost, reserve) << endl;
int n = 3;
vector<int> lost = { 3 };
vector<int> reserve = { 1 };
cout << solution(3, lost, reserve) << endl;
}
level1이지만 testcase하나가 계속 통과 못해서 난해했던 문제
주의할 사항이 2가지나 있었다.
1)
* 여벌을 가져온 사람이 체육복을 잃어버렸을 때는 반드시 자신이 그 체육복을 입어야 함. (이것 때문에 testcase 12개 중 마지막인 12번이 계속 걸렸음!)
* 그래서 lost[i] == reserve[j] 일 경우 2중 for문으로 순회하며 먼저 처리해줘야 한다.
2)
-50 과 - 100을 lost 와 reserve 중 조건에 일치 하는 벡터에 넣어준 이유는
erase를 했을 경우 자동으로 순서가 밀려서 i=1 일땨 lost[i], 즉 lost[1]을 지우면, i++ 되어 i=2 로 lost[2]로 넘어가지는데, lost[2]에 있던게 앞에 것을 지우면서 앞으로 자동으로 한칸씩 밀리기 때문이다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v = { 1,2,3,4,5 };
cout << v[0] << endl; //1출력
v.erase(v.begin() + 0);
cout << v[0] << endl; //1이 없어지므로서 2가 맨 앞으로 와서 2가 출력
//즉! 특정 원소를 제거하면 한칸씩 vector가 자동으로 밀려서 재배열된다.
}
* C++ erase 문법
C++ 벡터에서 특정원소 지우는 방법
-
erase(int position)
해당하는 위치의 원소를 지운다.
v.erase(v.begin()+4)는 벡터 v의 다섯 번째 원소를 지운다. -
erase(int start, int end)
해당하는 범위의 원소를 지운다. start는 포함하고, end는 포함하지 않는다.
v.erase(v.begin()+2, v.begin()+5)는 세 번째부터 다섯 번째 까지의 원소를 지운다.
https://programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복 | 프로그래머스
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다. 전체
programmers.co.kr
'[알고리즘] 문제풀이 연습' 카테고리의 다른 글
[프로그래머스] 같은 숫자는 싫어 level1 (0) | 2019.11.04 |
---|---|
[프로그래머스] 두 정수 사이의 합 level 1 (0) | 2019.11.04 |
[프로그래머스] 가운데 글자 가져오기 level 1 (0) | 2019.11.04 |
[프로그래머스] 나누어 떨어지는 숫자 배열 오름차순 (0) | 2019.11.03 |
[프로그래머스] 문자열 다루기 기본 level 1 (0) | 2019.11.03 |