알고리즘
-
알고리즘: 되추적(Backtracking) 공부하기! (N-Queens problem을 풀어보자)알고리즘 2020. 11. 9. 20:11
되추적은 임의의 집합에서 주어진 기준대로 원소의 순서를 선택하는 문제를 푸는데 사용한다. 전형적인 사례로 체스의 n-Queens Problem이 있다. 이 문제의 목표는 n x n 크기의 서양 장기판에 서로 잡아먹히지 않도록 n개의 여왕말을 위치시키는 것이다. 즉, 어떤 여왕말끼리도 같은 행이나 열, 대각선상에 위치할 수 없다. 이 문제에서 순서는 여왕말을 둘 n개의 각각 다른 위치이고, 집합은 서양 장기판에서 말을 둘 수 있는 n제곱개의 위치들이 되고, 기준은 어떤 여왕말도 서로 잡아 먹히지 말아야 한다는 것이다. 되추적은 트리의 변형된 깊이우선탐색(DFS)이다. DFS에 대해 간단히 설명하면 부모의 노드에서 내려갈 수 있는 자식노드까지 내려가고 그 이후의 자식 노드가 없다면 다시 부모노드로 돌아가면서..
-
알고리즘: 스케줄짜기(Scheduling)공부하기! (시스템 내부시간 최소화, 마감시간이 있는 스케줄짜기)알고리즘 2020. 11. 6. 13:08
어떤 미용사에게 여러가지를 서비스를 받으려고 기다리는 손님이 있다고 하자. 서비스에 걸리는 시간은 모두 다르고 미용사는 얼마나 걸릴지 알고 있다. 손님들이 기다리는 시간을 최소가 되도록 손님을 서비스하는 것을 스케줄 짜기(sheduling)이라 하며 기다리고 머리하는데 걸리는 시간을 시스템 내부시간(time in the system)이라 한다. 그리고 마감시간이 정해진 경우(scheduling with deadlines)가 있는데 각 작업을 끝내는데 같은 시간이 걸리지만 각 작업과 관련된 보상을 최대로 얻기 위해서 마감시간을 고려해야하는 경우다. 이렇게 스케줄짜기는 시스템 내부시간(time in the system)과 마감시간이 있는 스케줄짜기(scheduling with deadlines)로 나뉘며 이..
-
알고리즘: TSP 외판원문제 알고리즘 공부하기(동적 프로그래밍)(feat. c++, 의사코드)알고리즘 2020. 10. 8. 22:25
외판원이 출장시간을 줄이기 위해 거주하고 있는 도시에서 출발하여 각 도시를 한 번씩 방문하고, 다시 출발한 도시로 돌아온다고 했을 때 가장 짧은 여행길을 찾는 알고리즘 start node가 있고 n-1 개의 node를 거쳐 1번 node로 돌아간다. brute-force 알고리즘을 이용해서 문제를 해결할 수도 있지만 n이 20만 되어도 걸리는 시간복잡도는 19!usecs(대략 3857년)으로 평생 구하지 못한다. 하지만 동적프로그래밍을 이용한 TSP알고리즘이면 45초만에 해결가능하다. 그렇다면 예제를 TSP알고리즘을 이용하여 풀어보자 다음과 같이 가중치가 있고, 노드 4개로 이루어진 그래프(V)가 있다. 그리고 위 그래프를 인접매..
-
알고리즘: Dynamic programming을 이용한 이항계수(Binomial Coefficient) (feat.c++)알고리즘 2020. 10. 2. 15:39
이항계수는 다음과 같이 표현되며 다음과 같은 성질을 따른다. int binomial(int n, int k) { if (k == 0 || k == n) { return 1; } return binomial(n - 1, k) + binomial(n - 1, k - 1); } 이렇게 간단하게 구현 가능하지만, 효율적이지는 않다. 알고리즘을 재귀호출하면서 이미 했던 계산을 반복해서 수행하기 때문이다 하지만 동적프로그래밍을 이용하면 중복되는 부분을 커버하여 효율적인 알고리즘을 만들 수 있다. Divide and conquer가 top-down 방식이였다면 dyna..
-
알고리즘: 슈트라센(Strassen) 행렬 곱셈 알고리즘 (feat.c++ ,pseudocode)알고리즘 2020. 9. 27. 15:33
이번 포스팅은 일반적인 정방행렬의 곱셈을 알아보고 더 빠른 슈트라센(Strassen) 행렬곱셈에 대해서 알아본다. void matrixMulti(const int a[][N], const int b[][N], int c[][N]) { for (int i = 0; i < N;i++) for (int j = 0; j < N; j++) { c[i][j] = 0; for (int k = 0; k < N; k++) { c[i][j] = c[i][j] + a[i][k] * b[k][j]; } } } 일반적인 행렬곱셈은 우리가 아는 행렬곱셈 그대로 코딩하면 위와 같은 3중 for문으로 구성된다. 1. 시간복잡도 분석 입력 크기 행과 열의 수가 n이라고 할 때 1) 곱셈의 관점 2) 덧셈의..
-
알고리즘: Divide and conquer를 이용한 quick sort 구현 (feat. c++)알고리즘 2020. 9. 27. 11:27
이름은 빠른 정렬이지만 사실상 가장빠른 정렬 알고리즘이라고 할 수는 없다. 차라리 분할교환정렬(partition exchange sort)라고 하는게 더 정확하다. 이번 포스팅은 quick sort를 분할 정복으로 구현한다. 사실상 quick sort 분할정복구현에는 가중치가 분할 > 정복이다. 즉 정복에는 별거 없다. 하지만 분할과정이 까다롭다. quick sort를 분할 정복으로 다음과 같이 나눈다. 배열의 원소 중 하나를 pivot으로 잡는다. (어떤 값을 pivot으로 잡든 상관 없다. 단지 기준을 만들어주기 위함이다) 주로 배열의 가장 끝값이나 처음 값을 기준으로 잡는다. 예를 들어 다음과 같은 배열이 있다. array = { 6, 2, 5, 3, 7, 10..
-
알고리즘: 백준 2293번 동전 1 (feat. python)알고리즘/백준(BaekJoon) 2020. 8. 25. 20:51
백준 2293번 링크입니다. 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 결론부터 말하면 dp를 이용해 풀어야 풀린다. 시간제한이 0.5초로 dp를 제외한 다른 방법을 쓰기가 까다롭다. 처음에는 dfs를 이용해 풀었지만 시간초과가 나길래 결국은 다른 분의 답을 참고하였다. import sys class Node: # 방문처리를 위해 노드 클래스를 만들었다. def __init__(self, data): self.data = data def dfs(start, tar..
-
알고리즘: 백준 14888번 연산자 끼워넣기(feat. python)알고리즘/백준(BaekJoon) 2020. 8. 24. 22:08
백준 14888번 링크입니다. 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, �� www.acmicpc.net 이렇게 열심히 풀긴 했지만 결국 틀렸다... 하지만 이 문제 하나로 여러가지 경험을 한 것 같아서 만족한다. permutation이라는 편리한 모듈을 알게 되었고 stack과 dfs에 대해서 좀 더 깊게 알 수 있었다. permutation을 통해서 가능한 연산자순서의 경우의 수를 구했고 stack을 통해 필요한 값을 넣고 뺌으로써 원하는 값을 구하는 방법을 체득하였다. i..