'컴퓨터공학 > Program Solving' 카테고리의 다른 글
BOJ 1517 버블 소트 (0) | 2017.02.13 |
---|---|
BOJ 1080 행렬 (0) | 2017.01.30 |
이분 그래프 (0) | 2017.01.16 |
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 1890 점프 (0) | 2017.01.04 |
BOJ 1517 버블 소트 (0) | 2017.02.13 |
---|---|
BOJ 1080 행렬 (0) | 2017.01.30 |
이분 그래프 (0) | 2017.01.16 |
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 1890 점프 (0) | 2017.01.04 |
https://www.acmicpc.net/problem/1517
난이도 H
버블 소트를 수행할 때, Swap이 총 몇 번 발생하는지 알아내느 문제
비슷한 문제로 삽입 정렬을 수행할 때 숫자들을 총 몇 번 옮기는지 계산하기
일반적인 버블소트는 O(N^2) 이기 때문에
문제 조건에서의 수행 시간을 만족하지 못함
이 문제를 풀기 위해선 O(N logN) 시간을 만족해야 함
O(N logN) sort + binary search, 팬윅 트리(바이너리 인덱스드 트리) 등을 이용하는 방법이 있지만
병합 정렬을 이용해서 문제 풀이가 가능
자세한 설명은 JM Book 762 페이지를 참고
BOJ 2186 문자판 (0) | 2017.02.15 |
---|---|
BOJ 1080 행렬 (0) | 2017.01.30 |
이분 그래프 (0) | 2017.01.16 |
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 1890 점프 (0) | 2017.01.04 |
https://www.acmicpc.net/problem/1080
그리디 알고리즘
난이도 MH ~ H
배열의 첫 인덱스부터 따라가면서
A배열과 B배열의 값이 다르면
그 칸을 기준으로 A배열을 뒤집는다.
마지막에 A배열과 B배열이 다른지만 확인한다.
비트 연산으로 구현하면 속도를 줄일 수 있지만
이 문제는 N이 작아서 그런 작업이 불필요하다.
BOJ 2186 문자판 (0) | 2017.02.15 |
---|---|
BOJ 1517 버블 소트 (0) | 2017.02.13 |
이분 그래프 (0) | 2017.01.16 |
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 1890 점프 (0) | 2017.01.04 |
https://www.acmicpc.net/problem/1707
이분그래프
난이도 : MH
이분 그래프란?
그래프의 정점의 집합을 둘로 분할하여, 각 집합에 속한 정점끼리는 서로 인접하지 않도록 분할할 수 있는 그래프
-> 인접하고 있는 노드가 서로 다른 2개의 색을 칠하는 것이 가능한 그래프
DFS나 BFS 로 노드를 따라가면서 1이나 -1로 색을 칠한다.
이 때, 인접한 노드의 색이 자신과 같은 색으로 이미 칠해져 있다면, 이분 그래프가 아닌 것을 확인할 수 있음
그런데 인풋 맵 안에 partial graph가 존재할 수 있으므로,
반복문을 통해 모든 노드를 확인해야 함
BOJ 1517 버블 소트 (0) | 2017.02.13 |
---|---|
BOJ 1080 행렬 (0) | 2017.01.30 |
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 1890 점프 (0) | 2017.01.04 |
BOJ 11404 플로이드 (0) | 2017.01.03 |
https://www.acmicpc.net/problem/1167
트리, DFS
난이도 MH
트리의 지름이란?
트리의 한 정점(V1)에서 다른 정점(V2) 까지의 거리가 제일 큰 것을 트리의 정점이라 한다.
보통 트리의 지름을 구하는 방법은
아무 정점이나 하나 골라서 가장 거리가 먼 V1을 찾고
그 V1을 이용해 가장 거리가 먼 V2를 찾아 길이를 구하면 트리의 지름이 된다.
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
using namespace std;
#define MAX_N 100000
int N, A, B, V;
typedef pair PAIR;
vector > input;
bool v1[MAX_N + 1];
bool v2[MAX_N + 1];
PAIR longest(int v, bool* visited)
{
visited[v] = true;
PAIR ret = make_pair(0, 0);
for (int i = 0; i < input[v].size(); i++)
{
if (!visited[input[v][i].first])
{
PAIR p = longest(input[v][i].first, visited);
if (ret.second < input[v][i].second + p.second)
{
ret.second = input[v][i].second + p.second;
ret.first = p.first;
}
}
}
if (ret.first == 0)
return make_pair(v, 0);
return ret;
}
int main(int argc, char** argv)
{
#ifdef _WIN32
freopen("Text.txt", "r", stdin);
#endif
scanf("%d", &N);
input = vector >(N + 1);
for (int i = 1; i <= N; i++)
{
scanf("%d", &V);
while (true)
{
scanf("%d", &A);
if (A == -1)
break;
scanf("%d", &B);
input[V].push_back(make_pair(A, B));
}
}
PAIR p1 = longest(1, v1);
PAIR p2 = longest(p1.first, v2);
printf("%d", p2.second);
return 0;
}
BOJ 1080 행렬 (0) | 2017.01.30 |
---|---|
이분 그래프 (0) | 2017.01.16 |
BOJ 1890 점프 (0) | 2017.01.04 |
BOJ 11404 플로이드 (0) | 2017.01.03 |
BOJ 2096 내려가기 (0) | 2016.12.04 |
이분 그래프 (0) | 2017.01.16 |
---|---|
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
BOJ 11404 플로이드 (0) | 2017.01.03 |
BOJ 2096 내려가기 (0) | 2016.12.04 |
BOJ 10472 십자뒤집기 (0) | 2016.11.27 |
https://www.acmicpc.net/problem/11404
https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
그래프, 플로이드-마샬, 최단 경로
난이도 : MH
BOJ 1167 트리의 지름 (0) | 2017.01.15 |
---|---|
BOJ 1890 점프 (0) | 2017.01.04 |
BOJ 2096 내려가기 (0) | 2016.12.04 |
BOJ 10472 십자뒤집기 (0) | 2016.11.27 |
BOJ 11004 K번째 수 (0) | 2016.11.27 |
https://www.acmicpc.net/problem/2096
분류 : DP
난이도 : MH
문제 조건에서 메모리가 4MB밖에 되지 않으므로,
슬라이딩 기법 등 메모리를 적게 사용하는 방법을 이용한다.
BOJ 1890 점프 (0) | 2017.01.04 |
---|---|
BOJ 11404 플로이드 (0) | 2017.01.03 |
BOJ 10472 십자뒤집기 (0) | 2016.11.27 |
BOJ 11004 K번째 수 (0) | 2016.11.27 |
BOJ 1874 스택 수열 (0) | 2016.11.27 |
https://www.acmicpc.net/problem/10472
분류 : BFS, Bit operation
난이도 : H
N이 3이기 때문에 별 지장이 업지만,
N이 많이 커질 경우를 대비하여 Bit operation으로 구현하였다.
보드의 맨 윗 배열만 버튼을 누르거나 안누르는 모든 경우의 수를 따지면, 총 2 ^ N 의 경우의 수가 나온다.
그 후 0번째 행의 i번째 열이 흑색(1) 일 경우, 1번째 행의 i번째 열을 누른다.
1번 째 행을 0번째 행의 색에 따라 눌러보았을 때, 0번째 행에 검은색이 남아 있는 경우는 답을 구할 수 없는 상태로 함수를 종료한다.
이 후, 마찬가지로 1번째 행의 남은 흑색을 이용해 2번째 행을 눌러본다.
그리고 1번째 행과 2번째 행이 모두 흑색이 없을 때, 저장한 카운트를 이용하여 최소 값을 구한다.
BOJ 11404 플로이드 (0) | 2017.01.03 |
---|---|
BOJ 2096 내려가기 (0) | 2016.12.04 |
BOJ 11004 K번째 수 (0) | 2016.11.27 |
BOJ 1874 스택 수열 (0) | 2016.11.27 |
BOJ 2580 (0) | 2016.11.27 |
https://www.acmicpc.net/problem/11004
분류 : 정렬
난이도 : MH
nth_element()
- 1부터 n 번째 순위 수 까지 정렬
- 모든 범위의 배열을 정렬할 필요가 없을 때 까지 사용
이 문제는, 일반 정렬(N logN)을 사용해도 답을 구할 수 있다.
BOJ 2096 내려가기 (0) | 2016.12.04 |
---|---|
BOJ 10472 십자뒤집기 (0) | 2016.11.27 |
BOJ 1874 스택 수열 (0) | 2016.11.27 |
BOJ 2580 (0) | 2016.11.27 |
BOJ 2776 암기왕 (0) | 2016.11.27 |