본문 바로가기

백준 PS일지/Two Pointer

[백준/Swift] 1484 : 다이어트 문제 풀이

 

 


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