공부를 하다보면 이런 생각들이 무구하게 떠오르곤 합니다.
이번 글에서는 특히 알고리즘을 공부할 때 알아두면 좋은 것들을 차근히 정리해보겠습니다.
차후에 알아나가는 것들이 있으면 정리하여 추가하도록 하겠습니다.
하지만 무조건 C++로만 풀자는 것은 아니고 C++에서 하기 까다로운 것들(문자열 처리 등)에서 Python을 부수적으로 이용하면 좋습니다.
이유는 다음과 같습니다.
실행 속도의 차이인데요, Python이 월등히 느리기에 그렇습니다. 알고리즘의 종류에 따라 다르지만 5배에서 100배까지 차이나는 경우가 있습니다.
본 글은 C++을 기준으로 작성하도록 하겠습니다.
위 헤더는 미리 수많은 헤더들을 다 include 해둬서 따로 다 일일이 하나하나 include 할 필요가 없도록 해줍니다.
다만 msvc 컴파일러(visual studio 2017/2019)에서는 사용할 수 없는데, 따로 처리를 해주거나 대표적이고 자주 사용하는 헤더들을 외워두는 게 좋습니다.
이것은 실수 자료형의 특징 때문인데요, 예를 들어 0.1 + 0.1 + 0.1이 컴퓨터에서는 0.3이 아닙니다. 0.1은 이진수로 나타내면 무한소수라 컴퓨터 메모링의 유한성에 의해 오차가 발생합니다. 실수 자료형의 특징을 설명하려면 긴 페이지를 할애해야 하니 이러하다라는 것만 알고 넘어갑니다.
마찬가지로 실수 자료형의 특징 때문인데요. 다음과 같이 해봅시다.
int main(void){
double a = 0.1 + 0.1 + 0.1;
double b = 0.3;
if(a == b) cout << "equals";
if(abs(a - b) < 1e-12) cout << "equals by function";
return 0;
}
result: equals by function
이 역시 위에서 설명한 실수 자료형의 특징 때문인데요, 실수 자료형은 등호로 비교하지 않고 오차 범위로 비교합니다. 둘의 차이가 충분히 작으면 같다고 치는 거죠. 대신 그 차이의 값이 1^(-12)과 같은 매우 작은 값인 것입니다.
다음과 같은 코드를 봅시다.
int main(void){
string s;
getline(cin, s);
cout << s;
}
input: Hello World!
output: Hello World!
위와 같이 공백이 포함된 문자열을 입력으로 받을 때엔 getline() 함수를 사용하도록 합니다.
C 표준 입출력과의 연결을 끊는 코드와 버퍼를 한번에 비우는 코드입니다. 입출력 시간을 단축시켜주므로 꼭 써주도록 합니다.
endl은 라인을 바꾸고 버퍼를 비우는 코드인데, 이미 저희는 cin.tie(0);을 통해 버퍼를 한번에 비우기로 했습니다. 부디 쓰지 말아주시길 바랍니다.
줄바꿈이 필요하시면 개행문자를 출력하여 주시길 부탁드립니다.
채점 서버는 테스트 케이스에서 딱 채점할 부분 까지만 봅니다. 그러니 맨 마지막에 오는 공백이나 줄바꿈에 대해 걱정하지 않으셔도 됩니다.
참고한 내용은 다음과 같습니다.
https://blog.encrypted.gg/921?category=773649
https://blog.encrypted.gg/965
https://blog.encrypted.gg/922?category=773649
https://blog.encrypted.gg/923?category=773649