문제 (https://www.acmicpc.net/problem/1484)
1484번: 다이어트
성원이는 다이어트를 시도중이다. 성원이는 정말 정말 무겁기 때문에, 저울이 부셔졌다. 성원이의 힘겨운 다이어트 시도를 보고만 있던 엔토피아는 성원이에게 새로운 저울을 선물해 주었다.
www.acmicpc.net
(현재 몸무게)^2 - (예전 몸무게)^2 = 찐 몸무게
1부터 g까지의 모든 수를 배열에 담아두고 투 포인터를 실행했다. end는 현재 몸무게를 가리키는 포인터이고 start는 예전 몸무게를 가리키는 포인터로 설정했다.
위 식대로 찐 몸무게를 구한 후 구한 값이 g와 같다면 정답을 담아두는 배열에 삽입한다.
g보다 작다면? 찐 몸무게를 더 늘려야 하므로 end(현재 몸무게)를 증가
g보다 크거나 같다면? 찐 몸무게를 줄여야 하므로 start(예전 몸무게) 증가
[소스코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
BOJ 1484번: 다이어트 | |
2021-12-28 | |
Two pointers | |
*/ | |
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
int main() { | |
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); | |
int g; | |
cin >> g; | |
int arr[g]; | |
int start = 0, end = 0; | |
vector<int> ans; | |
for(int i = 0 ; i < g ; i++) arr[i] = i + 1; | |
while(end < g) { | |
int weight = arr[end] * arr[end] - arr[start] * arr[start]; | |
if(weight == g) ans.push_back(arr[end]); | |
if(weight < g) end++; | |
else start++; | |
} | |
if(ans.empty()) cout << -1; | |
else { | |
sort(ans.begin(), ans.end()); | |
for(int i = 0 ; i < ans.size() ; i++) cout << ans[i] << '\n'; | |
} | |
return 0; | |
} |

'ALGORITHM > BOJ' 카테고리의 다른 글
[BOJ] 4386번 별자리 만들기 (C++) (0) | 2022.01.04 |
---|---|
[BOJ] 11779번 최소비용 구하기 2 (C++) (0) | 2022.01.04 |
[BOJ] 1644번 소수의 연속합 (C++) (0) | 2022.01.03 |
[BOJ] 2470번 두 용액 (C++) (0) | 2022.01.03 |
[BOJ] 3107번 IPv6 (C++) (0) | 2022.01.03 |