알고리즘을 공부할 때 참고하면 좋을 것들

Zinovy·2021년 11월 24일
0
post-thumbnail

왜 이걸 몰랐지?🤔

왜 이걸 이제 알았지?🤔

공부를 하다보면 이런 생각들이 무구하게 떠오르곤 합니다.

이번 글에서는 특히 알고리즘을 공부할 때 알아두면 좋은 것들을 차근히 정리해보겠습니다.

차후에 알아나가는 것들이 있으면 정리하여 추가하도록 하겠습니다.


알고리즘은 C++로 푸는 것이 좋다

하지만 무조건 C++로만 풀자는 것은 아니고 C++에서 하기 까다로운 것들(문자열 처리 등)에서 Python을 부수적으로 이용하면 좋습니다.

이유는 다음과 같습니다.

실행 속도의 차이인데요, Python이 월등히 느리기에 그렇습니다. 알고리즘의 종류에 따라 다르지만 5배에서 100배까지 차이나는 경우가 있습니다.

본 글은 C++을 기준으로 작성하도록 하겠습니다.


<bits/stdc++> 헤더를 사용하자

위 헤더는 미리 수많은 헤더들을 다 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)과 같은 매우 작은 값인 것입니다.


공백이 포함된 문자열을 받을 때에는 getline을 사용한다

다음과 같은 코드를 봅시다.

int main(void){
    string s;
    getline(cin, s);
    
    cout << s;
}

input: Hello World!
output: Hello World!

위와 같이 공백이 포함된 문자열을 입력으로 받을 때엔 getline() 함수를 사용하도록 합니다.


ios::sync_with_stdio(0); cin.tie(0);을 쓰고 시작한다

C 표준 입출력과의 연결을 끊는 코드와 버퍼를 한번에 비우는 코드입니다. 입출력 시간을 단축시켜주므로 꼭 써주도록 합니다.


endl을 사용하지 않는다

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

profile
개발자가 되고 싶어요

0개의 댓글