🧩 문제 : 1484번 다이어트
👩🏻💻 문제 정리
💪🏻 문제 풀이
투포인터 이용하기
while True:
diff = left**2 - right**2 # left : 현재 몸무게, right = 기억하고 있는 몸무게
if left - right == 1 and diff > g: break
if diff > g:
right+=1
elif diff < g:
left+=1
else: # diff == g
answer.append(left)
left+=1
g : 입력값
left : 현재 몸무게
right : 성원이가 기억하고 있는 몸무게
answer : 출력값 (left^2 - right^2 == g를 만족하는 left)
💡문제 풀이 포인트
1. 몸무게는 음수가 아님 : left > right
2. g는 음수가 아님
3. while문 종료 조건 : 가장 인접한 제곱수 끼리의 차(ex. 4^2 - 3^2)가 g보다 크면 더 이상 답을 구할 수 없다
-> left와 right의 차가 1이고, 두 수의 제곱의 차가 g보다 크다면 더이상 g를 구할 수 없다.
💭 전체 코드
📕 깨알 파이썬 문법 : python 출력 옵션 설정하기
- 결과를 리스트에 저장해서 출력
import sys
g = int(sys.stdin.readline().rstrip())
left, right = 1, 1 # left : 현재 몸무게, right = 기억하고 있는 몸무게
answer = []
while True:
diff = left**2 - right**2
if left - right == 1 and diff > g: break
if diff > g:
right+=1
elif diff < g:
left+=1
else: # diff == g
answer.append(left)
left+=1
if answer:
print(*answer , sep='\n')
else:
print(-1)
- 결과값을 찾으면 바로 출력
import sys
g = int(sys.stdin.readline().rstrip())
left, right = 1, 1 # left : 현재 몸무게, right = 기억하고 있는 몸무게
have_answer = False
while True:
diff = left**2 - right**2
if left - right == 1 and diff > g: break
if diff > g:
right+=1
elif diff < g:
left+=1
else: # diff == g
print(left)
left+=1
have_answer = True
if not have_answer:
print(-1)
결과를 리스트에 저장해서 출력하는 것이 속도가 더 빠르다 !
'알고리즘' 카테고리의 다른 글
[BOJ / Python] 1107 리모컨 (0) | 2023.02.04 |
---|---|
[BOJ / Python] 앵무새 (1) | 2023.02.01 |
[BOJ / Python] 1325 효율적인 해킹 (1) | 2023.01.24 |
[BOJ / Python] 2156 포도주 시식 (0) | 2023.01.20 |
다이나믹 프로그래밍 (0) | 2023.01.20 |