본문 바로가기

알고리즘

(25)
[C++] BOJ-1520 문제풀이 1. 백트래킹 + DP를 이용해서 풀었다. 2. 재귀함수를 통해 모든 경우의 수를 백트래킹으로 탐색하지만 그 중에서 이미 탐색했던 부분이 있으면 그 곳은 다시 탐색하지 않는다. 3. 좌표(N,M)에 도착하면 결과값에 return값에 1씩 더해준다. #include #include using namespace std; int dx[4] = {0,0,-1,1}; // 상하좌우 int dy[4] = {1,-1,0,0}; int arr[500][500]; int cache[500][500]; int N,M; int func(int x, int y){ if(cache[x][y] != -1) return cache[x][y]; if(x == M-1 && y == N-1) return 1; cache[x][..
[C++] BOJ-1238 문제풀이 1. vector에 단방향 그래프를 입력받는다. 2. 파티에 갈 때와 올 때의 길이 다를 수 있기 때문데 (집 -> 파티), (파티-> 집) 을 따로 다익스트라 알고리즘을 통해 최단경로를 수해야한다. 3. 그 경로의 합 중에서 최소를 구한다. #include #include #include #include using namespace std; const int INF = 987654321; int N,M,X; vector adj[1001]; int dijkstra(int start, int end){ vector dist(N,INF); dist[start] = 0; priority_queue pq; pq.push(make_pair(0,start)); while(!pq.empty()){ int c..
[C++] BOJ-1012 문제풀이 1. sort를 사용해서 vector를 정렬. 2. unique를 사용해서 중복이 되는 요소를 맨 뒤로 넘긴다. 3. 맨 뒤로 넘어간 중복되는 요소들을 삭제하고 출력한다. #include #include #include #include using namespace std; bool compare(string &s1, string &s2){ if(s1.size() == s2.size()){ return s1 > N; vector str; for(int i = 0; i..
[C++] BOJ-1012 문제풀이 기본적인 Queue 문제 #include #include #include using namespace std; int main(){ ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); queue q; int N, M; cin >> N >> M; for(int i = 0; i
[C++] BOJ-1012 문제풀이 배추를 찾은 후 BFS로 탐색 서로 떨어져 있는 배추를 찾을때마다 count 해주는 방식으로 문제 해결 #include #include using namespace std; int map[51][51]; int dx[4] = {0,0,-1,1}; // 상하좌우 int dy[4] = {1,-1,0,0}; queue q; int T,N,M,K; int X,Y; int bfs(){ int cnt = 0; for(int i = 0; i> N >> K; for(int i = 0; i> X >> Y; map[Y][X] = 1; } cout
[C++] BOJ-7576 문제풀이 다른 BFS 문제와 마찬가지로 queue에 x좌표와 y좌표를 넣으면서 BFS를 돌리면 된다. 날짜가 지날때마다 토마토가 들어있지 않은 경우가 아니라면 인접한 배열을 1로 교체해주었다. 다른 BFS 문제와 다른점은 이 문제에서는 익지 않은 토마토가 있을 수 있기 때문에 그 경우까지 생각해줘야 한다. 나같은 경우 BFS로 모든 맵을 돌린 후 마지막에 map 배열에 0이 하나라도 존재한다면 -1을 return을 해주는 조건문을 하나 더 추가해주었다. #include #include using namespace std; int dx[4] = {0,0,-1,1}; // 상하좌우 int dy[4] = {1,-1,0,0}; int N,M; int map[1001][1001]; int cnt; queue< p..
[C++] BOJ-4963 문제풀이 풀이 전에 풀었던 유기농배추가 비슷한 방식으로 풀었다. 다른점이 있다면 유기농배추 문제는 상하좌우 네 방향만 탐색했지만 이 문제는 대각선도 이어져 있다고 보기 때문에 8방향을 탐색했다. 나는 BFS로 풀었지만 다시 생각해보니 DFS로 코드를 짜는게 훨씬 더 효율적일 것 같은 생각이 들었다... #include #include using namespace std; queue q; int dx[8] = {0,0,1,-1,1,-1,1,-1}; int dy[8] = {1,-1,0,0,1,-1,-1,1}; int map[51][51]; int bfs(int N, int M){ int cnt = 0; for(int i = 0; i h; if(w==0 && h == 0) break; for(int i ..
[C++] BOJ-1012 문제풀이 BOJ-1012 문제풀이 풀이 작성중.. 전체 소스코드 #include #include using namespace std; int map[51][51]; int dx[4] = {0,0,-1,1}; // 상하좌우 int dy[4] = {1,-1,0,0}; queue q; int T,N,M,K; int X,Y; int bfs(){ int cnt = 0; for(int i = 0; i> N >> K; for(int i = 0; i> X >> Y; map[Y][X] = 1; } cout