일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 생활코딩
- 다이나믹 프로그래밍
- ICPC
- 백준 1753번
- 삼성 SW 역량테스트
- 데이터 분석
- dp
- 고속 푸리에 변환
- LCS
- 시뮬레이션
- Cloud Pub/Sub
- 삼성SW역량테스트
- 종만북
- BFS
- 접미사 배열
- 이분탐색
- 그리디
- Cloud Run
- 컴퓨터 구조
- 우선순위 큐
- JavaScript
- jpa
- 다익스트라
- r
- 펜윅 트리
- Bit
- CI/CD
- Air Table
- REACT
- 수학
- Today
- Total
코딩스토리
백준 1484번 - 다이어트 본문
이분 탐색으로 쉽게 해결할 수 있었던 문제이다.
문제 태그에는 수학, 투 포인터가 적혀 있는데 나는 문제를 보고 이분 탐색으로 충분히 풀릴 것 같아서 제출해봤는데..
틀렸습니다..
잉? 하고 문제를 다시 보니 가능한 몸무게가 없을 때 -1을 출력하는 것을 까먹어버렸다ㅎㅎ
저 조건을 다시 붙여서 바로 제출하니 맞았습니다를 받을 수 있었다.
풀이 과정
일단 G의 값이 100000 보다 작은 자연수라는 조건이 가장 큰 힌트였다.
G = (현재 몸무게)^2 - (기억하고 있던 몸무게)^2이다.
이때 G가 자연수라는 조건이 있기 때문에 반드시 현재 몸무게가 기억하고 있던 몸무게보다 커야 한다는 것을 쉽게 찾아낼 수 있다.
그렇다면 위의 조건을 통해 또 얻어낼 수 있는 것은 현재 몸무게의 최댓값이다.
현재 몸무게를 x라고 해보자.
그럼 위에서 구한 조건들에 따라 어떠한 경우에도 x^2 - (x-1)^2이 10만보다 작아야 한다.
(x-1을 기억하고 있던 몸무게로 정한 이유는 몸무게의 최댓값을 얻기 위함이다.
계산된 G의 최솟값이 10만이 넘지 않는 그러한 G들 중 최댓값을 구하는 과정인 것이다.)
식을 풀어써보면
음.. 중학생도 풀 수 있는 식이니까 생략하고 x가 약 50000보다 작거나 같아야 한다는 것을 알 수 있다.
그럼 실제로 그런지 확인해보자.
sqrt(50000) - sqrt(49999) = 99999이고
sqrt(50001) - sqrt(50000) = 100001이다.
정확히 5만까지만 x를 구해도 모든 경우를 확인해 볼 수 있었다.
따라서 x를 1~5만까지 각각 이분 탐색을 돌린다고 생각해 봤을 때
시간 복잡도 = O(5만 log(5만))이기 때문에.. 충분!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int g;
cin >> g;
vector<int>ans;
for (int i = 1; i <= 50000; i++) {
int left = 1, right = i;
while (left <= right) {
int mid = (left + right) / 2;
int temp = (i * i) - (mid * mid);
if (temp == g) {
ans.push_back(i);
break;
}
else if (temp > g) left = mid + 1;
else right = mid - 1;
}
}
if (ans.size() == 0) cout << "-1" << "\n";
else {
for (int i = 0; i < ans.size(); i++) {
cout << ans[i] << "\n";
}
}
}
|
cs |
'알고리즘 > BOJ 문제 풀이' 카테고리의 다른 글
백준 2749번 - 피보나치 수 3 (2) | 2021.05.21 |
---|---|
백준 10830번 - 행렬 제곱 (2) | 2021.05.19 |
백준 2602번 - 돌다리 건너기 (0) | 2021.04.24 |
백준 16120번 - PPAP (3) | 2021.04.14 |
백준 1339번 - 단어 수학 (0) | 2021.04.02 |