반응형
먼저 이 글은 복수 전공자 및 비전공자 분들을 위한 글입니다. (물론 전공자 분들이 보셔도 됩니다)
저는 복수 전공자로서 코딩 테스트가 막막함이 있어 이것을 해결하고자 적어보는 글입니다.
알고리즘 목록
- 완전검색 - 브루트포스
- 순열 (next_permutation) > stl
- 조합 (재귀)
- 비트 마스크
비트 마스크
#include <iostream>
#include <vector>
using namespace std;
vector<int> a;
int main(){
int n, m;
cin>>n>>m;
a.resize(n);
for(int i=0; i<n; i++) cin>>a[i];
int answer = 0;
for(int i=1; i<(1<<n); i++){
for(int k=0; k<5; k++){
if(i&(1<<l)) sum+=a[k];
}
if(sum==m) answer+=1;
}
cout<<answer<<'\n';
return 0;
}
최대 공약수
c++17 에서는 #include <numeric> 에서 stl 로 제공을 해줍니다.
c++ 17 을 사용할 수 있다면 참고하시기 바랍니다.
int gcd(int a, int b){
return b ? Euclidean(b, a%b) : a;
}
최소 공배수
int gcd(int a, int b){
return b? gcd(b, a%b) : a;
}
int lcm(int a, int b){
return a*b/gcd(a, b);
}
진법 변환 (2진법으로 변환을 하는 방법)
#include <string>
using namespace std;
int main(){
int n = 10;
string s;
while(n>0){
if(n%2==0) s = '0' + s;
else s = '1' + s
n/=2;
} //2진법 변환
return 0;
}
- 그리디: 부분적인 최적해가 전체적인 최적해가 되는 방법 (반드시 최적해의 보장은 안된다.) 그리디 알고리즘으로 풀 수 있으면 다이나믹으로 해결이 가능하다. 하지만 그 역은 가능하지 않는다.
- 회의실 배정: 제일 많은 회의를 잡는 방법은 무엇인가? :끝 시간을 기준으로 정렬한다.
- 거스름돈 문제: 그리디로 풀수는 있지만 보장은 해주지 않는다. 다이나믹을 활용해 최적해를 만들 수 있다.
- 최소 신장 트리: 주어진 가중치 중 사이클 없이 모든 점들은 연결시킨 트리 중 가중치 합이 최소인 트리
크루스칼 알고리즘(유니온 파인드)과 프림 알고리즘(우선순위 큐)이 있다.
외판원 문제(TSP) 를 풀 수 있게 해준다. - 배낭 문제 (0-1), 부분 배낭 문제가 있다.
- 작업 스케줄링 문제: 작업의 수행시간이 중복되지 않도록 모든 작업을 가장 적은 수의 기계에 배정하는 문제 시작하는 시간을 우선으로 배정
- Divide and Conquer
- 퀵 정렬
- 합병 정렬
- 그래프 (DFS, BFS, 다익스트라, 플로이드 - 와샬, 크루스칼, 프림)
- 다익스트라 - 한 정점에서 최단거리를 구하는 방법 (우선 순위 큐를 이용)
- 플로이드 와샬 - 모든 정점에서 최단거리를 구하는 방법 (다이나믹 방식을 이용)
- 크루스칼 알고리즘 - 유니온 파인드를 이용하여 사이클 없는 것에서 MST 구하는 방법
- 프림 알고리즘 - 우선순위 큐를 이용하여 MST 구하는 방법
- 애정하는 조합은 다익스트라 + 프림
- 문자열 탐색
- '(', ')' 문제가 나오는 경우는 웬만하면 stack 을 사용하였습니다.
- KMP 알고리즘
- 다이나믹: 부분의 해들을 사용하여 다음 해를 구하는 것이다.
- 플로이드 와샬 (모든 정점에서 최단거리를 구하는 알고리즘) 이 해당한다. 여기서 신기한 점은 플로이드 와샬 알고리즘은 시간 복잡도 O(n^3) 이고 비슷하지만 한 정점에서 최단거리를 구하는 다익스트라 알고리즘은 시간 복잡도가 O(n^2) 라는 것이다. 여기서 다익스트라를 모든 정점에서 적용을 하면 O(n^3)이 된다. 하지만 플로이드가 더 간단할 수 있다. 음수가 있는 경우 다익스트라를 사용할 수 없고 플로이드를 사용해야 한다. ^^
- 연속 행렬의 곱 문제: 행렬을 연속으로 곱하 때 중복되는 부분이 있을 수 있다. 이를 해결을 하는 방법
- 편집거리 문제: 하나의 문자를 삽입, 삭제, 대체를 활용하여 최소한의 연산을 구하는 문제, LCS 문제와 동일하다.
- 배낭 문제를 해결할 수 있다.
- 동전 문제를 해결할 수 있다.
반응형
'알고리즘' 카테고리의 다른 글
[알고리즘] 암호 만들기 (0) | 2021.06.10 |
---|---|
[알고리즘] Max Area of Island (0) | 2021.06.01 |
[알고리즘] Maximum Subarray + 배열에서 부분 최대합을 구하는 방법 (0) | 2021.05.17 |
[알고리즘] 길 찾기 게임 (0) | 2021.05.07 |
[알고리즘] 불량 사용자 (0) | 2021.05.06 |
댓글