알고리즘/codewars

codewars: Playing with digits

꾸준함. 2018. 1. 28. 13:00

문제 링크입니다: http://www.codewars.com/kata/playing-with-digits

알고리즘 강의를 찾다가 알고리즘 문제가 모아져있는 www.codewars.com를 알게 되었습니다.

현재로써는 알고스팟에 집중하고 있지만 간간히 codewars도 방문해서 문제를 풀 생각입니다.


/*

재밌는 특성을 갖는 숫자들이 있다.

예를 들자면,

89 --> 8¹ + 9² = 89 * 1

695 --> 6² + 9³ + 5= 1390 = 695 * 2

46288 --> 4³ + 6+ 2 + 8 + 8 = 2360688 = 46288 * 51

 

양의 정수 n(abcd...과 같은 형태 ex)1234) p가 주어졌을 때

(a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k

를 만족하는 경우 k를 반환하고 만족하지 않으면 -1을 반환하시오

*/

#include <iostream>

using namespace std;

 

//솔직히 이 클래스가 왜 있는지 모르겠다.

//아마 정답확인을 할 때 통일안이 필요해서인 것 같다.

class DigPow

{

public:

        static int digPow(int n, int p);

};

 

int pow(int num, int p) //제곱수를 반환하는 함수

{

        int multiply = num;

        for (int i = 1; i<p; i++)

               num *= multiply;

        return num;

}

 

int DigPow::digPow(int n, int p)

{

        int temp = n; //기존의 숫자 저장

        int cnt = 0, sum = 0; //자릿수와 합

        while (temp>0) //자릿수를 구하는 while

        {

               temp /= 10;

               cnt++;

        }

        int div = 1;

        for (int i = 1; i < cnt; i++)

               div *= 10; //자릿수만큼 10을 곱한다

        temp = n; //다시 기존의 숫자 저장

        for (int i = 0; i<cnt; i++)

        {

               int num = temp / div; //맨 앞자리수부터

               sum += pow(num, p); //p제곱수만큼 합에 더한다

               p++;

               temp -= num*div; //더한 자릿수는 없애준다

               div /= 10;

        }

        for (int k = 1; (n*k)<=sum; k++) //n*k가 합보다 작을 때까지 k를 증가시키고

               if (sum == (n*k)) //만족하면

                       return k; //k 반환

        return -1; //만족 안할시 -1 반환

}

 

int main(void)

{

        cout << DigPow::digPow(89, 1) << endl;

        cout << DigPow::digPow(92, 1) << endl;

        cout << DigPow::digPow(46288, 3) << endl;

        cout << DigPow::digPow(114, 3) << endl;

        return 0;

}

개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형