본문 바로가기

분류 전체보기102

[C/C++] 11052: 카드 구매하기 문제를 Top-down 방식으로 이해해본 다음에 Bottom-Up 방식으로 구현을 하였다. 예를 들어 dp[n]을 구하는 경우에 dp[n]=max(dp[n]+dp[0],dp[n-1]+dp[1],dp[n-2]+dp[2],,,,,,,,,,dp[n-k]+dp[k],,,,) 형태가 된다는 것을 알 수 있다. 이때 dp[n-k]와 dp[k]일때 (n-k>=k) 최대값을 각각 구하고 있다면 dp[n-k]+dp[k]도 최댓값이 된다. 따라서 k=1에서 k=[n/2]인 자연수까지 중에서 최댓값을 구한다면 dp[n]을 구할 수 있게 된다. 그 결과 dp[1]부터 dp[n]까지 각 경우의 최댓값을 dp배열에 저장하고 이를 이용해 문제를 풀었다! 이걸 비교하는 코드는 아래와 같다. for(int i=2;i=j) { dp[i.. 2023. 8. 30.
[C/C++] 17070: 파이프 옮기기 1 이 문제도 (1,2)를 시작해서 graph를 탐색하며 (n,n)까지 가는 경우의 수를 구하는 문제이기 때문에 그래프 탐색 이론을 사용해야한다. 내가 구현한 방식으로는 현재 지점이 이전 지점에서 어떻게 왔냐 (1.가로 2.대각선 3.세로)에 따라서 탐색의 방향을 정했기 때문에 2차원 배열을 이용하여 queue를 사용한 BFS보다는 DFS가 훨씬 쉽다고 판단하여 DFS를 이용하여 문제를 풀었다. DFS에서 이전 지점에서 어떻게 왔냐에 따라 아래 코드처럼 나누었다. void DFS(int n,int x,int y) { if(previous[y][x]==1) //오른쪽으로 감 GoRight(n,x,y); if(previous[y][x]==2) //대각선으로 감 GoDiagonal(n,x,y); if(previo.. 2023. 8. 29.
[C] 1026: 보물 결국 함수 S를 최소화하기 위해 배열 A를 재배열 해야한다. 최소화 하기 위해서는 현재 남아있는 A배열에 가장 작은 수와 B배열에 남아있는 가장 큰 수를 곱해줘야지만 S의 값이 최소가 된다. 이 문제에서는 B에 있는 수를 재배열하면 안된다고 했지만 어차피 문제는 답만 맞으면 된다는 생각으로 A는 오름차순으로 B는 내림차순으로 정렬한뒤 같은 index끼리 곱해주었다. 사실 이 문제와 완전 같은 방식으로 하기 위해서는 이차원 배열 두 개를 만든 뒤 현재 남아있는 A배열에 가장 작은 수와 B배열에 남아있는 가장 큰 수를 곱해주고 그 수는 지나갔다는 표시를 남겨주어 다음번에 이 수는 아예 빼고 생각하도록 코드를 짜면 된다. #include int arrA[51]; int arrB[51]; void swap(in.. 2023. 8. 25.
[C/C++] 1541: 잃어버린 괄호 이 문제는 -가 언제 나오냐가 중요하다. -가 나올 때 그 다음 -가 나올때 까지 합을 빼는 것이 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 것이다. 또한 -가 나올 때마다 다음 -가 나올 때까지 합을 빼는 것이 가장 최소이기 때문에 현재에 이익이 문제 전체의 이익이 되는 Greedy 알고리즘의 일종이다. 나는 배열 2개만 써서 구현하였지만 아예 -가 나올 때마다 부분 집합을 만들어서 (slice를 통해) 각 값을 더하거나 빼서 구현할 수도 있을 것 같다!! 아래는 소스코드다!! #include #include char arr[52]; int store[3]; int ContinueCalculate(int i,int max) { if(arr[i]=='+') { store[0]+=store[1]; s.. 2023. 8. 24.