https://www.acmicpc.net/problem/1484

 

1484번: 다이어트

성원이는 다이어트를 시도중이다. 성원이는 정말 정말 무겁기 때문에, 저울이 부셔졌다. 성원이의 힘겨운 다이어트 시도를 보고만 있던 엔토피아는 성원이에게 새로운 저울을 선물해 주었다.

www.acmicpc.net

연속되는 두 수의 제곱의 차 중 10만에 제일 가까우면서 10만보다는 작은 것이 50000 ^ 2 - 49999 ^ 2가 99999였습니다.
그래서 5만까지 배열에 넣어줬습니다.

투포인터를 사용해서 현재 몸무게 - 기억하고 있는 몸무게를 전부 확인해서 출력해줬구요, 가장 중요한 것은 ll에 주의하라고 적어놓은 두 부분입니다. 배열은 미리 알고 long long으로 해뒀는데, 밑에 'll에 주의하세요 2번'을 보시면 arr[i] = i * i에서 i가 long long이 아니고 int일 시에 정수 오버플로우가 나더라고요. 지금 생각해보니까 당연한 것 같긴 한데, 문제 풀 땐 아무 생각이 없었습니다.
저 반복문에서 i를 int로 해두면 정수오버플로우가 나서 99999의 경우에 필요한 arr[50000]에 값을 제대로 넣어주지 못합니다.

나머지는 코드만 보셔도 다 이해할 수 있을 겁니다.

감사합니다.

#include <stdio.h>
#include <math.h>

unsigned long long arr[50001]; // ll에 주의하세요 !!!!!!!
int main() {
    int n, a = 1, b = 2, temp = 0; //temp는 가능한 몸무게가 있는지 확인하기 위함
    for(long long i = 1; i <= 50000; i++) { // ll에 주의하세요 2 !!!!!!!
        arr[i] = i * i;
    }
    scanf("%d", &n);
    for(int i = 1; i <= 100100; i++) { //100100은 의미없습니다.
        if (b > 50000) break;
        if (a == b) b++;
        if(arr[b] - arr[a] == n) {
            printf("%.f\n", sqrt(arr[b]));//배열의 값은 제곱한 상태이니 sqrt로 루트를 씌워줍니다.
            temp = 1; //한 번이라도 이 if문을 돌게되면 temp는 1
        }
        if(arr[b] - arr[a] >= n) {
            a++;
        }
        if(arr[b] - arr[a] < n) {//몸무게의 차가 n보다 작으면
            b++;//당연히 더 큰 현재의 몸무게에서 빼줘야겠죠?
        }
    }
    if(temp == 0) { // 가능한 몸무게가 없다면
        printf("-1");
    }
}

+ Recent posts