백준 알고리즘 - 1789번 수들의 합 문제입니다.
(참고 - https://www.acmicpc.net/problem/1789 )
코드)
#include <stdio.h>
int main() {
long long int S, i, n=0;
int cnt=0;
scanf("%lld", &S);
for(i=1; ; i++) {
n += i;
cnt++;
if(n > S) {
cnt--;
break;
}
}
printf("%d\n", cnt);
return 0;
}
무슨 차이가 있는지 발견하셨나요?
로직도 그대로, 변수들의 값들 또한 그대로,
차이가 있다면 한가지 있습니다.
바로 전 알고리즘 포스팅에서 밝혔었죠. 문제를 유심히 살펴보시라는 말씀을 드렸었습니다.
바로 문제의 조건입니다.
"첫째 줄에 자연수 S(1≤S≤4,294,967,295)가 주어진다."
그래서 S는 long long int의 값으로 해주었는데?
라고 생각을 하실지 모르겠지만, S뿐만이 아닙니다. 결과값 N을 구해주기 위해 반복문 안에서 루프 조건은
무한루프라는점 입니다. 즉 long long int타입의 S를 만나기 위해서는 i와 n 또한 기본 int형 이상의 값을 필요로 할 수 있으며, 만약 S의 최대값으로 4,294,967,295 라는 값이 입력되었다면 n은 그 이상의 수가 저장됩니다.
if(n>S)이 이 무한 루프를 끝낼 수 있는 조건이기 때문입니다. 즉 연산과정에서 사용되는 i와 n 또한 long long int타입으로 선언되어져야 시간초과에러를 풀어낼 수 있습니다.
이 부분만 해결하면 나머지는 i를 0부터 차근차근히 더해주어 n에 저장시켜주고, n과 S를 비교하는 단순한 로직이기 때문에 설명은 이정도로 마무리 짓도록 하겠습니다.
'Programming > Algorithm' 카테고리의 다른 글
백준 알고리즘 - 2501번 : 약수 구하기 (0) | 2016.04.19 |
---|---|
백준 알고리즘 - 2441번 : 별 찍기 -4 (0) | 2016.04.19 |
백준 알고리즘 - 1731번 : 추론 (0) | 2016.04.19 |
백준 알고리즘 - 1110번 : 더하기 사이클 (0) | 2016.04.19 |
백준 알고리즘 - 1100번 : 하얀 칸 (0) | 2016.04.19 |
WRITTEN BY