티스토리 뷰
성공 코드(내 코드)
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
answer=n-lost.size();
// lost와 reserve를 오름차순으로 정렬하기
sort(lost.begin(), lost.end());
sort(reserve.begin(), reserve.end());
for(int i=0; i<lost.size(); i++){
for(int j=0; j<reserve.size(); j++){
if(lost[i]==reserve[j]){
answer++;
// 해당 lost의 원소 지우고 i--를 해주어야 놓치지 않고 탐색 가능
lost.erase(lost.begin()+i--);
// 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
reserve.erase(reserve.begin()+j--);
break;
}
}
}
for(int i=0; i<lost.size(); i++){
for(int j=0; j<reserve.size(); j++){
if(lost[i]-1 == reserve[j]){
answer++;
// 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
reserve.erase(reserve.begin()+j--);
break;
}
if(lost[i]+1 == reserve[j]){
answer++;
// 해당 reserve의 원소 지우고 j--를 해주어야 놓치지 않고 탐색 가능
reserve.erase(reserve.begin()+j--);
break;
}
}
}
return answer;
}
➕ 2023.01.08 풀이
- 벡터 st를 만들어 모든 학생들이 가지고 있는 체육복 수를 표현한다.
- 처음에는 모두 1로 초기화 한다.
- lost 벡터를 탐색하며 체육복을 잃어버린 학생의 st 값을 1 감소시킨다.
- reserve 벡터를 참색하며 체육복을 여분으로 가지고 있는 학생의 st 값을 1 증가시킨다.
- 벡터 st로 1번째 학생부터 탐색하며 해당 학생이 2벌의 체육복을 가지고 있는 경우
- 바로 앞번호 학생이 체육복이 없는 경우 체육복을 빌려준다.
- 또는 바로 뒷번호 학생이 체육복이 없는 경우 체육복을 빌려준다.
- 빌려줄 때, 자신의 체육복 개수를 하나 줄이고 빌려받는 학생의 체육복 개수를 하나 증가시킨다.
- 벡터 st를 1번째 학생부터 탐색하며 체육복을 1개 이상 가지고 있는 경우 answer를 1씩 증가시킨다.
🤨 풀고 보니 밑에 풀이 방법이랑 비슷하네요 !
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
vector<int> st(32, 1);
for(int i=0; i<lost.size(); i++){
st[lost[i]]--;
}
for(int i=0; i<reserve.size(); i++){
st[reserve[i]]++;
}
for(int i=1; i<=n; i++){
if(st[i]==2){
if(st[i-1]==0){
st[i]--;
st[i-1]++;
} else if(st[i+1]==0){
st[i]--;
st[i+1]++;
}
}
}
for(int i=1; i<=n; i++){
if(st[i]>=1){
answer++;
}
}
return answer;
}
다른 풀이 코드
- student 배열을 사용하여 체육복 여분 하나 더있는 학생은 +1, 없는 학생은 -1 해준다.
- student[i]의 값이 -1인 경우
- student[i-1]이 1이면 student[i]에게 빌려주고
- student[i-1]에게 못빌리는 경우 student[i+1]이 1이면 student[i]에게 빌려준다.
- student[i-1]이 1이면 student[i]에게 빌려주고
#include <string>
#include <vector>
using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for(int i : reserve) student[i] += 1;
for(int i : lost) student[i] += -1;
for(int i = 1; i <= n; i++) {
if(student[i] == -1) {
if(student[i-1] == 1)
student[i-1] = student[i] = 0;
else if(student[i+1] == 1)
student[i] = student[i+1] = 0;
}
}
for(int i = 1; i <=n; i++)
if(student[i] != -1) answer++;
return answer;
}
'알고리즘' 카테고리의 다른 글
[프로그래머스/c++] 폰켓몬 (0) | 2022.08.18 |
---|---|
[프로그래머스/c++] 완주하지 못한 선수 (0) | 2022.08.18 |
[프로그래머스/c++] 실패율 (0) | 2022.08.16 |
[백준 2579번/c++] 계단 오르기 (0) | 2022.08.10 |
[백준 1149번/c++] RGB거리 (0) | 2022.08.10 |