본문 바로가기

분류 전체보기

(33)
[백준] 4963번 섬의 개수 문제 위치 : https://www.acmicpc.net/problem/4963 1. Approach (1) BFS 탐색으로 접근한다. -> 플러드필 알고리즘을 응용한다면 풀 수 있다. 그래프 이론, 영상 처리에서 많이 사용하는 알고리즘이기 때문에 짚고 넘어가는 것을 권장한다. - 아이디어는 시작 좌표부터 끝 좌표까지 조건에 충족하는 좌표에서 부터 BFS를 실행한다. - 방문한 곳들은 전부 check한다. - BFS를 한 번 실행시킬 때 마다 섬의 개수를 1 증가시킨다. 2. Source Code #include #include #include #define MAX 51 using namespace std; int map[MAX][MAX]; bool check[MAX][MAX]; int dx[] = { ..
[백준] 2306번 유전자 문제 위치 : https://www.acmicpc.net/problem/2306 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> KOI 유전자가 될 수 있는 최대 길이를 문자열의 처음, 끝부터 분할해나가면서 확인한다. (2) DP 배열 정의 -> DP[s][e] : start 부터 end 까지 KOI의 최대 길이 (3) 후기 1. 문자열의 특정 패턴, 조건 등으로 길이를 구할 때 사용할 수 있다. 2. Source Code #include #include #include #include #define MAX 500 #define START0 'a' #define END0 't' #define START1 'g' #define END1 'c' using namespace std; /* ..
[백준] 1949번 우수 마을 문제 위치 : https://www.acmicpc.net/problem/1949 1. Approach (1) 트리를 이용한 다이나믹 프로그래밍으로 접근한다. - 모든 마을 간 연결을 한 후에 문제에 나와 있듯이 Tree 구조로 만든다. - 현재 마을이 우수 마을로 선정되었다면 이어져있는 다음 마을들은 우수 마을이 되면 안된다. - 현재 마을이 우수 마을로 선정되지 않았다면 이어져있는 다음 마을들은 우수 마을이 되거나, 아니어도 된다. - 경우의 수는 다음 마을이 우수 마을이 되지 않는 경우 1가지 - 현재 마을이 우수 마을이 아닐 경우에는 다음 마을이 우수 마을이 되는 경우 2가지가 있다. (2) DP 배열 정의 -> DP[idx][2] : idx 마을이 선정되거나 안되었을 경우 (0 or 1) 까지의 ..
[백준] 1006번 습격자 초라기 문제 위치 : https://www.acmicpc.net/problem/1006 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 영역별로 묶을 수 있는 (최대 2개) 영역들을 표시해나가면서 경우에 따라 재귀함수를 호출하면서 메모이제이션 한다. 영역의 상태는 아래와 같이 가정하였고 prev, last가 이 상태를 나타낸다. 0 -> not used 1 -> inner used 2 -> outer used 3 -> both used 위 상태를 정의하면서 상황에 맞게 따라나가면서 문제를 풀어나가는 방식이다. (2) DP 배열 정의 -> DP[idx][prev][last] : idx까지 이전 블록의 상태가 prev 이고 마지막 블록 n - 1 상태가 last 일 때 까지의 최소 초라기 수 (..
[백준] 11568번 민균이의 계략 문제 위치 : https://www.acmicpc.net/problem/11568 1. Approach (1) LIS( Longest Increasing Sequence) 로 접근한다. -> LIS는 다이나믹 프로그래밍 문제 중에서도 대표적인 문제이자, 많이 사용되는 풀이 방법 중 하나이므로 정확히 이해하고 지나가는 것을 권장한다. 아래 링크에서 LIS 풀이 방법을 확인 할 수 있다. https://blog.naver.com/lgh121546/221872278258 (2) DP 배열 정의 -> DP[idx] : idx까지 가장 긴 최장 증가 수열 2. Source Code #include #include #include #define MAXLEN 1000 using namespace std; /* 문제 ..
[백준] 4781번 사탕 가게 문제 주소 : https://www.acmicpc.net/problem/4781 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 사탕의 종류가 최대 5000개, 소유한 돈 100원, 사탕이 개당 0.01원 이라면 i) 현재 사탕을 선택하는 경우 ii) 현재 노드를 선택하지 않는 경우 -> 1번 사탕을 선택하고 다음 차례에 1번 사탕을 다시 선택할 수 있으므로, 중복을 포함한 5000개의 사탕을 총 10000번 선택하게 되면 시간초과가 발생하게 된다. (2) DP 배열 정의 -> DP[money] : 돈 money로 살 수 있는 사탕의 최대 칼로리 (3) 돈을 소수점 둘째자리까지 받으므로, 100을 곱해서 int형으로 바꾼다음 문제를 풀어나간다. 2. Source Code #in..
[백준] 2213번 트리의 독립집합 문제 주소 : https://www.acmicpc.net/problem/2213 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. ( 동작 방식을 같이 생각해야지 시간 초과의 여부를 알 수 있다 ) -> 이유는 트리의 노드가 최대 10,000개 이므로, i) 현재 노드를 선택하는 경우 -> 간선으로 이어져 있는 노드는 선택할 수 없다. ii) 현재 노드를 선택하지 않는 경우 -> 간선으로 이어져 있는 노드를 선택하지 않는 경우, 이어져 있는 노드를 선택하는 경우로 나뉜다. 총 3가지이고, 간단하게 모든 노드 10,000 개에 대해서 위 연산을 실행한다면, 약 3^10000 번의 연산을 하게 될 수가 있다. 즉, 시간 초과가 발생한다. (2) DP 배열 정의 -> DP[idx][2] : idx..
[백준] 9095번 1,2,3 더하기 문제 주소 : https://www.acmicpc.net/problem/9095 1. Approach (1) 다이나믹 프로그래밍으로 접근한다. -> 이유는 ( 3^10​ + 3^9 + ... + 3^1) 의 계산을 하게 되면, 시간 초과가 발생한다. (2) 동작 방식 ​ - num을 n부터 1, 2, 3으로 빼면서 함수를 실행시켜나간다. - 0에 도착하는 경우의 모든 수를 세야 한다. - num - 1, num - 2, num - 3을 하는 경우가 있으므로 이 3 경우를 전부 합쳐주면 된다. ​ (3) 다이나믹 프로그래밍은 대부분 결과 출력값 = 메모이제이션 테이블 = 함수반환 값이다. 즉, 재귀 함수를 호출할 때 넘겨주는 그 매개변수 값이 함수(num - 1)의 의미는 num - 1의 숫자를 1, 2,..