본문 바로가기

알고리즘

(82)
백준 [2589] 보물섬 c++ 기준 단순 bfs로 푼다면 100~120ms의 시간으로 풀 수 있지만, 그래프 지름에 대해서 생각해 본다면 더욱 빠르게 풀 수 있다. (20ms정도) 1이 육지, 0이 바다라고 하고 지도가 다음과 같다면 3가지 조건에 대해 생각해볼 수 있다. 1. 어떤 지점의 위, 아래에 땅이 있을 때 빨간 곳처럼 위 아래로 땅이 있는 경우, 해당 지역은 단순히 거쳐가는 지역이된다 실제로 찍어보면 알겠지만 해당 지점에서 시작한 거보다 그 위 아래에서 시작한게 더 크다 2. 어떤 지점의 좌우에 땅이 있을 때 이 부분도 마찬가지로 좌우에서 시작한게 해당 지역에서 시작한 거보다 더 크다 3. 상하, 좌우가 아닌 2갈래로 퍼지는 곳 위 오른쪽, 위, 왼쪽 처럼 x,y 축으로 한 방향씩 갈라지는 곳이다 사진처럼 아래, 오..
백준 [1806] 부분합 www.acmicpc.net/problem/2003의 응용 문제 사실 응용문제랄 것도 없이 if문 하나만 추가해주면 끝난다. 여기서 주의할 점은 부분합이 S 이상을 찾는 것이다. 부분합이 S인 경우만 찾으면 안 된다. 생각보다 간단하다. 합이 S 이상인 경우, 시작점과 마지막 점의 차이를 구한 후, 이 차이가 최소값이지만 판별해주면 된다. 더보기 #include #include using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, S, data, MINLEN = 0x7FFFFFFF; int start = 0, end = 0, sum = 0; vector v; cin >> N >> S; for (in..
백준 [11657] 타임머신 음수 사이클이 있는 벨만 포드 알고리즘 문제 음수 사이클 탐지 구현 다 해놓고 예제도 다 맞았는데 자꾸 틀려서 뭔가 했는데 이분이 올린 테스크 케이스들 보고 알았다. www.acmicpc.net/board/view/39180 틀린 코드 더보기 #include #include #include using namespace std; #define INF 0x7FFFFFFF vector v[512]; long long upper[512]; int Bellman(int N) { int i, size, there, thereCost; upper[1] = 0; for (i = 1; i > N >> M; for (int i = 0; i > A >> B >> C; v[A].push_back..
백준 [1707] 이분 그래프 (bfs) 같은 레벨의 정점끼린 같은 색, 인접 노드 끼리는 다른 색을 칠한다. 만약, 인접 노드가 자신과 같은 색이라면 이분 그래프가 아니다. 예를 들면, 정점이 4개인 임의의 그래프가 있다면, 칠하는 방식은 다음과 같다. (하얀색, 검은색) 하지만, 자신과 인접한 노드가 자기와 같은 색이 된다면 이분 그래프라 할 수 없다. 아래 그래프에서 3과 4가 연결 됐을 때, 3을 탐색 할 때, 인접 노드인 4를 검은색으로 칠해야 하는데, 4는 인접 노드인 3과 같은 하얀색이기 때문에, 이분 그래프라 할 수 없다. 반대로, 4부터 탐색한다 해도, 같은 문제가 발생한다. 여기서 주의할 점은, 주어진 입력이 비연결 그래프일 수 있기 때문에, V범위 전부를 탐색해야 한다. 따라서 시간 복잡도는 O(V + E)가 나온다. bfs..
백준 [11054] 가장 긴 바이토닉 부분 수열 이 두 문제를 풀었다면 쉽게 풀 수 있다. www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A..
백준 [9251] LCS 여기에 설명이 진짜 잘 돼있다. ko.wikipedia.org/wiki/%EC%B5%9C%EC%9E%A5_%EA%B3%B5%ED%86%B5_%EB%B6%80%EB%B6%84_%EC%88%98%EC%97%B4 최장 공통 부분 수열 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 최장 공통 부분수열 문제는 LCS라고도 불린다. 이는 주어진 여러 개의 수열 모두의 부분수열이 되는 수열들 중에 가장 긴 것을 찾는 문제다.(종종 단 두 개중 하 ko.wikipedia.org 문자열 A, B가 있을 때LCS함수는 다음과 같이 정의한다. i = 0 또는 j = 0 일 때 -> 0 A[i] == B[i] 일 때 -> LCS[i][j] = LCS[i-1][j-1] + 1 A[i] != B[i] 일 ..
백준 [12865] 평범한 배낭 유명한 배낭 문제 영문판 위키에 자세하게 나와있지만, 그림 설명은 없다. en.wikipedia.org/wiki/Knapsack_problem Knapsack problem - Wikipedia From Wikipedia, the free encyclopedia Jump to navigation Jump to search Problem in combinatorial optimization Example of a one-dimensional (constraint) knapsack problem: which boxes should be chosen to maximize the amount of money while still keeping the o en.wikipedia.org 캐시의 크기를 다음과 같이 ..
백준 [2580] 스도쿠 이전 백트래킹 문제들이 일차원 배열을 이용해, 한 줄씩 처리하는 게 가능했다면, 이 문제는 이 방법이 먹히지 않았다. 특히, 입력을 2차원 배열의 스도쿠 판만 받아야 한단 생각을 해서 많이 꼬이고 헤맸다. 이 문제에서 우리가 고려해야 할 사항은 3가지다. 1. 가로줄 2. 세로줄 3. 3*3 정사각형 맨 처음에 스도쿠 판에 저장된 데이터만 가지고 올바른 값이 들어가있는지 검증하는게 무척 어려웠다. 이전에 풀었던 N-Queen 방식대로하면 세로줄까진 어찌어찌 해결해도, 3*3 정사각형에서 매번 헤맸다. 해결방법은 생각보다 간단했다. 입력을 받고나면, 해당 위치의 가로, 세로 3*3 칸에 입력받은 숫자가 사용됐다는 것만 표시하면 된다. 그림으로 설명하자면 이렇게 입력을 받는다면 가로의 정보를 저장하는 배열엔..