말랑한 하루
[BAEKJOON] 1789 수들의 합 (C++) 본문
반응형
[ 문제 ]
더보기
문제
서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?
입력
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
[ 조건 및 풀이 ]
이분탐색으로 간단하게 하는방법과, 처음수부터 더해가는 방법이있다.
(1) 이분탐색의 경우
Sigma N = N x (N+1) / 2 공식이 필요하다.
(2) 처음수부터 더해가는 경우
최대값이 나와야하므로 1부터 더해간다 했을때,
더해가는 값이 입력값보다 커지는경우 최대갯수라 할 수 있다.
더해가던값이 15인데 입력값이 17이라면,
1+2+3+4+5 -> 1+2+3+4+(5->7) 로 변하게되어 최대갯수라 판단할 수 있기 때문.
[ 핵심소스코드 / C++ ]
ll value = sqrt(input * 2);
ll result = value * (value + 1)/2;
[ 전체소스코드 / C++ ]
// 이분탐색
#include <iostream>
#include <cmath>
#pragma warning(disable:4996)
using namespace std;
#define ll long long
void solve(ll input) {
ll index = sqrt(input * 2);
while (true) {
ll result = index * (index + 1)/2;
if (result > input) index--;
else {
cout << index;
return;
}
}
}
int main() {
#ifdef _CONSOLE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
ll res;
cin >> res;
solve(res);
}
// 수 더해가기
#include <iostream>
#include <cmath>
#pragma warning(disable:4996)
using namespace std;
#define ll long long
void solve(ll input) {
ll idx = 0;
ll result = 0;
while(true) {
result += ++idx;
if (result >= input) {
if (result > input)
idx--;
cout << idx;
return;
}
}
}
int main() {
#ifdef _CONSOLE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
ll res;
cin >> res;
solve(res);
}
반응형
'문제풀이 > BAEKJOON Online Judge' 카테고리의 다른 글
[BAEKJOON] 1561 놀이 공원 (C++) (0) | 2020.12.25 |
---|---|
[BAEKJOON] 11404 플로이드 (C++) (0) | 2020.12.18 |
[BAEKJOON] 1477 휴계소 세우기 (C++, Java) (0) | 2020.12.16 |
[BAEKJOON] 16401 과자 나눠주기 (C++) (0) | 2020.12.16 |
[BAEKJOON] 1302 베스트 셀러 (C++) (0) | 2020.12.14 |
Comments