std::string::replace 함수
처음엔 for문을 통해 뒤에서 5번째 글자부터 첫 번째 글자까지 *로 바꾸었는데, string::replace 함수를 사용하면 더 가독성 있게 쓸 수 있음을 알게 되었다.
string& replace(size_t pos, size_t len, size_t n, char c);
- pos 는 시작 위치를 의미한다.
- len 은 기존 문자열에서 대체할 글자 수를 의미한다.
- n 은 새로 삽입할 글자 수를 의미한다.
- c 는 새로 삽입할 글자를 의미한다.
이 밖에도 replace 함수는 다양한 오버로딩을 제공한다.
std::binary_search
처음엔 왼쪽과 같이 find함수를 사용해서 문제를 풀었는데, 더 효율적인 방법이 없을까 생각해보며 잊고 있던 binary_search에 대해 다시 공부하였다.
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);
binary_search는 탐색의 시작과 끝의 이터레이터 중, Target Value 값이 존재하는지 bool 으로 반환하는 함수이며 <algorithm>헤더에 포함되어있다.
find 함수의 선형 탐색보다는 binary_search의 이진 탐색이, 찾고자 하는 데이터 테이블이 클수록 더욱 빠르다.
물론 위 문제에서는 vector의 크기가 크지 않기도 하고, binary_search를 하려면 vector의 값이 정렬되어있어야 하기 때문에 효율적이라고 볼 수는 없다.
binary_search에 대한 추가 정리: https://dong-grae.tistory.com/31
그래서 더 효율적인 방법에 대해 생각해보았고 아래와 같다.
#include <string>
#include <vector>
#include <numeric>
using namespace std;
int solution(vector<int> numbers) {
int answer = 0;
int RangeSum = (1 + 9) * 9 / 2; // 등차수열의 합
int NumberSum = accumulate(numbers.begin(), numbers.end(), 0); // vector 값의 총 합
return RangeSum - NumberSum;
}
문제에서 numbers의 숫자는 모두 다르다고 명시되어있기 때문에 중복된 숫자는 없다는 것을 의미한다.
그래서 1~9까지의 등차수열의 합에서 numbers vector에 있는 총 합을 빼면, 1~9까지의 숫자 중에 numbers에 없는 값의 합을 구할 수 있게 됨으로 이 방법이 가장 효율적이라고 생각된다.
등차수열에 관한 정리: https://dong-grae.tistory.com/27
'내배캠 > TIL' 카테고리의 다른 글
24.12.18 (수) (0) | 2024.12.18 |
---|---|
24.12.17 (화) (2) | 2024.12.17 |
24.12.10 (화) (1) | 2024.12.10 |
24.12.09 (월) (0) | 2024.12.09 |
24.12.06 (금) (0) | 2024.12.06 |