From 6410905763f151986169c5448df648ed648f9c6a Mon Sep 17 00:00:00 2001 From: CheonBi Date: Tue, 20 Feb 2024 17:47:46 +0900 Subject: [PATCH] update alg catergory --- _posts/algo/2024-02-20-brute_force.md | 48 ++++++++++++++++++++++++--- _posts/algo/2024-02-20-greedy.md | 15 +++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 _posts/algo/2024-02-20-greedy.md diff --git a/_posts/algo/2024-02-20-brute_force.md b/_posts/algo/2024-02-20-brute_force.md index 807b192..2edfad4 100644 --- a/_posts/algo/2024-02-20-brute_force.md +++ b/_posts/algo/2024-02-20-brute_force.md @@ -8,8 +8,8 @@ categories: ## 1. Brute Force 브루트포스 -brute : 무식한 , force: 힘 -브루트 포스는 모든 경우를 고려하는 기법이다. +brute : 무식한 , force: 힘 +브루트 포스는 모든 경우를 고려하는 기법이다. 가능한 모든 조합을 다 탐색하므로 답을 무조건 찾을 수 있으나 비용이 매우크다. 시간복잡도가 매우 큰 기법이다. @@ -30,7 +30,7 @@ brute : 무식한 , force: 힘 이 단계는 시간 복잡도를 대략적으로 추정하는 것이다. 대부분 손으로 계산해 볼수 있는 부분이고 직접 계산을 통해 구한다. 2) 가능한 모든 방법을 다 만들어본다. -**단 한가지 경우라도 빠짐없이 만들어야 한다.** +**단 한가지 경우라도 빠짐없이 만들어야 한다.** 소스코드로 구현시 방법은 여러가지가 존재한다. ``` @@ -40,7 +40,7 @@ brute : 무식한 , force: 힘 - 비트마스크 ``` -3) 각각의 방법을 이용해 답을 구한다. +3) 각각의 방법을 이용해 답을 구한다. 보통 브루트포스 기법이 적용가능한 문제는 어렵지 않다. 문제를 따라가다보면 답을 구하는 경우가 많다. ## 3. 경우의 수 @@ -86,3 +86,43 @@ https://www.acmicpc.net/problem/2309 > 아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 **일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.** > >아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오 + + +```text +일곱난쟁이 키의 합이 100이므로 9명 중 7명을 골라서 풀게되면 for문을 7번 중첩해야한다. + +9 Combination 7 은 9 Combination 2 와 같다. +즉, 9명의 키 합에서 나머지 두명의 키를 뺀 값이 일곱 난쟁이의 키를 모두 합한 값이다. +``` + + +```java +import java.util.*; +import java.io.*; +public class Main { + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int[] arr = new int[9]; + int sum = 0; + + for (int i = 0; i < 9; i++) { + arr[i] = Integer.parseInt(br.readLine()); + sum += arr[i]; + } + + for (int i = 0; i < 8; i++) { + for (int j = i+1; j < 9; j++) { + if (sum - arr[i] - arr[j] == 100) { + arr[i] = 0; + arr[j] = 0; + Arrays.sort(arr); //오름차순 정렬 + for (int k = 2; k < 9; k++) { // 0 처리된 fake 난쟁이를 건너뛰고 출력 + System.out.println(arr[k]); + } + return; + } + } + } + } +} +``` \ No newline at end of file diff --git a/_posts/algo/2024-02-20-greedy.md b/_posts/algo/2024-02-20-greedy.md new file mode 100644 index 0000000..5494cf1 --- /dev/null +++ b/_posts/algo/2024-02-20-greedy.md @@ -0,0 +1,15 @@ +--- +title: "Algorithm : Greedy" +excerpt: "그리디" + +categories: + - algorithm +--- + +## 1. 그리디 알고리즘 +- 그리디 알고리즘(탐욕법)은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다. +- 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구한다. +- 정당성 분석이 중요하다. 단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는 검토해야 함 + +- 일반적인 상황에서 그리디 알고리즘은 최적의 해를 보장할 수 없을 때가 많다. +- 하지만 대부분의 문제는 탐욕법으로 얻은 해가 최적의 해가 되는 상황에서, 이를 추론할 수 있어야 한다.