코드트리 조별과제 6회차 (8.19 ~ 8.25)
·
알고리즘 (with JAVA)/코드트리 조별과제
상태 반전이 가능한 문제 [ 문제 ]문자열 길이 4인 0100이 주어졌을 때, 부분 문자열을 고르면, 해당 문자열 내 문자들이0은 1, 1은 0으로 반전이 일어난다고 한다.이때, 부분 문자열을 적절하게 골라 최소 횟수로 문자열이 1111이 되도록 하세요.  [ 접근 방법 ]0100에서 [2,2] 구간을 0000으로 만든 뒤, [1,4] 구간을 뒤집으면 1111이 되므로 최소 횟수는 2가 된다.먼저, 다음과 같이 생각을 해보자.전부 숫자 1을 만들기 위해 뒤집어야 하는 구간 끼리는 어떤 관계가 있을까?문제 특성상, 두 구간이 겹치는 곳에 있는 문자들은 2번 뒤집히기 때문에 결국 뒤집히지 않은 것과 같다.즉, 2번 뒤집혔다는 것은, 뒤집지 않았다는 것과 같다.이는 곧, 뒤집을 필요가 없다는 말과도 같다.예를..
코드트리 조별과제 5회차 (8.12 ~ 8.18)
·
알고리즘 (with JAVA)/코드트리 조별과제
Binary Search [ 문제 ][4, 2, 1, 5, 7, 3] 와 같이 숫자들이 주어졌을 때, 숫자 2가 위치하는 인덱스 값을 찾는프로그램을 작성하시오.   [ 해결책(1) - O(N) ]무작정 코드를 작성한다면, 아래 코드처럼 처음부터 끝까지 O(N)만큼 해당 숫자가 나올때까지 검색해야 할 것이다.123456789101112131415161718public class Main {    public static void main(String[] args) {        int n = 6, target = 2;        int[] arr = new int[]{0, 4, 2, 1, 5, 7, 3};         int idx = -1;         for(int i=1; i=n; i++){ ..
코드트리 조별과제 4회차 (8.05 ~ 8.11)
·
알고리즘 (with JAVA)/코드트리 조별과제
Two Pointer [ 문제 ][4, 2, 1, 5, 7, 3] 와 같이 숫자들이 주어졌을 때, 특정 구간을 선택하여 구간 내 숫자의 합이 10이 넘지 않으면서 가장 큰 구간의 크기를 구하는 프로그램을 작성하시오.  [ 해결책(1) - O(N^2) ]무작정 코드를 작성한다면, 아래 코드처럼 모든 구간 O(N^2)개를 잡아보면서 합이 10을 넘지 않는 경우 중 구간 크기의 최댓값을 구한다. 123456789101112131415161718192021222324252627282930313233public class Main {    public static void main(String[] args) {        int[] arr = new int[]{0, 4, 2, 1, 5, 7, 3};       ..
코드트리 조별과제 3회차(7.29 ~ 8.04)
·
알고리즘 (with JAVA)/코드트리 조별과제
PreProcessing [ 문제 ][4, 2, 1, 5, 7, 3] 와 같이 숫자들이 주어졌을 때, 특정 위치를 적절하게 선택하여 해당 위치에 놓여있는 숫자와 그 숫자를 포함하여 뒤에 놓여 있는 숫자들 중 최솟 값을 곱한 값이 최대가 되도록 프로그램을 작성하시오.  [ 해결책(1) - O(N^2) ]1번째 위치를 선택하게 되면, 1이 최솟값이므로 4*1 = 4 가 된다.5번째 위치를 선택하게 되면, 3이 최솟값이므로 7*3 = 21 이 된다.그러므로, 5번째 위치가 나오도록 하면 된다.무작정 코드를 작성하게 되면, 각 위치를 한번 씩 잡아보면서 그 뒤에 있는 숫자 전부를확인하면 O(N^2)이 된다.  [ 해결책(2) - O(N) ] 그러나, 만약 R이라는 배열을 R(i) = i 번째부터 N 번째까지 미..
코드트리 조별과제 2회차(7.22 ~ 7.28)
·
알고리즘 (with JAVA)/코드트리 조별과제
+1-1 Techinque- 아래와 같은 문제가 있다.1차 수직선 상에서 가로 n개의 선분이 주어졌고 어떤 임의의 세로 수직선을 그었을 때,만나는 서로 다른 선분의 개수는? 답: 3개 - 그림을 통해 봤을 때 당연히 3개라는 것은 알 수 있지만, 이를 컴퓨터로 구현하기 위해서는 어떻게 해야 할까? - 바로 1차 선분의 시작점과 끝점에 각각 +1과 -1을 붙이는 것이다. - 시작점과 끝점의 가중치 값을 부여하고 빨간선 앞쪽에 있는 가중치 값들 모두 더해주면 답이 나오게 된다. - 이 점을 활용하면 주어지는 모든 선분 N개를 각각 2개의 시작점, 끝점으로 구분하여 총 2N개의 점으로 나눠 이를 x좌표 순으로 오름차순 정렬한 뒤, x = k보다 커지기 직전까지의 숫자를 전부 더하는 식으로 진행해볼 수 있다. ..
1753번: 최단 경로 (골드 4)
·
백준 (with JAVA)/그 외
1753번: 최단경로 (acmicpc.net) 1753번: 최단경로 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 www.acmicpc.net 1. 문제 설명 2. 입출력 조건 및 예제 입력 조건 (1) 첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1 ≤ V ≤ 20,000, 1 ≤ E ≤ 300,000) (2) 둘째 줄에는 시작 정점의 번호 K(1 ≤ K ≤ V)가 주어진다. (3) 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 출력 조건 (1) ..
다익스트라 (Dijkstra)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) 다익스트라는 그래프의 한 정점에서 모든 정점까지의 최단거리를 각각 구하는 알고리즘이다. ( 이것을 줄여서 최단 경로 알고리즘이라고 부른다. ) (2) 다익스트라는 그래프 방향의 유무는 상관없으나, 간선들 중 단 하나라도 가중치가 음수이면 이 알고리즘은 사용할 수 없다. (3) 만약 음의 가중치를 가지는 간선이 있으며 가중치 합이 음인 사이클이 존재하지 않는 경우 벨만-포드 알고리즘을 사용한다. ( 또한 그래프 내에 가중치 합이 음인 사이클이 존재한다면, 무한히 음의 사이클을 도는 경우 합이 음수 무한대로 발산하기 때문에 최단 경로를 구성할 수 없다. ) 2. 과정 - 실제로 수행되는 과정이며, 특정한 정점에서 다른 모든 정점으로 가는 최단 경로를 기록하고 있다. 3. 입출력 조건 ..
1238번: 파티 (골드 3)
·
백준 (with JAVA)/그 외
1238번: 파티 (acmicpc.net) 1238번: 파티 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어 www.acmicpc.net 1. 문제 설명 2. 입출력 조건 및 예제 입력 조건 (1) 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. (2) 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어온다. (3) 시작점과 끝점이 같은 도로는 없으며, 시작점과 한 도시 A에서 다른 도시 B로 가..
1260번: DFS & BFS (실버 2)
·
백준 (with JAVA)/그 외
1260번: DFS와 BFS (acmicpc.net) 1260번: DFS와 BFS 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사 www.acmicpc.net 1. 문제 설명 2. 입출력 조건 및 예제 입력 조건 (1) 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. (2) 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. (3) 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있으며, 입력으로 주어지는 간선은 양방향이..
BFS (Breadth First Search)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) BFS는 너비 우선 탐색으로 최대한 깊숙이 들어가서 탐색을 시작하는 DFS와는 달리 인접한 노드부터 먼저 탐색하는 방법이다. ( 아래 2. 과정을 통해 이해하자. ) (2) BFS는 재귀호출을 사용하는 DFS와는 달리, 자료구조 큐(Queue)를 사용하는 경우가 일반적이다. ( 그러므로, 3. 코드에서는 큐를 이용한 BFS를 보여줄 것이다. ) 2. 과정 - 실제로 수행되는 과정이며, 앞서 DFS(깊이 우선 탐색)과 BFS(너비 우선 탐색)을 비교하고 있다. 3. 코드 : BFS는 재귀를 사용하지 않고 일반적으로 큐를 통해 구현한다. ( 아래의 코드 (1)과 (2)는 위 그래프 그림을 기반으로 코드를 작성했다. ) (1) 인접 행렬 public class BFS_Matrix { s..
DFS (Depth First Search)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) DFS는 깊이 우선 탐색으로 트리나 그래프에서 한 루트로 탐색하다가 특정 상황에서 최대한 깊숙이 들어가서 확인한 뒤 다시 돌아가 다른 루트로 탐색하는 방식이다. (2) DFS는 스택 또는 재귀 함수로 구현할 수 있으며, 모든 경로를 방문해야 할 경우 사용에 적합하다. 2. 과정 - 실제로 수행되는 과정이며, 하나의 브랜치 조사가 다 끝나면 다시 다른 브랜치를 조사하고 있다. 3. 인접 행렬 vs 인접 리스트 (1) 인접 행렬 (Adjecency Matrix) : 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식이다. ( 만약 위와 같은 그래프가 있다고 한다면, 아래와 같이 2차원 배열을 사용한다. ) Graph = { {0, 1, 1, 0}, {1, 0, 1, 1}, {1, 1..
해시 테이블 (Hash Table)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) 해시 테이블은 키(key)를 값(value)에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료 구조이다. 2. 과정 - 실제로 수행되는 과정이며, key값을 가지고 해당하는 index위치에 가서 buckets에 있는 value에 매핑하고 있다. - 아래는 실제 3. 코드에서 진행되는 과정 중 하나이며, 이것을 이해하면 코드를 쉽게 이해할 수 있을 것이다. 1. apple이 들어옴. getHashkey(apple)의 결과 2가 나옴. length[2]는 0이므로 처음 들어온 값임. s_data[2][0]에 apple을 저장함. length[2]를 ++함. 2. abc가 들어옴. getHashKey(abc)의 결과 2가 나옴. length[2]는 1이므로 이미 들어온 값임. ..
이진 탐색 (Binary Search)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) 이진 탐색은 정렬된 배열에서 검색 범위를 줄여 나가면서 원하는 데이터를 검색하는 알고리즘이다. (2) 이진 탐색은 오름차순으로 정렬된 정수의 리스트를 같은 크기의 두 부분 리스트로 나누고 필요한 부분 에서만 탐색하도록 제한하여 원하는 원소를 찾는 알고리즘이다. 2. 과정 - 실제로 수행되는 과정이다. 3. 코드 public class BinarySearch { static int[] A = { 7, 2, 8, 10, 1 }; public static void main(String[] args) { Arrays.sort(A); solve(10, 0, A.length-1); } public static void solve(int a, int low, int high){ int mid=..
계수 정렬 (Counting Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 계수 정렬은 데이터의 개수(예를 들면 1이 두 개 있다면 2)를 데이터의 값에 대응하는 위치에 저장한 뒤, 자신의 위치에서 앞에 있던 값을 모두 더한 배열을 만든 뒤, 거기서 데이터가 들어가야 할 위치를 찾아내는 알고리즘이다. (2) 계수 정렬은 가장 큰 데이터에 따라 효울이 좌지우지 된다.   2. 과정1. 정렬해야 할 배열을 탐색하여 그 최댓값을 구한다.( 여기서는 주어진 배열 A를 사용한다. )A =  [5, 4, 1, 3, 2, 5, 1]최댓값 K = 5; 2. K+1 만큼의 크기로counts 배열을 생성한다.counts = [0, 0, 0, 0, 0, 0] 3. A 배열 모든 원소에 대하여 각 대응되는 인덱스 위치에 ++를 해준다.counts = [0, 2, 1, 1, 1,..
기수 정렬 (Radix Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 기수 정렬은 간단하게 말하면 데이터의 N진법을 기준으로 정렬하는 알고리즘이다.( 예를 들면, N이 10이고 정렬할 데이터는 10, 5, 15, 234, 1이라고 하자. 그렇다면 아래와 같이 기준을 잡는다. ) 10^0의 자리: 0) 010, 1) 001, 4) 234, 5) 005, 015. 순서대로 이어붙이면 010, 001, 234, 005, 015.10^1의 자리: 0) 001, 005, 1) 010, 015, 3) 234. 순서대로 이어붙이면 001, 005, 010, 015, 234.10^2의 자리: 0) 001, 005, 010, 015, 2) 234. 순서대로 이어붙이면 001, 005, 010, 015, 234. ( 이 과정을 거치면 정렬된 결과인 1, 5, 10, 1..
힙 정렬 (Heap Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 힙 정렬은 *완전 이진 트리를 기본으로 하는 힙 자료구조를 기반으로한 알고리즘이다.( *완전 이진 트리는 삽입할 때 왼쪽부터 차례대로 추가하는 이진 트리를 말한다. ) (2) 사실 힙 정렬은 선택 정렬과 거의 같은 알고리즘으로, 단지 가장 큰 원소를 뒤로 보내는 데에 단순히 매번 쭉 돌면서 알아내느냐 힙을 사용하여 알아내느냐가 유일한 차이점이다.   2. 과정   3. 코드: 여기서의 코드는 2.과정처럼 배열 한 개씩 넣어서 이진트리를 만드는 것이 아닌 이미배열의 값들이 순차적으로 트리의 형태로 있다고 가정하고 진행하는 것이다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748..
삽입 정렬 (Insertion Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 삽입 정렬은 인덱스 0번 위치 원소부터 시작하여 뒤 원소들과 비교하고 삽입할 위치를 지정한 후,  원소를 뒤로 옮기고 지정된 자리에 자료를 삽입하는 알고리즘이다. (2) 삽입 정렬은 선택 정렬과 유사하지만, 좀 더 효율적인 알고리즘이다. (3) 선택 정렬과 함께 인간에게 뭔가를 정렬하라고 하면 무의식적으로 사용하는 대표적인 알고리즘이다.    2. 과정 - 실제로 수행되는 과정이며, 삽입하는 동시에 정렬한다.     3. 코드1234567891011121314151617public class InsertSort {    public static void main(String[] args) {        int[] A = { 7, 2, 8, 10, 1 };               ..
병합 정렬 (Merge Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) 병합 정렬은 분할 정복 방법으로 퀵 정렬처럼 배열을 두 부분으로 원소 개수가 0 또는 1이 될때까지 쪼개고 쪼개서 크기를 비교해 병합해 나간다. (2) 병합 정렬은 합병 정렬이라고도 부른다. (3) 병합 정렬은 대표적인 분할 정복 알고리즘으로 존 폰 노이만의 천재성을 엿볼 수 있는 알고리즘이다. 2. 과정 - 실제로 수행되는 과정이며, 대표적인 분할 정복 방식이다. 3. 코드 123456789101112131415161718192021222324252627282930313233public class MergeSort { static int[] A = { 38, 27, 43, 9, 3, 82, 10 }; static int[] tmp = new int[A.length]; public..
선택 정렬 (Selection Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 선택 정렬은 배열의 인덱스 위치를 정한 후, 가장 작은 원소를 넣으며 순차적으로 정렬하는 알고리즘이다.    2. 과정- 실제로 수행되는 과정이며, 맨 앞 인덱스부터 위치를 정한 후, 가장 작은 원소를 찾아서 넣는다.     3. 코드123456789101112131415161718192021public class SelectionSort{    public static void main(String[] args) {        int[] A = { 7, 2, 8, 10, 1 };                for(int i=0; iA.length-1;  i++) {            int index = i;                        for(int j=i+1; ..
퀵 정렬 (Quick Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명(1) 퀵 정렬은 분할 정복(divide and conquer) 방법을 통해 정렬하는 알고리즘이다. (2) 방식은 적절한 원소 하나를 기준(pivot)으로 삼아 그보다 작은 것을 앞으로 빼내고 피벗 뒤로 옮겨작은 것, 큰 것으로 나눈 뒤 나누어진 각각에서 다시 피벗을 잡고 정렬해서 각각의 크기가 0이나 1이 될 때까지 정렬한다.( 설명 글보다 아래 과정과 코드를 하나씩 써보며 이해하는 것을 추천합니다. ) (3) 퀵 정렬은 컴퓨터로 가장 많이 구현된 정렬 알고리즘 중 하나이다.   2. 과정    3. 코드123456789101112131415161718192021222324252627282930313233343536373839404142public class QuickSort {    p..
거품 정렬 (Bubble Sort)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 설명 (1) 거품 정렬은 서로 인접한 두 원소의 대소를 비교하고 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘이다. 2. 과정 - 실제로 수행되는 과정이며, 배열 0 인덱스부터 순차적으로 비교한다. 3. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class BubbleSort { static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in)); static StringBuilder sb = new StringBuilder(); public static void main(String[] args) throws IOException { int..
안정 정렬과 불안정 정렬
·
알고리즘 (with JAVA)/기본 알고리즘
1. 안정 정렬 vs 불안정 정렬- 안정 정렬은 반복되는 요소를 입력 때와 동일한 순서로 정렬시킨다. - 불안정 정렬은 안정 정렬 개념의 반대를 의미한다. - 예를 들면, 아래의 그림처럼 안정 정렬은 처음 시간 순으로 정렬하고 난 뒤 다시 지역으로 정렬한다면, 시간이 정렬된상태에서 정렬되지만 불안정은 그렇지 않다.    2. 안정 정렬에 대표적인 정렬들- 삽입, 병합, 버블, 계수 정렬이 있다.    3. 불안정 정렬에 대표적인 정렬들- 퀵, 선택 정렬이 있다.
세이브를 이용한 자동 import 문 생성하기
·
자바/팁
1. 세이브를 이용한 자동 import 문 생성하기 - 일반적으로 코드를 작성할 때 import 문이 없다고 아래의 사진처럼 빨간줄로 에러 메시지를 준다. - 이렇게 되면 아주 귀찮게 하나하나씩 다 import를 해 줘야 한다. - 이럴 때 해결방법은 [CTRL + S] 즉, 세이브 버튼을 누를 때 import 문을 자동으로 생성하게 하는 것이다. - 해당 기능을 가능하게 할려면 아래의 사진처럼 저 빨간색 네모상자에 있는 버튼을 활성화를 해야한다. * [Java] -> [Editor] -> [Save Actions] -> [Organize imports] - 이제 설정이 완료되면 빨간줄이 발생했을 때 [CTRL + S]를 눌러 import 문을 추가해보자.
자동 완성 힌트
·
자바/팁
1. 자동 완성 힌트 주기 - 보통 코드를 쓸 때 자신이 선언한 변수나 해당 클래스의 함수, 변수를 이용하지만, 일일이 이름을 다 외우면서 사용하지는 않는다. - 그러므로 다들 한 번씩은 자신이 선언한 변수명을 보러가거나 예전에 사용했던 클래스의 함수명, 변수명을 인터넷 또는 서적을 참고할 때가 있다. - 그렇게 되면 시간을 잡아먹게 된다. 이러한 것을 해결하기 위해서는 "자동 완성 힌트" 기능을 이용하는 것이다. 아래의 사진을 보고 한 번 따라해보자. (1) 먼저 툴에 있는 [Window] 클릭 -> [Preferences] 클릭 (2) 그러면 아래의 창이 나오게 되는데 [Java] 클릭 -> [Editor] 클릭 -> [Content Assist] 클릭 하여 아래의 버튼들을 활성화 (3) 그리고 맨 ..
탐욕법 (Greedy Method)
·
알고리즘 (with JAVA)/기본 알고리즘
1. 개념 - 알고리즘에서의 탐욕법은 우리가 원하는 답을 얻기 위해서 재귀 호출과 똑같이 여러 개의 조각으로 쪼갠 후 각 단계마다 답의 한 부분을 만들어 간다는 점이다. ( 이 부분은 완전 탐색과 DP(동적계획법)와 똑같다. ) - 모든 선택지를 고려해 보고 그중 전체 답이 가장 좋은 것을 찾는 완전 탐색과 DP(동적계획법)와는 달리, 탐욕법을 사용하는 알고리즘은 지금 바로 가장 좋은 방법만을 선택한다. 2. 이해하기 - 예를 들어, 외판원 문제에서 사용한 DP(동적계획법)는 다음에 도착할 수 있는 도시들을 하나하나 검사해 보고, 남은 도시들을 모두 순회하는 데 필요한 거리의 합을 최소화하는 답을 찾았지만, 탐욕적인 알고리즘은 당장 다음 도시까지의 거리만을 최소화한다. - 그러므로, 탐욕적인 알고리즘은 ..
두니발 박사의 탈옥 (난이도: 중)
·
알고리즘 (with JAVA)/동적 계획법
1. 문제 설명 (1) 위험한 살인마 두니발 박사가 감옥에서 탈출했다. 수배지를 붙이고 군경이 24시간 그를 추적하고 있지만 쉽사리 잡히지 않았다. (2) d일이 지난 후에야 경찰은 프로그래밍의 천재인 찰리 교수를 찾았고, 그는 감옥에 남겨둔 노트를 분석하여 아래와 같은 가설을 세웠다. 1 두니발 박사는 검문을 피해 산길로만 이동한다. 2 두니발 박사는 교도소를 탈출한 당일, 교도소와 인접한 마을 하나로 도망쳐 은신한다. 3 두니발 박사는 수색을 피하기 위해 매일 인접한 마을로 움직여 은신한다. (3) 이 3개의 가설을 검증하기 위해 교도소로부터 산길로 연결된 N개 마을들의 지도를 아래의 그림과 같이 구했다. * ex) 지도의 3번에 교도소가 있다고 가정하면, 두니발 박사는 0번, 1번, 2번, 4번, ..
폴리오미노 (난이도: 중)
·
알고리즘 (with JAVA)/동적 계획법
1. 문제 설명 (1) 정사각형들의 변들을 서로 완전하게 붙여 만든 도형들을 폴리오미노(Polyomino)라고 부른다. (2) N개의 정사각형으로 구성된 폴리오미노들을 만들려고 하는데, 이 중 세로로 단조(monotone)인 폴리오미노의 수가 몇 개나 되는지 세고 싶다. * 세로로 단조라는 뜻은 어떤 가로줄도 폴리오미노를 두 번 이상 교차하지 않는다는 것이다. (3) 예를 들어, 아래의 그림 (a)는 정상적인 세로 단조 폴리오미노이지만, (b)는 파란색 점선이 폴리오미노를 두 번 교차하기 때문에 세로 단조 폴리오미노가 아니다. * (c)는 맨 오른쪽 아래 사각형이 변을 완전히 맞대고 있지 않기 때문에 폴리오미노가 아니다. (4) N개의 정사각형으로 구성된 세로 단조 폴리오미노의 개수를 세는 프로그램을 작..
비대칭 타일링 (난이도: 하)
·
알고리즘 (with JAVA)/동적 계획법
( 아래의 사이트에 나오는 알고리즘을 먼저 보는 것을 추천합니다. ) 타일링 방법의 수 세기 (난이도: 하) (tistory.com) 타일링 방법의 수 세기 (난이도: 하) 1. 문제 설명 (1) 2xN 크기의 사각형을 2x1 크기의 타일로 채우는 방법의 수를 계산하는 문제가 있다고 하자. (2) 타일들은 서로 겹쳐서는 안 되고 90도로 회전해서 쓸 수 있다. (3) 예를 들어, N=5라고 kind-coding.tistory.com 1. 문제 설명 (1) 아래의 그림과 같이 2xN 크기의 직사각형을 2x1 크기의 타일로 채우려고 한다. (2) 타일들은 서로 겹쳐서는 안 되고, 90도로 회전해서 쓸 수 있다. * 단 이 타일링 방법은 좌우 대칭이어서는 안 된다. (3) 위의 그림은 2x5 크기의 직사각형을..
장마가 찾아왔다 (난이도: 하)
·
알고리즘 (with JAVA)/동적 계획법
( 이 알고리즘은 아래 링크에 이어서 진행됩니다. ) 우물을 기어오르는 달팽이 (난이도: 하) (tistory.com) 우물을 기어오르는 달팽이 (난이도: 하) 1. 문제 설명 (1) 깊이가 N미터인 우물의 맨 밑바닥에 달팽이가 있다. (2) 달팽이는 우물의 맨 위까지 기어올라가고 싶어하는데, 달팽이의 움직임은 그 날의 날씨에 좌우된다. (3) 날이 맑으면 하루 kind-coding.tistory.com 1. 문제 설명 (1) 앞의 문제에서는 날이 맑거나 비가 올 확률은 동일하게 50%의 확률을 가졌다. (2) 그러나 여기서는 비가 올 확률을 50%에서 75%로 올라갔다고 가정한다. (3) 그렇다면 달팽이가 앞으로 M일 안에 우물 끝까지 올라갈 확률을 찾는 프로그램을 작성하시오. 2. 입출력 조건 및 예..
1436번: 영화감독 숌 (실버 5)
·
백준 (with JAVA)/완전 탐색
1436번: 영화감독 숌 (acmicpc.net) 1436번: 영화감독 숌 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타 www.acmicpc.net 1. 문제 설명 2. 입출력 조건 및 예제 입력 조건 (1) 첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다. 출력 조건 (1) 첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다. 입출력 예제 3. 제약 조건 4. 가정법 X 5. 기저 사례 X 6. 코드 : 두 가지 코드가 존재한다. (1)은 Brute-Force 답게 666 숫자를 처음부터 +1씩 증가시키는 것이다. 그렇게 하..