본문 바로가기

반응형

알고리즘

(6)
백준 2798, 블랙잭 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장의 카드에 써져 있는 숫자가 주어졌을 때, ..
백준 2749, 피보나치 수 3 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. ( 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 ... ) n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다. 출력 첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다. 예제 입력 ..
백준 3197, 백조의 호수 문제 두 마리의 백조가 호수에서 살고 있었다. 그렇지만 두 마리는 호수를 덮고 있는 빙판으로 만나지 못한다. 호수는 행이 R개, 열이 C개인 직사각형 모양이다. 어떤 칸은 얼음으로 덮여있다. 호수는 차례로 녹는데, 매일 물 공간과 접촉한 모든 빙판 공간은 녹는다. 두 개의 공간이 접촉하려면 가로나 세로로 닿아 있는 것만 (대각선은 고려하지 않는다) 생각한다. 아래에는 세 가지 예가 있다. ...XXXXXX..XX.XXX ....XXXX.......XX .....XX.......... ....XXXXXXXXX.XXX .....XXXX..X..... ......X.......... ...XXXXXXXXXXXX.. ....XXX..XXXX.... .....X.....X..... ..XXXXX..XXXXXX....
그래프(Graph), 넓이 우선 탐색(BFS), 깊이 우선 탐색(DFS) 그래프(Graph)는 각 정점(Vertex)와 간선(Edge)로 이루어진 자료구조이다. 그래프는 실생활에서도 많이 접할 수 있다. 버스 노선도, 지하철 노선도도 일종의 그래프이다. 그래프는 자료 구조 중에서도 가장 근본적인(?) 자료 구조라고 볼 수 있다. 그 예로 리스트(List)의 경우에도 구성을 보면 하나의 노드(Node)에 데이터와 다음 혹은 이전의 노드에 대한 정보를 저장하고 있어서 서로 연결되어 있다는 점에서 그래프의 정의라고 볼 수 있다. 트리 역시 루트 노드(Root Node)를 시작으로 밑에 자식 노드(Child Node)들이 연결되어 구성된다는 점에서 간선에서 제약 사항이 있는 그래프라고 볼 수 있다. 그래프를 표현하는 방식에는 인접행렬로 표현하는 것과 인접리스트로 표현하는 방식이 있다..
백준 10830, 행렬 제곱 문제 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. 입력 첫째 줄에 행렬의 크기 N과 B가 주어진다. (2 ≤ N ≤ 5, 1 ≤ B ≤ 100,000,000,000) 둘째 줄부터 N개의 줄에 행렬의 각 원소가 주어진다. 행렬의 각 원소는 1,000보다 작거나 같은 자연수 또는 0이다. 출력 첫째 줄부터 N개의 줄에 걸쳐 행렬 A를 B제곱한 결과를 출력한다. 예제 입력 1 2 5 1 2 3 4 예제 출력 1 69 558 337 406 예제 입력 2 3 3 1 2 3 4 5 6 7 8 9 예제 출력 2 468 576 684 62 305 548 656 34 412 예제 입력 3 ..
분할 정복과 거듭 제곱 알고리즘 분할 정복 알고리즘(Divide and conquer algorithm)은 그대로 해결할 수 없는 어려운 문제를 작은 문제로 분할하여 해결하는 알고리즘을 의미한다. 재귀함수(Recursive function)를 통해서 자연스럽게 구사되는 데 대략적으로 이렇게 구성된다. Recursive_Function(input){ if(input is simple){ return answer; } else{ partitial_Answer_1 = Recursive_Function(part_of_input_1); partitial_Answer_2 = Recursive_Function(part_of_input_2); partitial_Answer_3 = Recursive_Function(part_of_input_3); ....

반응형