오늘은 코딩 테스트를 처음 시작할 때 어찌 시작을 해야 하는지 막막해하는 사람들에게 저의 경험을 통해 최대한 도움을 주기 위해 글을 작성하겠습니다.
저는 대학을 졸업하고 알고리즘(코딩테스트)을 준비했습니다.
실력은 많이 부족하지만 저를 포함한 초보자가 평소에 알고리즘 코딩 테스트를 공부를 시작하면서 지금까지 실수했던 부분과 문제를 풀면서 주의 깊게 봐야 할 부분 그리고 간단한 문법들을 정리해서 올리겠습니다.
처음에 말했던 것처럼 알고리즘, 코딩테스트를 처음 준비하시거나 계속 공부하시는 분들에게도 도움이 되었으면 좋겠습니다.
알고리즘 공부법
제가 알고리즘 공부를 처음 시작했을 때 어찌 시작했는지를 쓰도록 하겠습니다.
저는 알고리즘을 처음 공부할 때 백준에서 별 찍기부터 시작을 했습니다.
제가 생각하기에 알고리즘을 공부할 때 별 찍기부터 시작하는 방법은 좋은 방법이라고 생각합니다.
코딩 테스트의 기본은 for문이고 for문은 별 찍기를 푼다면 for문 활용을 충분히 공부할 수 있다고 생각합니다.
그다음에 백준의 브론즈 문제부터 시작을 해서 점점 난이도를 올려가며 공부를 했습니다.
문제를 풀떄 모르는 문제가 나왔다면 바로 답을 찾아보기보다는 적어도 하루 이상 고민을 해보고 풀이법이 안 나온다면 그때 구글링을 통해 코드를 보는 게 좋다고 생각합니다.
하지만 완전 처음 공부를 시작하는 단계라면 고민시간에 최대 한 시간을 넘기지 않고 한 시간 정도 고민을 해도 코드를 어찌 짜야할지 답이 안 나오면 그때는 바로 구글링을 통해 답을 보는 것이 좋다고 생각합니다.
처음에 문제를 풀 때는 다른 사람이 어찌 풀었나 보고 그것을 내 것으로 만들어 다음에 풀 때 그런 식으로 풀어야지 하면서
익힌다면 조금 더 빨리 실력을 향상할 수 있다고 생각합니다.
알고리즘 문제 풀 때 주의사항
1. 문제를 잘 이해하였는가(가장중요)
알고리즘 문제를 풀면서 문제를 잘 이해하지 않고 문제를 풀게 되면 코드를 다 작성하고 나서 답이 달라 다시 코드를 수정해 주어야 하는데 처음부터 똑바로 만들었을 때 나오지 않을 오류들이 코드를 수정하면서 많이 발생하게 됩니다.
따라서 알고리즘 문제를 풀 때는 먼저 문제를 정확히 이해하고 풀어야 합니다.
2. 모두 초기화시켜주었나(전번의 결과가 영향을 미치지 않는가)
*특히 ans와 queue와 vector을 조심
문제를 풀면서 변수들을 모두 초기화시켜주지 않았다면 로직은 잘 만들었어도 첫 번째 결과는 맞지만 두 번째 결과부터 오답이 나와 왜 맞는데 틀리지라고 생각을 하면서 코드를 유심히 살펴보면 초기화를 안 해주었기 때문에 실수가 많이 발생합니다. 특히 queue와 vector의 경우 초기화를 안 시켜주면 왜 틀린 답이 나오는지 확인하기 더욱 까다롭다고 생각합니다.
3. 큐와 백터 배열 사용 시 범위를 벗어나게 접근하지는 않는가?
문제를 풀면서 오류가 발생하여 작동이 안 될 때 가장 많이 실수했던 부분이 범위 초과였습니다.
그래서 다시 찬찬히 살펴보면 큐와 백터에서 범위를 벗어나게 접근해서 발생한 오류가 많았고 은근히 코드가 완성된 후 오류를 찾으면 발견이 힘들었습니다.
그래서 처음에 설계를 할 때부터 범위를 벗어나게 접근하는 로직이 나오지 않도록 설계하는 게 중요하다고 생각합니다.
4. for문안에서 변수가 잘 바뀌고 있는지 확인
자주 하는 실수로 for문안에 변수를 선언해서 변수가 계속 초기화되어 의도한 것과 다르게 변수가 바뀌지 않는 경우가 있습니다. 그래서 변수 선언은 잘 생각하고 넣어야 합니다.
5.queue와 같은 것들을 참조할 때 범위가 바뀌지 않도록 선언
큐의 크기가 계속 바뀌는데
for (int i = 0; i < q.size(); i++) 와같이 돌리게 되면 의도한 숫자보다 많거나 적게 돌아갑니다. 그래서 아래와 같이 크기를 변수에 넣고 그 크기만큼만 돌리게 해야 합니다.
int endd= q.size();
for (int i = 0; i < endd; i++)
6. dfs 돌릴 때 곱하거나 나누는 것이 있으면 0에서 처리를 못해준다.
이걸 쓴 이유가 생각이 안 나 나중에 문제를 풀다가 이유가 생각이 나면 수정해서 올리도록 하겠습니다.
7. dfs는 가지치기가 중요하다 시간에 엄청난 영향
dfs는 가지치기를 잘해줘야 시간이 많이 단축이 됩니다. dfs문제를 풀 때 시간 초과가 발생하였다면 가장 먼저 가지치기를 충분히 해줬나를 확인해야 합니다.
ex)
if(ans <=ans_temp) return;
*문법*
queue < pair <int, int> > q; 만듦
pair 사용 시 q.push(make_pair(y, x)) 큐에 집어넣음
정렬
next_permutation(arr, arr + N)
prev_permutation(arr, arr + N)
우선순위 큐 내림차순 정리
기본은
struct Custom {
int x;
int y;
int value;
};
// 내림차순 정렬
struct cmp {
bool operator()(Custom t, Custom u) {
return t.value < u.value;
}
};
priority_queue < Custom, vector, cmp > pq;
#include <functional>
priority_queue <int> pq; //내림차순
priority_queue < int, vector, greater > pq; //오름차순
백터
기본
struct value {
int cnt;
int size;
}; //오름차순 정렬
bool cmp(value a, value b) {
return a.cnt < b.cnt;
};
sort(v [Y]. begin(), v [Y]. end(), cmp);
sort(v.begin(), v.end(), greater()); // 내림차순
이걸 읽으시는 분들도 자신이 자주 하는 실수를 댓글로 공유해 주시면 감사하겠습니다.
'알고리즘 문제풀기' 카테고리의 다른 글
알고리즘 문제 코드 공유 (0) | 2019.07.10 |
---|