본문 바로가기

알고리즘/백준 알고리즘 강의

백준 알고리즘 기초 - 알고리즘 시작

그럼 시작 해볼까...

 

돈을 주고 산 강의라.. 그대로 옮겨 올 수는 없을 것 같고.. 딱 나한테 필요한 부분만 정리를 해보려고 한다.

누군가 읽을 일이 있을지 모르겠지만 애초에 소개 목적이 아님을 알려둔다..

-

* 알고리즘: 어떤 문제를 해결하기 위해 정해진 일련의 절차나 방식을 공식화한 형태로 표현한 것.

 

* 알고리즘 문제 풀이, 고민의 시간: 한 문제를 붙들고 며칠을 고민하기도 했는데, (이제 그런 미련한 짓은 그만) 2~3시간정도만 고민하고 안 되면 바로 정답을 보면서 원리를 이해한 뒤에 다른 문제를 더 푸는 것이 효율적일듯.

 

* 시간 복잡도: 코드를 작성했을 때 시간이 얼마나 걸릴지 예측해보는 것. 최악의 경우에 얼마나 걸릴지를 구한다고 생각하면 된다. 소스 코드를 보고 계산할 수도 있고, 작성하기 전에 먼저 계산 해볼 수도 있다.

  - 시간 복잡도 안에 가장 큰 입력 범위를 넣었을 때, 1억이 대략 1초 정도란다.

  - 시간 복잡도 안에 상수는 버려도 되고, 변수가 같으면 가장 큰 변수만 남겨도 무관하다.

 

* 메모리 (공간 복잡도): 보통 시간을 잘 지키면 웬만해서는 신경 쓸 필요 없다. 

 

* 입출력:  C에서는 scanf, printf / C++에서는 C꺼에 cin, cout 추가

cin, cout은 scanf, printf보다 느린데,

1
2
3
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cs

얘를 추가하면 빨라지고, 두번째 줄까지만 써도 효과는 충분하단다.

 

JAVA에서 입력은

1
Scanner sc = new Scanner(System.in);
cs

 

출력은 in -> out. 근데 얘는 속력이 좀 느려서, 입력이 많아지면

1
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
cs

 

출력이 많아지면 Reader -> Writer / Input -> Output / in -> out이겠지.

주목할만한 것은 cout << endl과 cout << '\n'의 속도 차이인데,

'\n' 쓰는 게 훠얼씬 (10배 정도) 빠르단다. (endl 사용은 삼가자..)

-

문제는 기본적인 것들이어서 굳이 포스팅까지는 안 해도 될 것 같다.

이렇게 첫번째 강의 정리 끝. 모든 것이 계획대로다. (이제 1강인데?)