반응형
snowman95
코딩수련장
snowman95
전체 방문자
오늘
어제
  • 분류 전체보기 (229)
    • 앱테크 (3)
    • 옵시디언 (5)
    • 드라마, 영화 (1)
    • 개발자 이야기 (23)
    • 프로젝트 (10)
      • 프로젝트 방법론 (7)
      • 프로젝트 기록 (2)
      • Github (1)
    • 개발 지식 (0)
      • 디자인 패턴 (0)
    • 프론트엔드 개발 (5)
      • 테크트리 (2)
      • React.js (19)
      • ReactNative (2)
      • Next.js (6)
      • GraphQL (6)
      • 패키지 매니저 (2)
      • 라이브러리 (3)
      • 상태관리 라이브러리 (4)
      • Web 지식 (3)
      • HTML CSS (26)
      • Javascript (16)
      • 도구 (Tool) (3)
      • 성능 최적화 (1)
      • 디자인시스템 (0)
    • Python (53)
      • 모음집 (1)
      • 문법 (12)
      • 라이브러리 (15)
      • 알고리즘 (10)
      • 백준 문제풀이 (9)
      • 코딩테스트 (2)
      • 도구 (Tool) (3)
    • C++ (20)
      • 알고리즘 (6)
      • 삼성SW기출 (6)
      • 삼성 A형 (6)
    • 데이터사이언스 (1)
    • 인프라 (9)
      • 하드웨어 지식 (4)
      • Ansible (2)
      • Database (2)
      • 쉘스크립트 (1)
    • 주식 (0)
    • 취업 준비 (4)
      • 취업 이야기 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 기계식키보드 #nuphy
  • 공간복잡도
  • C++
  • 전공 요약 #운영체제
  • 언어
  • GraphQL
  • nextjs
  • 삼성SW역량테스트
  • 전공 요약 #데이터베이스
  • 티스토리챌린지
  • 면접
  • 나의 해방일지
  • 백준
  • 알고리즘
  • Next.js #graphql #tailwind.css
  • A형
  • 전공 요약 #네트워크
  • 삼성SDS
  • 오블완
  • 전공요약

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
snowman95

코딩수련장

C++/알고리즘

[실전 압축 알고리즘] - 시간, 공간 복잡도

2019. 8. 24. 19:41
728x90
반응형

본 게시글은 실전 기술을 정리해 놓은 '실전 압축' 입니다. 

C++ 기준으로 작성하였습니다.


시간 복잡도

 

작동하는 알고리즘의 수행시간을 정량화하는 것을 의미합니다. 


시간 복잡도를 표기하기 위한 방법에 빅-오, 빅-오메가, 세타 등이 있으며 

일반적으로 최악의 케이스(Worst Case)를 가정하고 계산 하므로 빅-오 표기법을 

빅오 표기법은 최고차항의 차수만을 표기합니다. 


N^3 + N^2 + N + 1 = O(N^3)

 


숫자 빨리 읽기

 

0을 3개씩 묶어서 숫자 단위를 빠르게 파악하도록 암기합니다.

숫자 읽기
1'000 천
1'000'000 백만
1'000'000'000 10억


배열을 만들 때 arr[10000000] 보다는 arr[10'000'000] 이런식으로    
작은 따옴표를 넣어서 가독성을 높이고 실수를 줄이도록 합니다.  
  
혹은 1e7로도 표현이 가능합니다. (대신 double형 입니다.)

 


시간 예측

 

컴퓨터는 1초에 대략 1-3억개의 연산을 수행할 수 있습니다.  

문제의 입력 데이터의 범위를 보고 대략적으로 시간이 얼마나 걸릴지 유추할 수 있어야 합니다.

제한 시간이 1초일 때 대략 이 정도의 입력 범위에서 
이 정도 효율의 알고리즘은 사용할 수 있고 없고를 판단할 수 있어야 합니다.

빅 오 N 1억 + a 정도의 시간이면 1초에 가능
O(N) 약 1억 1억
O(N*logN) 약 1000만  log(1000만) = 7.1 x 1000만 = 7100만
O(N^2) 약 10000 10000 x 10000   = 100,000,000
O(N^3) 약 500 500 x 500 x 500 = 125,000,000

이는 대략적인 수치이며 로직의 복잡성에 따라 예상보다 적을 수도 클 수도 있습니다.

 

 


공간 복잡도

 

l  정수 자료형  

자료형 크기 범위 쉽게 외우기
char 1byte -128~127 2^7-1
short int 2byte -32,768~32,767 3만
int 4byte -2,147,483,648~ 2,147,483,647 21억
long long int 8byte 9.2 * 10^18 = 9,223,372,036,854,775,807 18 ~ 19자리 수 정도

 

입력, 계산 과정, 계산 결과 모두 21억이 넘는지 반드시 고려해야 합니다.

 


l  실수 자료형

자료형 크기 범위 쉽게 외우기
float     4byte 3.4e +/- 38 (7 digits) 상대오차는 10^-7 정도 
double  8byte  1.7e +/- 308 (15 digits) 상대오차는 10^-15 정도

지수 표기법

e + a a만큼 오른쪽으로 소수점 이동
e - a a만큼 왼쪽으로 소수점 이동

3.4e+3이라면 3.4 * 1000 = 3400
  


정밀도를 위해 float보다는 double을 사용해야 합니다.

float는 그냥 사용할 일이 많은 없다고 생각하면 됩니다. 
괜히 썼다가 정밀도에서 문제 생기는 경우가 많아집니다.

 


숫자가 너무 커요

 

C++

 

만약 unsigned long long 을 벗어나는 너무 큰 숫자를 처리해야 하는 문제가 나온다면 
(Big Integer 문제)

string, char배열 혹은 구조체를 활용해야 됩니다.
구현에는 여러가지 방법이 있는데

1) 앞에서 부터 0 추가하여 자리수 맞추기

 

A와 B의 자릿수가 맞지 않을 때 앞에 0을 넣어서 맞춰줘서 계산합니다.


2) 뒤집어서 계산하는 경우 

 

아예 배열을 뒤집어 버려서 더한 뒤 다시 뒤집어 주는 방법이 있습니다.
올림 수를 그냥 다음 인덱스에 바로 더해버리면 되는 편리성이 있습니다.
이 때 rbegin, rend, reverse 를 사용하면 깔끔하게 작성이 됩니다.


혹은 굉장히 큰 숫자에 모듈러 연산을 한 결과를 구하는 문제도 있는데
중간 연산의 결과에 모듈러를 해도 결과는 같으므로

중간 중간에 모듈러를 하여
자료형의 크기를 벗어나지 않도록 하는 방법들이 있습니다.

 

 

 

Python

 

그저 갓이라는 생각 밖에 들지 않는다.

표현할 수 있는 수의 제한이 없다.

그러니까 엄~청나게 큰 숫자를 다룰 땐 귀찮게 C++로 풀지말고 Python으로 풉시다 !

 

 

 

큰수 A+B
https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

www.acmicpc.net

큰 수 문제들

https://www.acmicpc.net/problem/tag/%ED%81%B0%20%EC%88%98

 

큰 수 - 1 페이지

 

www.acmicpc.net

 

 

내용은 계속해서 추가됩니다...

반응형
저작자표시 비영리 변경금지

'C++ > 알고리즘' 카테고리의 다른 글

C++ 정렬 알고리즘 (버블정렬, 삽입정렬, 선택정렬, 합병정렬, 퀵정렬, 힙정렬, 셀정렬, 기수정렬)  (0) 2019.10.22
[실전 압축 알고리즘] - 실수형을 특정 소수점 까지 출력  (0) 2019.10.18
[실전 압축 알고리즘] - C/C++ 문자 숫자 변환  (0) 2019.10.18
[실전 압축 알고리즘] - 비트 연산  (0) 2019.10.18
[실전 압축 알고리즘] - C++ 입출력  (0) 2019.08.24
    'C++/알고리즘' 카테고리의 다른 글
    • [실전 압축 알고리즘] - 실수형을 특정 소수점 까지 출력
    • [실전 압축 알고리즘] - C/C++ 문자 숫자 변환
    • [실전 압축 알고리즘] - 비트 연산
    • [실전 압축 알고리즘] - C++ 입출력
    snowman95
    snowman95
    (17~19) Unity/Unreal Engine 게임 프로그래머 (20~21) System Administrator ___________ (22~) React 웹 프론트앤드 개발자 __________ 깃헙 : https://github.com/snowman95

    티스토리툴바