자료구조&알고리즘/백준
[C++] 백준 2355번 - 시그마
celinayk
2023. 1. 6. 16:32
반응형
문제
두 정수 A와 B가 주어졌을 때, 두 정수 사이에 있는 수의 합을 구하는 프로그램을 작성하시오. 사이에 있는 수들은 A와 B도 포함한다.
입력
첫째 줄에 두 정수 A, B가 주어진다. (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)
출력
첫째 줄에 답을 출력한다. (-2,147,483,648 ≤ 답 ≤ 2,147,483,647)
접근
처음보자마자 for문을 이용해서 구했는데 시간초과가 나면서 틀렸다
//첫번째 시도
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main() {
int a, b;
int sum = 0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
sum += i;
}
printf("%d", sum);
return 0;
}
//두번째 시도
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main() {
int a, b;
int sum = 0;
scanf("%d %d", &a, &b);
printf("%d", (b-a+1)*(b+a)/2);
return 0;
}
시간 초과가 난 이유가 for문을 돈다고 시간초과가 난것이라서 for문을 쓰지 않고 시그마공식을 이용했다. 물론 공식은 까먹었기 때문에 구글링했다.
그런데 제대로 한것 같은데도 오답이었다. 틀린 이유는 모름.. 그냥 틀렸단다...ㅋ
//세번째 시도
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
long long a, b;
scanf("%lld %lld", &a, &b);
a = min(a, b);
printf("%lld", (b-a+1)*(b+a)/2);
return 0;
}
우선 내가 int자료형을 사용, a가 b보다 작다는 보장없음
이게 틀린이유인것 같다.
너무 당연하게 int라고 생각했다.
그래서 다시 코드를 작성했는데도 오답이었다...
뭔가 이상해서 printf("%d %d", a,b)를 해보았는데
5 8 이 아닌 5 05가 출력되었다. min함수로 a는 제대로 구했는데 b가 이상하게 되었다,
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
long long a, b;
scanf("%lld %lld", &a, &b);
if (a > b) {
swap(a, b);
}
printf("%lld", (b-a+1)*(b+a)/2);
return 0;
}
리뷰
swap함수를 이용해서 자리를 바꿔줬다!! 그랬더니 바로 해결되었다
학습
근데 내가 처음에 int형을 썼었고 int는 문제에서 주어진 조건인 -2147483648범위내에 해당인데 왜 int가 안되는지 잘 모르겠다...흠...
출처
2355번: 시그마
첫째 줄에 두 정수 A, B가 주어진다. (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)
www.acmicpc.net