블로그의 첫글이며 앞으로 공부하는 내용을 포스팅 하려고 합니다 그러니 비방성 글은 정중히 사양합니다.
개인적으로 PS 및 컴퓨터를 공부하였기 때문에 왕도가 아님을 알려드립니다.
또, 필자는 Codeforce(민트), Boj, Swea 사이트의 랭커가 아님을 밝힙니다.
단 한번의 시험으로 취득하였기때문에 여러 B형의 유형을 알지 못하는 점 미리 양해부탁드립니다.
마지막으로 주관이 많이 섞여있고 자료에 대한 미흡한 점이 존재함으로 박트리님 블로그와 같이 참고하시기 바라며 알고리즘 빡공방에서 여러 정보를 얻을 수 있습니다.
개인적인 견해로 A형에서는 시간복잡도와 자료구조면에서 제약이 없는 것과 마찬가지이기에 이렇게 자세하게 짚고 넘어가는 경우는 없을 것으로 생각됩니다.
하지만 B형 시험에서 요구하는 부분은
'시간복잡도를 제대로 고려하여 O(NlogN)이내로 수행 할 수 있는 로직을 세울 수 있는가?',
'자료구조의 특성들을 제대로 이해하고 상황에 맞게 사용 할 수 있는가?'
를 파악하는 시험이기 때문에 위에 한 부분이라도 확실하다고 할 수 없다면 기초단계부터 차근차근 다시 공부하기를 추천합니다.
B형은 STL을 사용할 수 없는 시험임을 인지하기 바랍니다.
대부분의 분들이 학교 강의, 독학, 인터넷 강의 등을 통해 어떠한 로직으로 작동하는지 공부하고 구현하는 경우는 과제 및 시험을 준비할 경우 외에 크게 신경쓰지 않고 이해하고 넘어 가는 부분이라고 생각합니다.
하지만 크게 다가 올 수 있는 하나의 예로 chaining hash table을 만들때 모든 면을 효율적으로 구현한다고 생각을 해보자
#define MOD 524287
struct node {
node *next;
unsigned long long num;
};
struct hnode {
node *next;
int cnt;
};
hnode myhash[MOD];
node input[1500000];
.....
위와 같은 코드가 있을때 어떻게하면 hash table을 초기화 하기위해 들어가는 시간은 O(input) 을 수행하여하는 방법을 생각 할 수도 있고 아래와 같이 O(MOD)의 방법을 생각하는 사람이 있다.
void init()
{
size = 0;
for (register int i = 0; i < MOD; i++) {
myhash[i].cnt = 0;
}
}
위의 설명을 보고 갑자기 자료구조에 대한 필요성을 느끼고 바로 당장 책 혹은 배웠던 강의 자료를 뒤적이고 있다면 반은 성공 한것이라고 본다.
하지만 위의 코드를 보면서 한가지를 더 캐치했기를 바란다. register int 의 존재와 pointer의 존재이다. 우리는 어떻게든 시간을 줄이고 제한시간안에 돌아가는 코드를 만드는 것을 목표로한다. 그렇기에 조금이라도 더 연산 속도를 높일 수 있는 register, inline등을 사용하는 것을 추천한다.
또 pointer는 data에 대한 접근을 자유롭게 해준다는 장점이 있으므로 꼬옥! 공부하기 바라며 어느 기업의 면접을 가든 단골로 나오는 부분이기 때문에 공부하는 것을 추천합니다.
이제는 기본적인 알고리즘에 대한 설명을 해볼까합니다.
B형을 준비하는 분들이 흔히 하는 질문이 있다. '어떠한 중요한 알고리즘이 필요로 할까요?', '꼭 알아야 하는게 있을까요?' 등의 질문이다. 이러한 질문을 받으면 역으로 '그런게 있으면 B형의 합격률이 A형 만큼 나오겠죠~?' 라고 반문하고 싶다.
우리는 보통적으로 쉬운 길, 정형화된 길을 걷고 싶어하지만 안타깝게 그런건 없다고 본다. 예를 들어 나는 quick sort기 쉬운거 같아서 merge sort는 공부 안했을때, 최악의 quick sort의 경우 test case가 O(N^2)의 경우라 제한시간안에 통과를 못하고 merge sort의 O(NlogN)만 통과가 될 수도 있다.
그러므로 내가 재미있어서 공부하는 것이라 생각을 하며 여러 공부를 하시기를 추천드립니다.
그리고 한 두번 치다보면 내가 아는게 나온다는게 여러번 시험 끝에 따신 분들의 정설입니다.