문제
6236번: 용돈 관리
현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로
www.acmicpc.net
코드1
#include<bits/stdc++.h>
using namespace std;
int n, m, a[100001];
bool check(int mid)
{
int cnt = 1;
int money = 0;
for (int i = 0; i < n; i++)
{
if (money + a[i] > mid)
{
if(a[i] > mid)
return false;
cnt++;
money = a[i];
}
else
{
money += a[i];
}
if (cnt > m)
{
return false;
}
}
return true;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int lo = 1, hi = 100004, ans = n;
while (lo <= hi)
{
int mid = (lo + hi) / 2;
if (check(mid))
{
ans = mid;
hi = mid - 1;
}
else
{
lo = mid + 1;
}
}
cout << ans << "\n";
return 0;
}
코드2
#include<bits/stdc++.h>
using namespace std;
int n, m, a[100001];
bool check(int mid)
{
int cnt = 1;
int money = 0;
int extraMoney = mid;
for (int i = 0; i < n; i++)
{
extraMoney -= a[i];
if (extraMoney < 0)
{
if(a[i] > mid)
return false;
cnt++;
extraMoney = mid;
extraMoney -= a[i];
}
if (cnt > m)
{
return false;
}
}
return true;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int lo = 1, hi = 100004, mid, ans;
while (lo <= hi)
{
mid = (lo + hi) / 2;
if (check(mid))
{
ans = mid;
hi = mid - 1;
}
else
{
lo = mid + 1;
}
}
cout << ans << "\n";
return 0;
}
처음에 코드1에서 아래 경우에 대한 예외처리를 안해줘서 로직 자체가 틀린 줄 알고 코드2로 시도했다.
if(a[i] > mid) return false;
코드2에서 혹시나 싶어서 위 예외처리 해줬더니 맞길래
코드1에서도 위 예외처리 다시 한 다음에 제출하니까 정답이었다.
a[i]값이 mid 값보다 클때는 무조건 실패처리가 맞는건가 ?
'개발 > 알고리즘' 카테고리의 다른 글
프로그래머스 오픈채팅방 C++ (0) | 2021.03.06 |
---|---|
백준 7795번 먹을 것인가 먹힐 것인가 (0) | 2021.03.05 |
프로그래머스 가사 검색 C++ (0) | 2021.03.03 |
백준 1561번 놀이공원 C++ (0) | 2021.02.28 |
백준 1647번 도시 분할 계획 C++ (0) | 2021.02.26 |