코딩 테스트가 실제 개발과 다른점
- 전역 변수의 사용
- 동적 할당 대신 배열(또는 stl vector) 사용하기
- 미리 계산한 상수값 사용하기
- 가독성 좋은 알고리즘 대신 성능에 유리한 알고리즘 사용하기
자주 하는 실수
- 산술 오버플로 (정수 자료형 표현, 실수 자료형 표현)
- 산술 언더플로 ( 오버플로랑 다름에 유의! )
- 배열 범위 밖의 원소 접근 (대표적인 런타임 에러)
- off-by-one : 하나가 많거나 모자라는 실수를 가리키는 말로 <, > 연산자와 <= , >= 연산자를 쓸때 자주 발생
시간복잡도
- 일반적으로
N=1억개 = 1초
가 걸린다.
스트림
- 서로 다른 장치를 이어주는 가상 연결 고리
- 스트림을 통해 두 장치 사이에서 데이터 주고 받을 수 있음
버퍼
- 스트림 내부적으로 버퍼를 사용해서 입/출력 관련 데이터를 일시적으로 보관 가능
- 장점
- 묶어서 한 번에 전달하므로, 성능이 향상된다.
- 속도 차이가 나는 두 장치 사이의 완충제 역할을 할 수 있다.
- 단점
- 추가적인 메모리 공간을 필요로 한다. => 사용 용도에 맞게 적절한 크기로 사용해야 한다.
C++ 입출력 속도 향상 방법
- C스타일 입출력
#include <cstdio>
int main(void)
{
int n;
scanf("%d", &n);
printf("%d\n", n);
}
- c++ 입출력 사용
#include <iostream>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(false); // c와 c++의 표준 입출력 스트림을 동기화를 하지 않겠다는 의미
cin.tie(nullptr); // cin사용시 출력 버퍼를 비우지(flush) 않는다.
int n;
cin >> n;
cout << n << "\n";
}
- scanf(), printf() 사용하기
- cstdio 라이브러리 사용
- endl 절대 사용 금지!!
- endl 대신 개행 문자(“\n”)를 사용
- 버퍼를 지우지 않아도 되므로 속도 향상
- ios_base::sync_with_stdio(false) , cin.tie(NULL) 사용하기
ios_base::sync_with_stdio(false)
: C Stream과 C++ Stream 사이의 동기화를 끊음(속도향상)cin.tie(nullptr)
: cin과 cout의 묶음(tie)을 푼다.- 기본적으로 cin과 cout은 묶여(tie)있음. 스트림이 묶여 있을 경우, I/O작업 변경 시 자동으로 버퍼를 비움(flush)
- 우리는 버퍼를 유지시키는게 이득!