https://www.acmicpc.net/problem/1484
연속되는 두 수의 제곱의 차 중 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");
}
}
'백준' 카테고리의 다른 글
[C언어/C++] 14370번 전화번호 수수께끼 (Large) + 반례 모음 (2) | 2022.05.08 |
---|---|
[C언어] 백준 | 17404번 RGB거리 2 (0) | 2022.04.29 |
[C언어] 백준 | 1644번 소수의 연속합 (0) | 2022.04.16 |
[C언어] 백준 | 14002번 가장 긴 증가하는 부분 수열 4 (0) | 2022.04.13 |
[C언어] 백준 | 2225번 합분해 (0) | 2022.04.08 |