[골드 5] 백준 1484 - 다이어트 (파이썬)
글 작성자: pental
https://www.acmicpc.net/problem/1484
풀이
현재 몸무게의 제곱에서과거 몸무게의 제곱을 뺀 값이 G일때 가능한 현재 몸무게를 오름차순으로 출력한다.
결국 b^2 - a^2를 인수분해하면 (b-a)(b + a) = G 이다.
현재 틀린 코드는 다음과 같은 알고리즘을 사용한다.
# 백준 1484 - 다이어트
# 분류 : 수학
G = int(input())
answer = []
for i in range(1, G + 1) :
if G % i != 0 :
continue
j = G / i
# b - a = i
# b + a = j
if j <= i :
continue
# a = (j - i) / 2, b = (j + 1) / 2
if (j - i) % 2 == 0 and (j + i) % 2 == 0 :
a = (j - i) // 2
b = (j + i) // 2
answer.append(b)
if len(answer) == 0 :
print(-1)
else :
answer.sort()
for i in range(len(answer)) :
print(answer[i])
- G 5 i ≠ 0 조건으로 G의 약수를 구한다.
- J = G i 를 통해 실수형 나눗셈을 진행한다.
- 자연수 b가 a보다 큰 경우의 모든 쌍을 찾는다.
하지만 이 코드는 틀림~
G = int(input())
a = 1
b = 2
answers = []
while b <= 100000:
diff = b * b - a * a
a = 1, b = 2 부터 시작하며, b^2 - a^2를 구해서 G와 비교한다.
if diff == G:
answers.append(b)
b += 1
elif diff < G:
b += 1
현재 몸무게 b가 정답 조건을 만족하면 리스트에 추가한다.
다른 경우는 b를 더 키워서 ㅈb^2 - a^2의 값으로 키운다.
if answers:
for ans in answers:
print(ans)
else:
print(-1)
정답이 있으면 오름차순으로 출력하고, 없으면 -1을 출력한다
시간 복잡도 분석
- b는 최대 10^5까지만 돌기 때문에 시간 제한 안에 충분히 처리 할 수 있다,
코드
# 백준 1484 - 다이어트
# 분류 : 수학 / 투 포인터
G = int(input())
a = 1
b = 2
answers = []
while b <= 100000: # 100,000^2 - 1^2 = 충분히 커짐
diff = b * b - a * a
if diff == G:
answers.append(b)
b += 1
elif diff < G:
b += 1
else:
a += 1
if answers:
for ans in answers:
print(ans)
else:
print(-1)
'Programming > 백준' 카테고리의 다른 글
[실버 5] 백준 7785 - 회사에 있는 사람 (파이썬) (0) | 2025.04.14 |
---|---|
[실버 1] 백준 1926 - 그림 (파이썬) (0) | 2025.04.14 |
[실버 2] 백준 1699 - 제곱수의 합 (파이썬) (0) | 2025.04.13 |
[브론즈 2] 백준 1100 - 하얀 칸 (파이썬) (0) | 2025.04.12 |
[골드 4] 백준 9935 - 문자열 폭발 (파이썬) (0) | 2025.04.11 |
댓글
이 글 공유하기
다른 글
-
[실버 5] 백준 7785 - 회사에 있는 사람 (파이썬)
[실버 5] 백준 7785 - 회사에 있는 사람 (파이썬)
2025.04.14 -
[실버 1] 백준 1926 - 그림 (파이썬)
[실버 1] 백준 1926 - 그림 (파이썬)
2025.04.14 -
[실버 2] 백준 1699 - 제곱수의 합 (파이썬)
[실버 2] 백준 1699 - 제곱수의 합 (파이썬)
2025.04.13 -
[브론즈 2] 백준 1100 - 하얀 칸 (파이썬)
[브론즈 2] 백준 1100 - 하얀 칸 (파이썬)
2025.04.12