티스토리 뷰
1. 시간 / 공간복잡도
- 시간복잡도(Time Complexity)
입력의 크기와 문제를 해결하는데 걸리는 시간의 상관관계
- 빅오표기법(Big-O Notation)
주어진 식을 값이 가장 큰 대표항만 남겨서 나타내는 방법
보통 시간복잡도를 표기할 때 빅오표기법을 이용
ex) O(N) : 5n+3, 2n+10logN, 10N
시간복잡도를 그래프로 나타내었을 때
우리가 유념해야 할 점!
무작정 코드를 짜지 않고, 문제를 제한 시간 내에 통과할 수 있는지 생각해봐야함
- 공간복잡도
코테 때 크게 신경쓰지 않아도 괜찮은 부분이긴 함!
512MB = 1.2억개의 int (int 하나가 4바이트니깐) 인 정도만 기억해도 좋음:)
2. 정수 자료형
short는 딱히 쓸 필요가 없음!
int 자료형이 속도나 메모리 활용도 면에서 가장 우수하지만 int 범위를 넘어가는 문제가 나온다면 long long을 활용해줘야함 (>> Integer Overflow 방지!)
- Integer Overflow 발생 예시
3. 실수 자료형
- Floating point number(부동소수점)
실수를 2진수로 표현하는 방법! float와 double 둘의 변환 방식에 살짝 차이가 있음.
sign 필드는 해당 수의 부호를 판단하는 부분임. 1이면 음수, 0이면 양수를 의미
exponent field는 지수를 저장하는 필드로, float일때는 127를 더하고 double일 때는 1023(11칸)을 더해줌
fraction field의 경우 소수점 자리에 위치한 부분을 순차적으로 적어줌. 왼쪽자리부터 2^(-1), 2^(-2) ... 순으로 진행됨
- 실수의 특징 😎 기억합시다!
1) 실수의 저장/연산 과정에서는 반드시 오차가 발생함
아래 예시를 보자.
int main(void) {
if(0.1+0.1+0.1 == 0.3) cout << "true";
else cout << "no no ...";
}
/***result***
no no...
*******/
위 예시를 본다면 당연히 true가 나와야 할 것 같지만, 실상 실행을 해보면 no no가 나오는 것을 볼 수 있음. 이는 실수형이 2진수로 변환이 되는 과정에서 오차가 발생하기 때문임.
유효숫자가 들어가는 fraction field 부분은 유한하기 때문에 2진수 기준으로 무한소수를 저장하려고 할 때 float는 23bit, double은 52bit만 잘라서 저장함. 예시의 0.1을 2진수로 나타내면 무한소수이기에 오차가 있는채로 저장이 되고, 결과적으로 no no가 출력된 것.
추가적으로 float는 상대 오차 10^(-6)까지 안전하고, double은 10^(-15)까지 안전함(±10^(-15) 오차 범위 갖는다는 뜻)
float 대신 double을 쓰자. float는 메모리 이점이 있지만 별로임..
2) double에 long long 범위의 정수를 함부로 담으면 안됨
double은 유효숫자가 15자리이지만, long long은 최대 19자리이기 때문에 double에 long long 범위의 정수를 담을 경우 오차 발생 가능
3) 실수를 비교할 때는 등호를 사용하면 안됨
등호 대신에 범위로 표현하는 게 굿!
int main(void){
double a = 0.1+0.1+0.1;
double b = 0.3;
if(a==b) cout << "same 1\n";
if(abs(a-b) < 1e-12) cout << "same 2\n"; /*1e-12는 10^(-12)를 표현한 값. 10^9은 1e9*/
}
/***result***
same 2
******/
'🥞 Algorithm > Algorithm-squirrels 스터디' 카테고리의 다른 글
[바킹독의 실전 알고리즘] 0x06강 - 큐 (0) | 2023.02.01 |
---|---|
[바킹독의 실전 알고리즘] 0x05강 - 스택 (0) | 2023.02.01 |
[바킹독의 실전 알고리즘] 0x04강 - 연결 리스트 (1) | 2023.01.30 |
[바킹독의 실전 알고리즘] 0x03강 - 배열 (1) | 2023.01.28 |
[바킹독의 실전 알고리즘] 0x02강 - 기초 코드 작성 요령 II (0) | 2023.01.27 |
- Total
- Today
- Yesterday
- Subnet
- 세오스
- vpc peering
- 로컬스토리지
- react
- VPC
- route table
- 쿠키
- NaCl
- refresh token
- access token
- DOM
- AWS
- 투포인터
- 리액트
- 바리바리
- AwsCloudClubs
- 정렬
- 이분탐색
- 면접을 위한 CS 전공지식 노트
- 로그인 기능 구현
- cloud
- 그리디
- JWT 토큰
- ceos
- jwt
- 프론트엔드
- 리액트를 다루는 기술
- IGW
- TypeScript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |