관리 메뉴

기억을 위한 기록들

[Code Wars] Buying a car(C++) 본문

Coding Test - cpp/Etc

[Code Wars] Buying a car(C++)

에드윈H 2023. 12. 8. 12:43

https://www.codewars.com/kata/554a44516729e4d80b000012/train/cpp

 

Codewars - Achieve mastery through coding practice and developer mentorship

A coding practice website for all programming levels – Join a community of over 3 million developers and improve your coding skills in over 55 programming languages!

www.codewars.com

 

 

 

Let us begin with an example:
A man has a rather old car being worth $2000. He saw a secondhand car being worth $8000. He wants to keep his old car until he can buy the secondhand one.

어떤 한 남자는 2천 달러의 가치가 있는 다소 오래된 차를 가지고 있다. 그는 8천 달러의 가치가 있는 새로운 중고차를 봤다. 그는 중고차를 살 수 있을 때까지 그의 오래된 차를 유지하고 싶어합니다.


He thinks he can save $1000 each month but the prices of his old car and of the new one decrease of 1.5 percent per month. Furthermore this percent of loss increases of 0.5 percent at the end of every two months. Our man finds it difficult to make all these calculations.

그는 매달 1,000달러를 저축 할 수 있다고 생각하지만, 자신의 오래된 차와 새 차의 가격은 매달 1.5퍼센트씩 낮아진다. 게다가 이 손해율은 매 두 달 말에 0.5퍼센트씩 증가합니다. 우리 남자는 이 모든 것을 계산하기가 어렵다고 생각합니다.


Can you help him?
How many months will it take him to save up enough money to buy the car he wants, and how much money will he have left over?

그를 도와주실 수 있으신가요?
그가 원하는 차를 살 수 있을 만큼 충분한 돈을 모으는데 몇 달이 걸릴까요, 그리고 남은 돈은 얼마나 될까요?

 

문제는 새로운 차를 살 수 있을 만큼 돈을 모으는데에 몇달이 걸리는지, 그리고 사고 남은 돈은 얼마인지를 알려달라고 하고 있다. 그리고  예를 하나보여 주고 있다.

 

 

여기서 6은 그가 새 차를 살 수 있는 마지막 달 수이고 766은 766.158...에 가장 가까운 정수입니다(rounding 766.158은 766을 제공합니다).

 

정리하자면 새 차를 사기 위해 갖고 있던 중고차를 팔고 저축을 하면서 몇달이 걸리는지에 대한 계산이다.

예를 참고해서 보면, 첫달에 새차 8000에서 1.5% 깎이면 = 7880, 갖고 있던 차 2000에서 1.5% 깎이면 = 1970, 그리고 1000을 저축하게 되면서 새 차값인 7880에서 갖고 있던 중고 차값(1970)과 저축한돈(1000)을 빼면 (7880-(1970+1000) = ) 4910 이 된다. 매월 차값들은 감소되고 저축한 돈은 늘어난다 , 0이하가 될때까지 계산을 해야한다.

 

#include<cmath> 

class BuyCar
{

  public:
  static std::vector<int> nbMonths(int startPriceOld, int startPriceNew, int savingperMonth, double percentLossByMonth)
  {    
  	//현재 갖고 있던 중고 차값이 새차값보다 비싸거나 같다면 새차를 바로 살 수 있다.
    if(startPriceOld>= startPriceNew)
    {
          std::vector<int> ResultList;
          ResultList.push_back(0);
          ResultList.push_back(startPriceOld-startPriceNew);
          return ResultList;
    }   


    int ResultMonth = 0;
    double SavedTotalMoney = 0.0;    
    double RemainMoney = 1.0;    
    
    double OldCarPrice = startPriceOld;
    double NewCarPrice = startPriceNew;
    
    double DisPercent = percentLossByMonth;
    
    while(0 < RemainMoney)
    {
      //개월 수 증가
      ResultMonth++;
      
      //짝수달마다 감가비율 0.5퍼센트 증가
      if(ResultMonth%2==0)
      {
          DisPercent += 0.5;
      }
      

      const double NewCarMinusPrice = (NewCarPrice * (DisPercent / 100));  
      const double OldCarMinusPrice = (OldCarPrice * (DisPercent / 100));

      //저축한 돈 추가
      SavedTotalMoney += savingperMonth;      
      
      //차들에 대한 가치 하락
      OldCarPrice -= OldCarMinusPrice;
      NewCarPrice -= NewCarMinusPrice;
      
      RemainMoney = NewCarPrice - OldCarPrice  - SavedTotalMoney;    
    }  
    

    std::vector<int> ResultList;
    ResultList.push_back(ResultMonth);
    ResultList.push_back(std::abs(std::round(RemainMoney)));
    return ResultList;
  };
};