자료구조&알고리즘/백준

[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번: 시그마 (acmicpc.net)

 

2355번: 시그마

첫째 줄에 두 정수 A, B가 주어진다. (-2,147,483,648 ≤ A, B ≤ 2,147,483,647)

www.acmicpc.net