개요
코딩 테스트를 위해서 기본적으로 알고 있어야하는 내용을 정리한다. 꼭 필요한 기초이지만 어려운 내용!!
시간 복잡도
입력의 크기와 문제를 해결하는데 걸리는 시간의 상관관계를 의미한다.
컴퓨터는 1초에 3억 ~ 5억개의 연산을 처리할 수 있다.
연산이 단순한 연산(and, or, +, -)인지 복잡한 연산(*, /, 대입, 함수호출)인지에 따라 차이가 있을 수 있다.
시간 복잡도는 빅오표기법을 통해 계산한다.
빅오 표기법은 주어진 식을 값이 가장 큰 대표향만 남겨서 나타내는 법
- O(N) : 5n + 1, 10lgN + 10N
- O(N^2) : N^2 + 2n + 1
- O(1) : 4, 10, 100
빅오가 N이면 N번 연산한다고 생각한다.
공간 복잡도
입력의 크기와 문제를 해결하는데 필요한 공간의 상관관계를 의미한다.
코딩 테스트를 풀 때 많이 신경쓰지 않아도 되지만..
- 512MB = 1.2억개의 int 선언 가능
만 기억하자..!
정수 자료형
자료형 | byte | 최대값 | 최소값 |
char | 1 | 127 | -128 |
short | 2 | 2^15 - 1 | - 2^15 |
int | 4 | 2^31 - 1 | - 2^31 |
long long | 8 | 2^63 - 1 | - 2^63 |
Integer Overflow
자료형의 범위를 넘어가면 생기는 현상
int main(void) {
int a = 2000000000 * 2; //20억 * 2
cout << a;
}
//result -29424235
실수 자료형
자료형 | byte | 최대값 | 최소값 |
float | 4 | - | - |
double | 8 | - | - |
실수를 이진수로 나타내는 방법은
실수를 십진수로 표현하는 것과 비슷하다.
- 3561.234 = 3.561234 * 10^3
- 11101.001 = 1.1101001 * 2^4
여기서 1.1101001은 fraction, 2^4는 exponent에 저장된다.
정확히는 fraction에는 1. 부분은 제외한 1101001이 앞에서부터 저장된다.
정확히는 exponent에는 127 + 4가 저장된다.
실수는 오차가 생길 수 밖에 없다.
float은 10^6까지 표현가능하고 double은 10^15까지 표현가능하다.
따라서 float은 상대오차 10^6까지 안전하고 double은 10^15까지 안전하다.
무슨 뜻이지???
- 참값이 1이라고 할때 1- 10^6에서 1 + 10^6의 값을 가진다는게 보장된다.
따라서
- 오차가 훨씬 적은 double은 거의 무조건 사용한다.
- 문제 상의 오차 허용 단서를 보고 판단하자.
이외의 알아야할 점
- double에 long long 범위의 정수를 함부로 담으면 안된다. -> int는 괜찮다.
- 실수를 비교할 때는 등호를 사용하면 안된다. -> 대략 10^-12 이하면 동일하다고 처리 하는게 안전
if(abs(a - b) < 1e-12) cout << "same \n";
'Algorithm' 카테고리의 다른 글
[Algorithm] 옥상 정원 꾸미기 (백준 6198) (0) | 2024.12.29 |
---|---|
[Algorithm] 에디터 문제 풀이 (1) | 2024.12.22 |
[Algorithm] 배열 활용하기 (0) | 2024.12.19 |
[Algorithm]C++ 배열 (0) | 2024.12.19 |
[TIL] visual studio 2022에서 <bits/stdc++.h> (0) | 2024.12.17 |