[알고리즘 이론] Floyd Warshall 플로이드 와샬 알고리즘 C++
·
알고리즘 이론
Floyd Warshall이란? 대표적인 최단거리 찾기 알고리즘 중 하나 - 다익스트라, 벨만포드, 플로이드 와샬 * 다익스트라 : 모든 쌍의 최단 경로(음의 가중치 X) * 벨만포드 : 모든 정점에 대한 최단경로(음의 가중치 O) * 플로이드 와샬(음의 가중치 O + 음의 사이클이 없어야한다) 모든 정점끼리의 최단거리를 한번에 계산할 때 사용 + 동적 계획법을 사용 ex) 전체 정점에서 다른 정점들까지의 최단거리를 한번에 계산 -> 다익스트라의 경우 어떤 정점 A에서 다른 정점들까지의 최단 거리를 계산 Pseudo Code for(k=1;k> M; vector dis(N+1,vector(N+1,5000)); for (int i = 1; i > from >> to >> c; dis[from][to] = ..
[이론] 이진탐색 (Binary Search) - c++
·
알고리즘 이론
이진탐색(Binary Search)란? 오름차순으로 정렬된 리스트에서 특정값을 찾는 알고리즘 오름차순으로 정렬된 리스트에서 중간 값(mid)을 선택하고 찾고자 하는 값(target)과 비교를 반복 때문에 정렬이 필수적 선형탐색보다 훨씬 빠르게 검색 가능(탐색 범위를 절반씩 줄여나감) 시간 복잡도 O(log N) 구현방법 1~100까지 오른차순으로 정렬된 카드 더미가 있다고 가정하자. 목표는 29를 찾는 것이다. i번째 카드는 c[i]로 나타내고, 목표 값(target)은 val로 표현하자. 결정 문제(Decision Problem, 답이 이분적일 경우)를 "c[i] >= val ?"로 설정하고 답은 i를 증가시키며 탐색을 시작한다. 그리고 v[i] >= val이 되는 지점이 나타나면 탐색을 완료합니다. ..
STL 컨테이너 별 사용도
·
알고리즘 이론
Sequence Container 시퀀스 컨테이너 리스트 (List) - 저장할 데이터 개수가 가변적일 때 사용 - 데이터가 중간에 삽입되거나 삭제되는 경우가 많을 때 용이 - 데이터의 개수가 크거나 검색을 자주하면 비효율적 -> map, set, hash_map 사용하기 - 데이터에 임의 접근하지 않을 때 사용. (리스트는 '순차접근') 백터(Vector) - 동적 배열 - 객체를 삽입/제거시 자동으로 크기를 조정 - 저장할 데이터의 개수가 가변적일 때 사용 - 데이터가 중간에 삽입/삭제 되는 경우가 없을 때 사용 - 순차 저장이므로 검색속도가 느리다 - 데이터 임의 접근에 용이 (위치만 알면 바로 접근 가능) 메서드 종류 - push_back() 덱(deque) - 데이터를 앞이나 뒤에서 삽입/삭제 ..
[백준] 11059 크리 문자열 c++
·
알고리즘 이론/백준
11059. 크리 문자열 https://www.acmicpc.net/problem/11059 11059번: 크리 문자열 첫째 줄에 문자열 S가 주어진다. S는 숫자로만 이루어져 있으며, 길이는 1,000을 넘지 않는다. 항상 크리 문자열이 존재하는 입력만 주어진다. www.acmicpc.net 입력의 길이는 1000을 넘지 않는다. 입력의 길이가 굉장히 큰 것은 아니기때문에 부담을 갖지 않아도 될 것 같다. 크리 문자열이 무엇일까? 대칭되는 짝수 길이의 문자열을 의미하는 것인가? (처음 필자는 대칭되는 것만 말하는 줄 알았다..ㅎ;ㅎ;;;;) 대칭이 안되어도 합만 같으면 된다!! int main() { ios::sync_with_stdio(0); cout.tie(); cin.tie(); cin >> s;..
[5032] 탄산 음료 C++
·
알고리즘 이론/백준
5032. 탄산음료 https://www.acmicpc.net/problem/5032 5032번: 탄산 음료 첫째 줄에 준민이가 가지고 있는 빈 병의 수 e, 그날 발견한 빈 병의 수 f, 새 병으로 바꾸는데 필요한 빈 병의 개수 c가 주어진다. (e < 1000, f < 1000, 1 < c < 2000) e, f, c는 모두 음이 아닌 정수이다. www.acmicpc.net 반 병의 수 e, 그날 발견한 빈 병의 수 f, 새 병으로 바꾸는데 필요한 빈 병의 개수 c가 주어진다. 이를 활용해서 먹을 수 있는 탄산음료의 개수를 출력해야한다. 첫번째 예제 입력을 살펴보자. 입력은 9 0 3이고 출력은 4이다. 많은 사람들이 여기서 많은 고민을 했을거 같다. "처음에 9병이 있었고 0병을 발견했으면 바꿀 수..
[백준] 2863 이게 분수?
·
알고리즘 이론/백준
2863. 이게 분수? https://www.acmicpc.net/problem/2863 2863번: 이게 분수? 첫째 줄에 표를 몇 번 돌려야 표의 값이 최대가 되는지 출력한다. 만약, 그러한 값이 여러개라면 가장 작은 값을 출력한다. www.acmicpc.net 입력으로 100보다 작은 양의 정수 4개가 입력되고, 이 정수들을 시계방향으로 돌린 후 함수에 해당값을 넣어 계산하는 문제이다. 우선 입력되는 정수가 4개로 고정되어있으므로 결과값이 총 4개가 나온다. 이 문제를 처음 접근할 때, 규칙을 찾아서 각 자리의 인덱스가 어떻게 변화하는 지를 찾아내려고 했지만 결론적으로 경우의 수가 4개밖에 없기 때문에 규칙을 찾아도 주먹구구식 방식이 더 빠르고 간편하다는 결론이 나왔다. 앗! 그리고 필자가 문제를 ..
[백준] 1427 소트인사이드 c++
·
알고리즘 이론/백준
1427. 소트인사이드 https://www.acmicpc.net/problem/1427 1427번: 소트인사이드 첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 이 문제는 굉장히 쉽다. 입력받은 후 정렬만하면 끝이다! 문제가 아무리 쉬워도 우리가 확인할 것이 있다. 바로 N의 범위!!! N은 1,000,000,000보다 작거나 같은 자연수이다. 때문에 int를 사용할 수 있다. long long을 사용해야하는 경우가 있을 수 있으니 항상 입력의 범위를 잘 확인하자! 이 문제는 앞서 풀이를 올렸던 문제들의 코드를 합치면 된다. 가장 먼져 N을 입력받고, 각 자리 수를 벡터에 저장한다. cin >> num; while (n..
[백준] 1065 한수 c++
·
알고리즘 이론/백준
1065. 한수 https://www.acmicpc.net/problem/1065 1065번: 한수 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 www.acmicpc.net 제출 수가 굉장히 높은 것으로 보아 이 문제 역시 중요한 기초문제인것 같다. 하지만 필자는 문제의 풀이를 생각해내는데 꽤 많이 고민했다. 문제에서 주어진 '한수'를 어떻게 저장하면 좋을지 고민해가며 100~999까지의 '한수'를 모두 종이에 적어보았지만 어떠한 규칙도 발견하지 못했고, 규칙이 있어도 굉장히 복잡해질 것 같았다. 때문에 입력이 주어지면 입력된 정수까지의 한수를 모두 찾아..