벡터에 대한 학습
벡터에서의 중복 제거
벡터에서의 중복 제거는 sort, unique, erase를 활용하면 구현 가능하다.
sort와 unique는 algorithm 라이브러리에 포함되어 있다.
unique 함수는 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다.
연속된 중복 원소를 vector의 제일 뒷부분 쓰레기값으로 보내버린다.
unique가 끝났으면 반환되는 값은 vector의 쓰레기값의 첫 번째 위치가 된다.
이 때문에 unique 후에 바로 erase를 사용하면 되는 것이다.
erase 함수는 vector 배열에서 특정 원소를 삭제하는 함수이다.
v.erase(v.begin()+s, v.begin()+e) 일 경우 [s, e) 원소가 삭제된다. s는 포함, e는 미포함(열린 구간)
그러니까 v.erase(unique(v.begin(), v.end()), v.end()); 일 경우
unique가 반환하는 쓰레기값부터 v.end()까지(열린구간) 삭제하는 것이다.
그렇다면 { 2, 5, 2, 4, 6, 7, 6 } 벡터를 정렬하고 중복을 제거해보자
답이 { 2, 4, 5, 6, 7 } 이 나와야 한다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> v = {2, 5, 2, 4, 6, 7, 6};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
for(int i=0; i<v.size(); i++) {
cout << v[i] << " ";
}
return 0;
}
// 결과
// 2 4 5 6 7
// 이 출력된다.
성공적으로 벡터의 중복을 제거하였다.
중복을 제거하였으므로 v.size() == 벡터의 서로 다른 원소의 개수임을 이용해서 문제를 해결할 수도 있을 것 같다.
벡터에서의 중복된 원소 개수 구하기
만약 벡터에서 중복된 원소의 개수를 구하라고 하면 어떻게 구하면 좋을까?
검색해도 자료가 별로 없는 것 같아서 직접 작성하고 사용하기로 결심했다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
vector<int> v = {2, 7, 4, 5, 6, 7, 2, 7, 8, 8, 8};
vector<int> vv;
vector<int> b;
int n;
int a, c;
int countN = 1;
int vn;
sort(v.begin(), v.end()); // 2 2 4 5 6 7 7 7 8 8 8
for(int i=0; i<v.end()-v.begin(); i++) {
if (i < v.end()-v.begin()-1) {
if (v.at(i) == v.at(i+1)) {
countN++;
}
else {
cout << v.at(i) << "의 개수: " << countN << "\n";
vn = countN;
vv.push_back(vn);
countN = 1;
}
}
else if(i == v.end()-v.begin() - 1) {
cout << v.at(i) << "의 개수: " << countN << "\n";
vn = countN;
vv.push_back(vn);
}
}
// 지금까지 각 숫자의 개수를 새 벡터 vv에 저장함
// 1을 제외한 모든 수를 합하면 중복된 숫자의 개수가 된다.
int k = 0;
for(int i=0; i<vv.size(); i++) {
if (vv.at(i) > 1) {
k += vv.at(i);
}
}
cout << "중복된 숫자의 개수는: " << k;
return 0;
}
백준 문제풀이
백준 3052번 문제 : 나머지
문제 :
소스코드 :
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, nn;
vector<int> v;
// 10번째 줄 까지 수 입력받기
// 받은 수에서 42나눈 수들 vector에 push_back
for(int i=0; i<10; i++) {
cin >> n;
nn = n % 42;
v.push_back(nn);
}
// sort와 unique 이용해서 중복된 수 제거하고
// 서로 다른 값이 몇 개 있는지 출력하기
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
cout << v.size();
return 0;
}
백준 1546번 문제 : 평균
문제 :
소스코드 :
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
// 점수 중 최댓값 M, 모든 점수를 점수/M*100으로 수정
int n, a, fake;
float b;
float c = 0;
vector<int> v;
//vector<float> vv;
cin >> n;
for(int i=0; i<n; i++) {
cin >> a;
v.push_back(a);
}
float max = *max_element(v.begin(), v.end());
for (int i=0; i<v.size(); i++) {
b = v.at(i) / max * 100;
//vv.push_back(b);
c = c + b;
}
cout << c / v.size();
return 0;
}
백준 8985번 문제 : OX퀴즈
문제 :
소스코드 :
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
string a;
string b;
int k = 0;
int point = 0;
vector<string> v;
// 스트링 벡터에 n만큼 스트링들 저장
cin >> n;
for(int i=0; i<n; i++) {
cin >> a;
v.push_back(a);
}
// 각 인덱스에 있는 스트링 for문으로 읽어서 점수 계산
for(int i=0; i<v.size(); i++) {
for(int j=0; j<v[i].length(); j++) {
b = v.at(i);
char bStr = b.at(j);
if (bStr == 'O') {
k++;
point = point + k;
}
else {
k = 0;
}
}
cout << point << "\n";
k = 0;
point = 0;
}
return 0;
}
풀이 및 학습내용 :
bStr를 string으로 하고 if (bStr == "O") 해서 오류가 발생했었다.
bStr을 char형으로 받고 'O'를 해야한다.
백준 4344번 문제 : 평균은 넘겠지
문제 :
소스코드 :
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void repeat();
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int c;
cin >> c;
for(int i=0; i<c; i++) {
repeat();
}
return 0;
}
void repeat() {
int n;
cin >> n;
vector<int> v;
for(int i=1; i<=n; i++) {
int num;
cin >> num;
v.push_back(num);
}
double avg = 0;
for(int i=0; i<v.size(); i++) {
avg = avg + v.at(i);
}
avg = avg / n;
double over = 0;
for(int i=0; i<v.size(); i++) {
if (v.at(i) > avg) over++;
}
double result = (over / n) * 100;
cout << fixed;
cout.precision(3); // .000
cout << result << "%\n";
}
풀이 및 학습내용 :
함수를 이용하는 법
cout << fixed;
cout.precision(n);
으로 소수점 고정하는 법
지금까지 4단계인 1차원 배열까지 문제를 풀고 학습해보았다.
출처 :
https://www.acmicpc.net/problem/3052
3052번: 나머지
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
www.acmicpc.net
https://www.acmicpc.net/problem/1546
1546번: 평균
첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보
www.acmicpc.net
https://www.acmicpc.net/problem/8958
8958번: OX퀴즈
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수
www.acmicpc.net
https://www.acmicpc.net/problem/4344
4344번: 평균은 넘겠지
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
www.acmicpc.net
'C++ 코딩테스트 공부 (중단) > c++ 백준 문제풀이' 카테고리의 다른 글
#6 문자열1 (0) | 2022.03.28 |
---|---|
#5 함수 (0) | 2022.03.27 |
#4 1차원 배열(1) (0) | 2022.03.25 |
#3 반복문 (0) | 2022.03.23 |
#2 조건문 (0) | 2022.03.23 |