코딩테스트 진행
70218. 내적 풀이 코드
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> a, vector<int> b) {
int answer = 0;
for (int i = 0; i < a.size(); ++i) {
answer += a[i] * b[i];
}
return answer;
}
77883. 약수의 개수와 덧셈 풀이코드
#include <string>
#include <vector>
#include <numeric>
using namespace std;
int getDivisorCount(int num) {
vector<int> divisorVec;
for (int i = 1; i <= num; ++i) {
if (num % i == 0) {
divisorVec.push_back(i);
}
}
return divisorVec.size() % 2 == 0 ? 1 : -1;
}
int solution(int left, int right) {
int answer = 0;
for (int i = left; i <= right; ++i) {
answer += getDivisorCount(i) * i;
}
return answer;
}
12917. 문자열 내림차순으로 배치하기 풀이코드
#include <string>
#include <vector>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
string solution(string s) {
sort(s.begin(), s.end(), greater<char>());
return s;
}
memcpy()
어떤 변수의 메모리에 있는 값들을 다른 변수의 “특정 메모리값”으로 복사
Array를 깊은 복사할 때 사용
void * memcpy (void * destination, const void * source, size_t num);
#include <bits/stdc++.h>
using namespace std;
int main(void) {
int v[3] = { 1, 2, 3};
int ret[3];
memcpy(ret, v, sizeof(v));
cout << ret[1] << endl; // ret[1] -> 2
ret[1] = 100;
cout << ret[1] << endl; // ret[1] -> 100
cout << v[1] << endl; // v[1] -> 2 = ret는 깊은 복사가 되어서 값 변화 없음
}
// 이런식으로 원본 배열을 보존하는 방법도 가능하다.
#include <bits/stdc++.h>
using namespace std;
int a[5], temp[5];
int main() {
for(int i = 0; i < 5; i++) a[i] = i;
memcpy(temp, a, sizeof(a));
for(int i : temp) cout << i << ' '; // temp = { 0, 1, 2, 3, 4 }
cout << endl;
a[4] = 1000;
for(int i : a) cout << i << ' '; // a = {0, 1, 2, 3, 1000}
cout << endl;
memcpy(a, temp, sizeof(temp));
for(int i : a) cout << i << ' '; // a = {0, 1, 2, 3, 4}
cout << endl;
}
하지만 memcpy()는 vector에서는 깊은 복사가 되지 않는다.
→ memcpy()는 Trivially Copyable인 타입이 아닌 경우 함수 자체가 제대로 동작하지 않습니다.
*Trivially Copyable는 C++에서 객체를 “단순히 메모리 복사로 안전하게 복사할 수 있는 타입”
객체의 데이터를 복사할 때 특별한 처리 없이 메모리만 복사해도 문제가 없는 타입을 말합니다.
// is_trivial을 통해서 해당 타입이 TriviallyCopyable한지 확인 할 수 있다.
#include <bits/stdc++.h>
using namespace std;
struct A {
vector<int> intVec;
};
struct B {
int intArray[4];
};
int main() {
cout << "intVec is_trivial -> " << is_trivial<A>::value << endl;
cout << "intArray is_trivial -> " << is_trivial<B>::value << endl;
// intVec is_trivial -> 0
// intArray is_trivial -> 1
// Array는 TriviallyCopyable한 타입이지만 vector는 아니다.
}
copy()
memcpy()와 똑같은 동작을 하는 함수 그러나 vector와 array 모두 사용 가능하다.
copy(InputIterator first, InputIterator last, OutputIterator result)
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v {1, 2, 3};
vector<int> ret(3);
copy(v.begin(), v.end(), ret.begin());
cout << ret[1] << endl; // 2
ret[1] = 100;
cout << ret[1] << endl; // 100
cout << v[1] << endl; // 2
}
정상적으로 vector도 깊은 복사가 되어서 값이 변하지 않는 현상을 볼 수 있다.
sort()
배열 등 컨테이너들의 요소를 정렬하는 함수. → 시간복잡도는 O(nlogn)
sort(first, last, *커스텀비교함수);
#include <bits/stdc++.h>
using namespace std;
vector<int> a;
// 커스텀 정렬 메서드
bool cmp (int a, int b) {
return a > b;
}
int main() {
vector<int> a = {1, 24, 13, 443, 5};
// 오름차순 정렬
sort(a.begin(), a.end(), less<int>());
for(int i : a) cout << i << ' ';
cout << endl;
// 내림차순 정렬
sort(a.begin(), a.end(), greater<int>());
for(int i : a) cout << i << ' ';
cout << endl;
// 커스텀 정렬
sort(a.begin(), a.end(), cmp);
for(int i : a) cout << i << ' ';
cout << endl;
}
stable_sort()
만약 들어온 순서대로 정렬하고 싶다면 sort()가 아닌 stable_sort()를 사용
sort()와 stable_sort()의 차이
sort() → 정렬의 안정성 X , 성능이 중요시되나 데이터의 상대적인 순서가 변할 수 있다.
stable_sort() → 정렬의 안정성 O, 정렬된 후에도 데이터의 상대적인 순서가 중요할 때 적합
unique()
중복되는 요소를 제거하고 나머지 요소들을 삭제하지 않고 그대로 두는 함수.
앞에 숫자와 비교하는 로직으로 사용할 때 sort()로 정렬 후 중복되지 않는 부분을 지워서 사용한다.
#include <bits/stdc++.h>
using namespace std;
vector<int> v {2, 2, 5, 5, 1, 1, 2, 2, 4, 5, 6, 5};
int main() {
// 1. 오름차순 정렬
sort(v.begin(), v.end());
// 2. unique로 중복값 제거 후 마지막 값에서 끝에까지 제거
v.erase(unique(v.begin(), v.end()), v.end());
for (int i : v) cout << i << " ";
cout << endl;
}
// 1 2 4 5 6
accumulate()
배열의 합을 쉽고 빠르게 구해주는 함수
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 4, 5};
int sum = accumulate(v.begin(), v.end(), 0);
cout << sum << endl; // 15
}
max_element()
배열 중 가장 큰 요소를 추출하는 함수
이터레이터를 반환하므로 역참조 포인터로 값을 가져올 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v = {1, 2, 3, 12, 5, 6, 7};
int a = *max_element(v.begin(), v.end());
auto b = max_element(v.begin(), v.end());
cout << "값: " << a << endl; // 12
cout << "인덱스: " << (int)(b - v.begin()) << endl; // 3
}
min_element()
배열 중 가장 작은 요소를 추출하는 함수
이터레이터를 반환하므로 역참조 포인터로 값을 가져올 수 있다.
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v = {133, 244, 3222, 112, 55, 26, 1722};
int a = *min_element(v.begin(), v.end());
auto b = min_element(v.begin(), v.end());
cout << "값: " << a << endl; // 26
cout << "인덱스: " << (int)(b - v.begin()) << endl; // 5
}
과제 진행
3번 과제는 필수기능, 도전기능 진행 완료 했습니다.
https://github.com/SONSAZANG/20241230_Exam03
4번 과제는 필수기능 진행 완료 후 도전기능 확인 예정입니다.
https://github.com/SONSAZANG/20241230_Exam04