본문 바로가기

Algorithm

(130)
[C++] 백준 13398번 : 연속합 2 (G5) #문제 www.acmicpc.net/problem/13398 13398번: 연속합 2 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/94에서 푼 연속합 문제의 응용문제이다. 하나의 수를 삭제할 수 있으므로 각각에 대해 최대연속합을 구하여 비교하면 되지만, 그럴경우 시간복잡도가 O(N^2)이 되므로 문제조건에 의해 불가능하다. 따라서 다른 방법을 생각해 볼 때, DL[i]는 i번째 수에서 끝나는 최대 연속합, DR[i]는 i번째 수에서 시작하는 최대 연속합이라 하면 DL[i - ..
[C++] 백준 11054번 : 가장 긴 바이토닉 부분 수열 (G3) #문제 www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net #풀이 & 학습한 내용 가장 긴 증가/감소하는 부분 수열 문제를 응용한 문제이다. 먼저 S1 Sk+1 > ... SN-1 > SN에서 Sk에 for문을 통해 수열에 있는 모든 수를 넣어준다. 이때의 시간복잡도는 O(N). 그리고 Sk기준으로 수열의 앞부분에서는 Sk를 포함하는 가장 긴 증가하는 부분 수열을 구하고, 수열의 뒷부분에서는 Sk를 포함하는 가장 긴 감소하는 부분 수열을 구..
[C++] 백준 11055번 : 가장 큰 증가 부분 수열 (S2) #문제 www.acmicpc.net/problem/11055 11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수 www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/92에서는 길이를 구했다면, 이 문제에서는 수의 합에 대해 살핀다. 따라서 맨 처음 그 수만 포함할때인 p[i]를 dp[i]에 저장하고, 그 앞의 수들에 대해 p[j] dp[i]를 통해 dp[i]를 갱신하며 결정한다. 그리고 dp배열의 값들 ..
[C++] 백준 11722번 : 가장 긴 감소하는 부분 수열 (S2) #문제 www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/92에서 푼 문제에서 부호만 바뀐 문제이다. 맨 처음 그 수만 선택되었을 때인 1을 모두 넣어주고, 그 수 앞의 수들에 대해 p[j] > p[i] && dp[j] + 1 > dp[i]을 통해 dp[i]값을 결정한다. 그리고 dp배열 중 최댓값으로 답을 출력해준다. #소스..
[C++] 백준 1932번 : 정수 삼각형 (S1) #문제 www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net #풀이 & 학습한 내용 삼각형 내부의 어떤 수 기준으로 볼때 윗열에서 오는 수는 왼쪽에서 연결되거나 오른쪽에서 연결된다. "삼각형 내부의 i행 j열 위치에서 그 위치까지 연결된 합 중 최대"를 dp[i][j]이라 할 때, dp[i][j] = max({ dp[i - 1][j - 1], dp[i - 1][j] }) +p[i][j]인 substructure를 얻을 수 있다. 이를 토대로 for문을 구성하여 dp배열을 n까지 채운다. 그리고 마지막에 dp배열의 n행에 있는 값들 중 ..
[C++] 백준 2156번 : 포도주 시식 (S1) #문제 www.acmicpc.net/problem/2156 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/88에서 푼 이친수 문제와 유사한 문제이다. 이 문제는 경우를 크게 3가지로 나눠 문제를 관찰했다. 마신것을 1, 안마신것을 0이라 할 때, i-1번째와 i번째의 경우를 ?0,01,11로 나누었다.(?0은 00과 10을 모두 포함한다) 이때, 각각의 경우를 dp배열의 index 0, 1, 2에 저장하여 각각의 optimization을 관찰했다. ..
[C++] 백준 9465번 : 스티커 (S2) #문제 www.acmicpc.net/problem/9465 9465번: 스티커 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/100에서 풀었던 동물원 문제와 매우 유사한 문제이다. 한 열을 기준으로 위아래가 모두 비어있는 경우 index 0에, 위에만 있는 경우 index 1에, 아래에만 있는 경우 index 2에 각각의 optimization을 저장한다. 동물원에서는 경우의 수를 구했다면, 이 문제에서는 최대합을 구한다. 소스코드의 25~27행에 해당하는..
[C++] 백준 11057번 : 오르막 수 (S1) #문제 www.acmicpc.net/problem/11057 11057번: 오르막 수 오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이때, 인접한 수가 같아도 오름차순으로 친다. 예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다. 수 www.acmicpc.net #풀이 & 학습한 내용 소스코드의 16~22행에 해당하는 Optimal substructure를 통해 for문을 구성합니다. 마지막에 오는 원소가 i일 때 그 직전에 오는 수가 0부터 i까지 가능함을 이용합니다. dp[i][j]를 i번째수가 j일때의 경우의 수라 할때 dp[i][j]는 dp[i-1][0]부터 dp[i-1][j]까지의 합입니다. #소스코드 1 2 3 4 ..