1484 : 다이어트 / 문제 소개
(요즘 집에 앉아서 공부만하니 살이 3키로 쪘당..)
성원이는 다이어트 중이다.
저울에 올라갔다.
안돼! G킬로그램이나 더 쪘어!!...
여기서 말하는 G킬로그램은 성원이의 현재 몸무게 제곱에서 성원이가 기억하고 있던 몸무게의 제곱을 뺀 것.
성원이의 현재 몸무게로 가능한 것을 모두 출력하는 프로그램을 작성하시오.
그리고 G는 자연수이다.
풀이 과정
처음에 문제를 이해하기 어려웠다.. 성원이의 몸무게는 h. 성원이가 찐 몸무게는 h + a ...?
h^2 - (h+a)^2 = 15
어떻게 풀 수 있을까 고민하던중.. 예제 출력을 봤다.
4
8
아하.
16 - 1 = 15
64 - 49 = 15
a^2 - b^2 = 15로 문제를 새롭게 접근 방법을 세웠다. 좀 더 알기 쉽게
성원이의 현재 몸무게(예전에 생각했던 몸무게에서 몇키로 찐 몸무게) = cur 변수(current)로 정하고
성원이가 생각했던 몸무게(예전 몸무게) = think 변수
투포인터 문제임을 알아차렸다.
그렇다면 이제 각각 몸무게를 지정 해줘야 하는데 문제에서 G는 자연수라고했으니 cur^2 - think^2 는 0이 나올 수 없다. 그렇다는 것은 cur몸무게와 think몸무게가 같을 수 없다는 것이다. 이를 종료 조건으로 삼았다.
성원이는 예전에 몸무게를 측정했으니까 현재 몸무게는 살이 찔 수밖에 없기 때문에,,
그리고 과거, 현재 몸무게는 같을 수 없기에 초기 값을
cur = 2 , think = 1로 부여했다.
cur^2 - think^2 < G이면 현재 몸무게가 부족한 것이므로 현재 몸무게 증가!!!
만약 G를 넘어섰다면 think를 증가시키며 cur != think일때 cur^2 - think^2 == G인 경우를 답으로 계산했다.
코드 구현
import Foundation
/*
G = 성원이가 놀랜 몸무게 차이
cur = 현재 성원이가 측정한 몸무게
think = 이전에 성원이가 기억 했었던 몸무게
*/
func BOJ_1484()
{
let G = Int(readLine()!)!
var cur = 2, think = 1
var ans = ""
while think < cur
{
let diff = cur*cur - think*think
if diff < G
{
cur += 1
}
else
{
think += 1
if diff == G
{
if ans == ""
{
ans += "\(cur)"
}
else
{
ans += "\n\(cur)"
}
}
}
}
print(ans.isEmpty == true ? "-1" : ans)
}
BOJ_1484()
visit my github
'백준 PS일지 > Two Pointer' 카테고리의 다른 글
[백준/Swift] 2230 : 수 고르기 문제 뿌수기!! (0) | 2022.08.10 |
---|---|
[백준/Swift] 1253 : 좋다 문제 풀이와 2개의 반례 (0) | 2022.08.09 |
[백준/Swift] 3273 : 두 수의 합 (0) | 2022.08.09 |
[백준/Swift] 1806 : 부분합 문제 뿌수기!! + 2개 반례 (0) | 2022.08.09 |