티스토리 뷰
문제
20167번: 꿈틀꿈틀 호석 애벌레 - 기능성
꿈틀꿈틀 호석 애벌레는 N 개의 먹이가 일렬로 나열된 나뭇가지를 오른쪽으로 기어가려고 한다. 시작하는 순간의 호석 애벌레가 0의 위치에 있고 i 번째 먹이는 오른쪽으로 i 초 기어가야 도달할
www.acmicpc.net
20181번: 꿈틀꿈틀 호석 애벌레 - 효율성
꿈틀꿈틀 호석 애벌레는 N 개의 먹이가 일렬로 나열된 나뭇가지를 오른쪽으로 기어가려고 한다. 시작하는 순간의 호석 애벌레가 0의 위치에 있고 i 번째 먹이는 오른쪽으로 i 초 기어가야 도달할
www.acmicpc.net
20167 풀이
N의 상한이 20이기에 i번째 먹이를 먹었거나 안 먹었거나를 전부 조사하는 완전 탐색을 통해 2^20에 해결할 수 있습니다.
20181 풀이
N의 상한이 크므로 연속된 구간을 관리하기 위해 [l, r)구간을 보는 투 포인터를 사용했습니다. 신경 써야 하는 부분은 i번째 칸까지 탈피 E의 최대 값을 구하는 것과 i번째 칸까지 누적된 만족도를 관리하는 것으로 크게 두 가지가 있고 이는 아래와 같이 해결했습니다.
1. i번째까지 탈피E의 최대 값을 구하는 것은 "dp[i] = i번째까지 탈피 E의 최대 값"라고 정의하고 dp배열을 채워나가면 결과적으로 답은 구간[0, n - 1]에서 dp[i]의 최댓 값으로 구할 수 있습니다.
2. [l, r)구간의 누적된 만족도는 sum이라는 변수를 통해 관리하고, sum과 k의 대소 비교를 통해 l, r을 조절할 수 있습니다.
1. $ sum >= k $ : [l, r)구간의 누적된 만족도가 k보다 큰 것이므로 l이전까지 탈피 E의 최대 값을 찾아 $sum - k$와 더해 끝점인 dp[r -1] 값을 갱신해주면 되고, l을 한 칸 옮겨 새로운 구간을 찾을 수 있습니다.
2. $ sum < k $ : [l, r)구간의 누적 만족도가 k보다 작은 것이므로 r을 한 칸 옮깁니다.
20167 코드
#include <bits/stdc++.h>
using namespace std;
int n, k, ans;
vector<int> v;
void go(int x, int sum, int e) {
if (x == n) {
ans = max(ans, e);
return;
}
go(x + 1, 0, e);
if (sum + v[x] >= k) go(x + 1, 0, e + sum + v[x] - k);
else go(x + 1, sum + v[x], e);
}
int main() {
cin.tie(NULL); cout.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n >> k;
v.resize(n);
for (int &i : v) cin >> i;
go(0, 0, 0);
cout << ans;
}
20181 코드
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, k, l, r;
ll sum, dp[100001], lmax, ans;
vector<int> v;
int main() {
cin.tie(NULL); cout.tie(NULL);
ios_base::sync_with_stdio(false);
cin >> n >> k;
v.resize(n);
for (int& i : v) cin >> i;
while (1) {
if (sum >= k) {
lmax = (l == 0 ? 0 : max(lmax, dp[l - 1]));
dp[r - 1] = max(dp[r - 1], lmax + sum - k);
sum -= v[l++];
}
else if (r == n) break;
else sum += v[r++];
}
for (int i = 0; i < n; i++)
ans = max(ans, dp[i]);
cout << ans;
}
'Algorithm > BOJ' 카테고리의 다른 글
[백준 20291] 파일 정리 (0) | 2020.12.11 |
---|---|
[백준 20168, 20182, 20183] 골목 대장 호석 - 기능성, 효율성 (0) | 2020.12.02 |
[백준 20166] 문자열 지옥에 빠진 호석 (0) | 2020.12.01 |
[백준 20165] 인내의 도미노 장인 호석 (0) | 2020.11.30 |
[백준 20164] 홀수 홀릭 호석 (0) | 2020.11.30 |
- Total
- Today
- Yesterday
- 카카오 2021
- 게임이론
- DP
- 동적계획법
- 2021 카카오 블라인드
- 위클리 챌린지
- 카카오 인턴십
- 구현
- 2020 KAKAO BLIND RECRUITMENT
- 프로그래머스 월간코드챌린지
- 2022 카카오블라인드
- 카카오 2020 인턴십
- BFS
- 누적합
- 프로그래머스 위클리 9주차
- 유니온파인드
- 카카오 표 편집
- 투포인터
- 카카오 2차코딩테스트
- 파싱
- 트리
- 표 편집
- 이분탐색
- 2022 카카오 블라인드 코딩테스트
- 백준
- 프로그래머스
- 2021 KAKAO BLIND
- Kakaoblind
- 시뮬레이션
- 2022 KAKAO BLIND RECRUITMENT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |