본문 바로가기

C++ STL, 알고리즘12

float vs double c++ 부동소수점 문제 코딩 테스트 문제를 풀던 중 나누기 연산을 해야하는 문제가 있었다. 나누기 연산 후 소수점 아래 N자리 까지 반올림 연산을 해야하기 때문에 float를 사용하여 문제를 해결하고자 하였다. 하지만 예시를 모두 맞췄지만 문제를 해결할 수 없는 상황이 일어나 여러 고민과 주변인에게 조언을 구한 결과 실수의 자료형에 문제가 있다는 것을 알게 되었다. 먼저 float는 6자리까지 표현이 가능한 실수 자료형이다. 또한 double은 15자리까지 표현이 가능한 실수 자료형이다. 이러한 차이는 정수 부분이 긴 실수 인 경우 문제가 발생할 수 있다. 123456789.123을 두 자료형에 넣는 경우 float의 경우 123456792.000000이라는 값이 담아지고, double의 경우 123456789.123000이 .. 2023. 10. 12.
C++ 입출력 가속 코드 백준 문제를 풀다보면, c++로 코딩하였을때 알고리즘이 크게 문제가 없다고 느낄때가 종종 있으나, 시간초과로 인해서 문제가 틀리는 경우가 종종 발생하는 것 같다. 그럴때마다 사용하는 코드가 있는데, main함수 안에 다음과 같은 코드를 넣어주면 신기하게도 입출력 가속이 일어나서 합격한다. ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 그 이유가 늘 궁금했다. 아래 이유가 담긴 포스팅을 복사해왔다. 멀티스레딩과, printf, scanf 를 사용하지 않는 선에서 가속 코드를 적절히 추가해서 사용하는 것이 도움이 될 것 같다. ios::sync_with_stdio(false); stdio.h는 C에서 printf, scanf를 사용할 수 .. 2023. 10. 6.
[STL] vector unique 함수 vector 배열에서 중복되지 않는 원소들을 앞에서부터 채워나가는 함수이다. algorithm이라는 헤더에 존재하는 함수이다. unique함수를 사용하면 중복 없는 요소를 채운 후 남은 요소는 원래 배열의 요소를 그대로 넣는다. 즉, 중복되지 않는 원소들을 앞에서부터 채워나가는 역할을 하기때문에 남은 뒷부분은 그대로 vector 원소값이 존재한다. 또한 unique 함수가 끝나면 중복이 없는 요소의 끝 점을 반환한다. 중복을 완전히 제거하지 못하는 문제를 해결하기 위해 erase 함수를 사용해서 남은 뒷부분을 제거야한다. erase 함수는 vector 배열에서 특정 원소를 삭제하는 함수이다. v.erase(v.begin(), v.end()) 명령어를 입력하면 처음부터 끝까지 배열 내 모든 원소가 제거된다.. 2023. 10. 5.
이진탐색 단순 순회 알고리즘으로, 풀수 없는 백준 문제가 생겨나서 이진탐색 알고리즘을 복습하게 되었습니다. (1654번) 이진탐색 이란? - 정렬된 배열에서 검색 범위를 줄여 나가면서 검색 값을 찾는 알고리즘. 시간 복잡도 - O(logN) 정렬된 배열의 중간값을 임의로 선택하여 찾고자 하는 키(key) 값과 비교하는 탐색 알고리즘. 중앙값을 기준으로 왼쪽 오른쪽 탐색을 달리한다. 반복, 재귀, STL 이용하여 구현가능 //반복문을 이용한 이진탐색을 이용하여 탐색 bool BinarySearch(int *arr, int len, int key){ int start = 0; int end = len-1; int mid; while(end - start >= 0) { mid = (start + end) / 2; //.. 2023. 10. 4.