본문 바로가기
728x90

코딩테스트/BOJ49

DP > 쉬운 계단 수 (10844번) 문제 풀이 자자 중요한건 뭐다? 코테는 큰 수를 다루니까 왠만하면 자료형은 long long으로 쓰고!! 출력을 lld로 하고!!! 나머지 구하는 거면 저장할 때랑 출력할 때마다 나눠서 저장하고 출력해! 그리고 증감연산자 쓸거면 변수 선언하고 초기화 꼭꼭하고 임마!! 이것도 바로 전에 풀었던 문제랑 같은 맥락이야 계단 수니까 맨 뒤에 수가 어떤게 올지 고민하면 돼! 그럼 2차원 배열로 맨 뒤의 수가 뭐가 될지 정해주면 되는거지 이제 DP의 중요한 부분인 점화식을 고려해보자 2차원이니까 d[i][j]고, 이건 길이가 i이면서 맨 뒤 숫자가 j가 오는 계단수의 갯수를 저장하는 배열인거지 그럼 얘는 계단수니까 d[i-1][j-1]이랑 d[i-1][j+1]의 경우가 더해지는 경우겠지? 이 떄 중요한게 있어 바로.. 2021. 9. 4.
DP > 1, 2, 3 더하기 5 (15990번) 문제 풀이 자료형 이씨... 다 구현했는데 d배열을 int로 선언해서 틀렸다.. long long으로 바꾸니까 되네... 이게 오버플로우 고려를 해줬어야 하는데 안해서 난거 같다. 일단 풀이과정 설명 먼저 하고 오류 난 이유도 적어야지 우선 여기서는 이전에 풀었던 "1, 2, 3 더하기" 문제와 다른 점이 있다. 바로 숫자가 연속되게 올 수는 없다는 것이다. 예를 들어 n이 4일 때 1+1+2는 안되지만 1+2+1은 되는 것이다. 이 문제도 1, 2, 3 더하기 문제와 동일하게 맨 마지막에 오는 숫자에 집중을 해준다. 그렇게 문제를 쪼갤거니까~ 근데 달라지는 것은 맨 마지막 숫자에 따라서 앞에 올 수 있는 숫자가 달라진다는 것이다. 맨 마지막 숫자가 1이면? 앞에는 2, 3만 가능하고, 2이면 1, 3만.. 2021. 9. 4.
DP > 카드 구매하기 2 (16194번) 문제 풀이 아 이거 앞에거 풀고 바로 풀면 안될거같은데... 앞의 카드 구매하기 문제랑 달라진건 최소 금액이라는 거다 그래서 그냥 부등호만 바꿨다.. 최소값 구하는 로직으로.. 여기서 하나 유의할 점은 냅다 그렇게만 해두면 0이 결과값이 될 수 있기 때문에 만약 배열에 저장된 값이 0이면 일단 구한 값을 저장해줘야된다! 이거때매 한번 삐끗함ㅎㅎ 코드 #include #include #define MAX 1001 int d[MAX]; int p[MAX]; using namespace std; int main() { ///bottom-up ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; int res=0; cin>>n.. 2021. 9. 3.
DP > 카드 구매하기 (11052번) 문제 풀이 쉽지않다... d[n] = n개의 카드를 구매하기 위한 최대 지불 금액 여기서도 d[n]을 구하는 과정이 제일 중요하다 우선 p[n]은 n개의 카드가 들어있는 카드팩의 가격이다. 여기서도 주목하는 점은 마지막 선택하는 카드팩이 된다! d[n]에서 만약 마지막 고른 카드팩이 P1이라면? 남은 것은 d[n-1]일 것이다 또 P2면 d[n-2]가 된다 이렇게 쭉 고민하면 결론은 뭐다? d[i] = MAX(P[j] + d[i-j]) 가 된다! 전체 경우의 수에서 최댓값을 고르면 되는거다! 아직까진 dp가 쉽지 않은 것 같다.. 하다보면 늘겠지.. 꾸준히 해보자..! 코드 #include #include #define MAX 1001 int d[MAX]; int p[MAX]; using namespac.. 2021. 9. 3.
DP > 1, 2, 3 더하기 (9095번) 문제 풀이 아 재밌다(?) 당연히 재밌지 풀이 보고 풀었는데..ㅋㅋㅋㅋㅋ 이제 다시 감이 조금 살아는 나고있다! DP는 같은 답 다시 구하면 안돼 -> 반복문이나 재귀함수로 구하고 구한 값은 배열에 저장해! 그 때 중요한건 뭐다? 점화식 구하기!! 이것만 하면 아직까진 어려운 문제 없었음....점화식 못구해서 문제지만ㅋㅋ 암튼 풀이는 음... 여기서 d[n]은 n을 1, 2, 3으로 나타내는 방법의 수이고, 여기서 아이디어는 수를 표현할 때 마지막 수가 뭐냐는거야 n = ㅇ+ㅇ+ㅇ+ ... + ㅇ + ㅁ 여기서 ㅁ이 뭐냐는 거지!! ㅁ에 올 수 있는 건 1, 2, 3이잖아? 그럼 d[n] = d[n-1] + 1, d[n-2] + 2, d[n-3] +3 될 수 있겠지? (여기서 맨 뒤의 1, 2, 3은 걍.. 2021. 9. 3.
DP > 2xn 타일링 2 (11727번) 문제 풀이 퇴사하고 간만에 하는 알고리즘이란,,, 매일매일 아침에 7-9시나 10시까지 코테문제 3-5개씩 풀어야지! 했는데 오늘 11시에 일어났어 어제 고냥 그대로 잠들고 난리남...ㅋㅋ 그래...어제는 퇴사 첫날이자 개강 첫날이니까... 오늘은 근로 첫날인데 진짜 개꿀이네 이거 멀지만 않으면 20시간 걍 다 채우고싶다ㅠㅠ 수요일도 나오고 싶은거 꾹참았다.. 암튼 풀이 대충 쓰면 어제 밤에 그려놓고 오늘 푸는 알고리즘~..ㅎㅎ 이거 그 2*n타일링이랑 방식은 똑같은데 그냥 타일 하나 추가된거라 쉽게 품 그래서 코드도 거의 비슷해 top-down, bottom-up 2개 나눠서 풀었음 코드 Bottom-up #include #include #define MAX 1001 using namespace std.. 2021. 9. 2.
728x90