[C++ / 백준 1392번] 정수 삼각형 2차원 배열로 해결했다. #include using namespace std;#define MOD 10007int a[501][501];int dp[501][501];int main() { int N; cin >> N; for (int i = 1; i > input; a[i][j] = input; } } int ans = a[1][1]; dp[1][1] = a[1][1]; for (int i = 2; i 프로그래밍 공부/백준 (C++) 2024.11.29
[C++ / 백준 9465번] 스티커 DP로 나누어 푸는 문제. 연상이 아직도 잘 안 된다. 경우의 수를 나누어서 풀었다. #include using namespace std;#define MOD 10007int a[3][100001];int dp[3][100001];int main() { int N; cin >> N; for (int i = 0; i > input; for (int k = 1; k > tmp; a[k][j] = tmp; } } dp[1][1] = a[1][1]; dp[2][1] = a[2][1]; dp[1][2] = a[1][2] + a[2][1]; dp[2][2] = a[2][2] .. 프로그래밍 공부/백준 (C++) 2024.11.28
[C++ / 백준 2225번] 합분해 음... 초반 경우의 수를 찾아 규칙을 통해 점화식을 세웠는데, 점화식은 세워서 정답을 맞췄지만 왜 그 점화식이 도출되는지는 모르는 사태가 발생했다. 따라서 GPT 에게 도움을 요청했다. 경우의 수는 두 가지로 나눌 수 있었는데,dp[i-1][j]: 숫자 i-1을 j개의 숫자로 표현한 후, 마지막 숫자에 1을 더하는 경우.dp[i][j-1]: 숫자 i를 j-1개의 숫자 합으로 표현한 후, 마지막 숫자에 1을 더하는 경우.이렇다고 한다. i = 3, j = 2 일때를 예시로 들자. dp[2][2] = (02 20 11) = 3dp[3][1] = (3) = 1dp[3][2] = (03 30 12 21 ) = 4 인데 dp[2][2] 에 i를 1 늘리는 경우 1 + 22 + 10 + 3 이고. dp.. 프로그래밍 공부/백준 (C++) 2024.11.23
[C++ / 백준 1699번] 제곱수의 합 #include #include #include #include using namespace std;int main() { vector a; int N; cin >> N; vector dp(N + 1, N); dp[0] = 0; for (int i = 1; i 프로그래밍 공부/백준 (C++) 2024.11.23
[C++ / 백준 1912번] 연속합 DP를 이용하여 풀이했다. 범위가 100,000 이고 시간 제한이 1초이므로 이중 for문을 사용할 수 없다.따라서 카데인 알고리즘을 활용해 풀이했다.배열 하나씩 더해가면서 DP 배열을 구하되 ans 변수를 이용해 최대 값이 나온 dp 배열 인덱스의 값을 동시에 찾도록 했다.그리고 0번째 인덱스 값 혼자가 최대값일 때를 대비해 for문에 들어가지 않는 0번 인덱스를 ans 와 다시 한번 비교해 주었다. 주의할 점은 dp 배열은 (해당 인덱스 - 1 ) + a[해당 인덱스] 값과 a[해당 인덱스] 값 중 누가 큰지를 저장하는 역할이고(0부터 해당 인덱스까지의 원소를 합했을 때의 최대 값) , 실제 답은 ans 에 저장된다는 것이다. #include #include #include using namesp.. 프로그래밍 공부/백준 (C++) 2024.11.22
[C++ / 백준 11053번] 가장 긴 증가하는 부분 수열 시간 제한이 1초이고, 수열의 크기가 1000이므로 1000 * 1000을 하였을 때 1억 번을 넘지 않아 이중 반복문으로 풀이 할 것을 예상했다. DP 문제들이 대부분 배열과 점화식을 사용해 해결하다보니 자연스럽게 C 배열로 선언해서 풀었었는데, 다른 풀이를 검색해서 보니 벡터를 사용하는 것이 훨씬 깔끔해 바꾸었다. 핵심은 이중 반복문으로 경우의 수를 전부 순회하며 가장 긴 수열을 만드는 DP 배열 값을 찾는 것이다. 우선 현재 인덱스 i 가 이전 인덱스들의 수보다 당연히 커야 하며, 이전 인덱스의 수보다 i 인덱스 수가 크다면 그때 dp 배열을 검사해 max ( i번째 값, dp[j] + i번째 값) 을 실행해 갱신해 주면 된다. #include #include #include using names.. 프로그래밍 공부/백준 (C++) 2024.11.19
[C++/백준 15990번] 1, 2, 3 더하기 5 2차원 배열 점화식을 이용하는 문제. 점화식을 이용한 dp 를 하는 것에 익숙해져야겠다. #include #include using namespace std;#define MOD 1000000009int arr[1001];int dp[100001][4];void DP(){ dp[1][1] = dp[2][2] = dp[3][1] = dp[3][2] = dp[3][3] = 1; for (int i = 4; i > N; DP(); for (int i = 0; i > input; cout 프로그래밍 공부/백준 (C++) 2024.11.14
[C++/백준 1463번] 1로 만들기 초기화 할 때 fill 을 사용해야 확실하게 초기화 할 수 있다.경우의 수를 나눈 다음 재귀를 활용해 풀이했다.#include #include using namespace std;int arr[1000001] ;int div(int input){ if(arr[input] == -1) { if(input % 6 == 0) { arr[input] = min({div(input-1), div(input/3), div(input/2)}) + 1; } else if (input % 3 == 0) { arr[input] = min({div(input-1), div(input/3)}) + 1; .. 프로그래밍 공부/백준 (C++) 2024.10.30
[C++/백준 11576번] Base Conversion #include #include using namespace std;int main() { int NA, NB; cin >> NA >> NB; int m; cin >> m; int num_10 = 0; int num_A = 0; int num_B = 0; for(int i = m-1 ; i > -1 ; i--) { int input; cin >> input; num_10 += input * pow(NA,i); } string result = ""; while(1) { if(num_10 == 0) break; result = to_string(num_10 % (NB)) + .. 프로그래밍 공부/백준 (C++) 2024.10.30
[C++/백준 1212번] -2진수 대략 황당했던 문제. 처음에 보고 이걸 어떻게 풀어야 하나 생각했다. 진법에 맞게 -2 로 나누되, 컴파일러의 양수 / 음수 , 음수 / 양수 나눗셈에 대한 이해를 요하는 문제였다. C/ C++ 컴파일러에서는 13 / -2 가 -6 이 나오고, 파이썬에서는 13 / -2 가 -7 이 나온다고 알려져 있다. 이는 컴파일러의 계산 차이에서 오는 것인데, 우리가 -2로 나눌 때 나머지가 음수가 나오면 진법에 적용을 할 수 없으므로 13 / -2 는 (-2) * ( -6) + 1 으로 나타내야 한다. 예시인 -13 을 예시로 들어보자. -13 / -2 -> (-2) * 7 + 17 / -2 -> (-2) * (-3) + 1-3 / -2 -> (-2) * (2) + 12 /-2 -> (-2) .. 프로그래밍 공부/백준 (C++) 2024.10.28