본문 바로가기

코테58

[C/C++] 나동빈 1이 될 때까지, Greedy 문제 어떤 수 N이 1이 될 때까지 다음의 두 과정을 반복적으로 선택하여 수행하려 한다. 1. N-1 2. N÷K (단, N이 K로 나누어 떨어질 때) 예를 들어, N이 17일 경우 1번, 2번, 2번 차례로 수행하면 N은 1이 되며, 총 연산횟수는 3이다. N과 K가 주어질 때 연산 횟수를 최소화하여 N을 1로 만드는 프로그램을 작성하라. 첫째 줄에 N(1≤N≤100,000)과 K(1≤K≤100,000)가 주어지며 N은 항상 K보다 크거나 같다. 코드 #include #include using namespace std; int main() { int N, K, num = 0; cin >> N >> K; if (K == 1) { cout 2023. 2. 2.
[C/C++] 나동빈 숫자 카드 게임, Greedy 문제 숫자 카드 게임은 세로N개, 가로M개 형태로 놓인 카드들 사이에서 가장 큰 수가 적힌 카드를 뽑는 게임이다. 이 게임의 규칙은 아래와 같다 1. 먼저 뽑고자 하는 카드가 있는 행을 선택한다. 2. 그 다음 그 행에 포함된 카드들 중에서 가장 낮은 수가 적힌 카드를 뽑는다. 따라서, 전체 행렬에서 큰 수가 아닌 하나의 행에서 가장 낮은 수를 고려하여 뽑아야 한다. 예를들어 카드가 아래와 같이 나열되어 있다고 하자. 3 1 2 4 1 4 2 2 2 전체 행렬에서 가장 큰 수는 4지만, 4가 포함된 행의 가장 낮은 수는 1이므로 최종 수는 1이 된다. 첫 번째 행의 최종 숫자도 마찬가지이다. 마지막 행의 가장 큰 수는 2이지만, 가장 낮은 수도 2이므로 마지막 행을 선택해야 2가 도출되어 이길 수 있다... 2023. 2. 2.
[C/C++] 나동빈 가장 큰 수 만들기, Greedy 문제 다양한 숫자들로 구성된 배열이 있을 때, 주어진 수를 M번 더하여 가장 큰 수를 만들되, 해당 숫자의 인덱스에 해당하는 수가 연속 K번 초과하여 더해질 수 없다. 예시1) N={2, 4, 5, 4, 6}, M=8, K=3 정답: 6+6+6+5+6+6+6+5=46 예시2) N={3, 4, 3, 4, 3}, M=7, K=2 정답: 4+4+4+4+4+4+4=28 첫 번째 줄에 배열의 크기 N(2≤N≤1,000), M(1≤M≤10,000), K(1≤K≤10,000)의 자연수가 주어지며 각 자연수는 공백으로 구분한다. 두 번째 줄에 자연수인 배열의 원소가 주어지며 각 원소는 공백으로 구분한다. K는 항상 M보다 작거나 같아야 한다. 코드 #include #include #include #include #in.. 2023. 2. 2.
[C/C++] 나동빈 거스름돈, Greedy 문제 거슬러줘야 할 돈이 N원일 때, 거스름돈으로 사용할 동전 500원, 100원, 50원 그리고 10원을 조합한 동전의 최소 개수를 구하라. 단, N은 항상 10의 배수이다. 코드 #include #include using namespace std; int coin[4] = { 500,100,50,10 }; int main() { int N, sum = 0; cin >> N; for (int i = 0; i < 4; i++) { sum += N / coin[i]; N %= coin[i]; } cout 2023. 2. 2.
[C/C++] 백준 2775, Dynamic Programming 2775번: 부녀회장이 될테야 (acmicpc.net) 2775번: 부녀회장이 될테야 첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다 www.acmicpc.net #include #include #include using namespace std; int compute(int k, int n) { int B[2][15]; int tod = 0; //현재층 (i-1층) int tom = 1; //다음 층 (i층) for (int i = 0; i 2022. 12. 10.
[C/C++] 백준 1463, Dynamic programming 1463번: 1로 만들기 (acmicpc.net) 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net * memoization이 아닌 recursive call을 사용하면 시간초과입니다. #include #include #include using namespace std; int min3(int a, int b, int c) { if (a < b && a < c) return a; else if (b < c) return b; else return c; } int make_one(int n) { vector arr(n + 1); int a = n; int b = n; int c = n; arr[1] = 0; for (int i.. 2022. 12. 10.