코딩공부

Palindromic 수 찾기 본문

Language/C언어

Palindromic 수 찾기

초보코더 2017. 10. 1. 01:25
반응형

오늘은 과제를 하다가 알게된 Palindromic 수에 대해서 알아보자!


1. Palindromic 수는 무엇인가?

자 우선 Palindromic 수가 무엇인지 알아보자. Palindromic 수란 앞으로읽어도 뒤로읽어도 같은 수를 의미한다. 예를들면 세자리에서 121, 191, 252, 네자리에선 1111, 1001 같은 수이다!


2. Palindromic 수 구하기

이제 Palindromic 수가 무엇인지 알았으니 구해보자. 나에게 주어진 문제는 세자리수의 곱 중 가장 큰 Palindromic수를 구하는 것이었다. 내가 짠 소스코드를 먼저 보여주겠다!


#include <stdio.h>

#include <Math.h>


void init(int *p);


int main()

{

int pal, n;

int a[10] = { 0 };

int count = 0;

int max = 0;


for (int i = 999; i > 99; i--)

{

for (int j = i; j > 99; j--)

{

init(a);

count = 0;


pal = i * j;


for (int k = 10; k >= 0; k--)

if ((pal / (int)pow(10, k) != 0))

{

n = k;

break;

}


if ((pal / (int)pow(10, n)) == (pal % 10))

{

for (int k = 0; k <= n; k++)

a[n - k] = pal % (int)pow(10, k + 1) / (int)pow(10, k);


for (int k = 0; k <= n; k++)

{

if (a[k] == a[n - k])

count++;

else

break;

}


if (count == n + 1)

{

if (max < pal)

max = pal;

break;

}

}

}

}


printf("3자리수의곱으로만들어질수있는최대의palindromic 수는 %d 입니다.\n", max);


return 0;

}


void init(int *p)

{

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

{

p[i] = 0;

}

}

...저렇다. 음... 원래는 밑줄쳐놓은 부분이 j = 999로 써놨었는데 생각해보니 j = 999로 쓰면 i와 j가 순서만 바뀐 같은 수의 조합이 나올 수 있다는걸 알았다. 그래서 코드를 조금 바꿔 보았다. 사실 내가 짠 코드지만 정말 별루다... 뭐랄까... 더 효율적으로 할 수 있을 것 같은데...하는 생각이 많이 든다. 근데 어떻게 해야할지 몰라서 못함ㅎ... 다른분들의 코드를 보면 Palindromic 수는 11로 나누어진다는 점을 이용해서 어떻게 하던데... 


인터넷 검색을 하다보니 새로운 방법을 찾아서 다시 작성을 해보았다!

그게 바로

#include <stdio.h>

#include <Math.h>


#define TRUE 1;

#define FALSE 0;


typedef int bool;


bool palin(int num);


int main()

{

int a[10] = { 0 };

int count = 0;

int max = 0;


for (int i = 999; i>99; i--)

for (int j = i; j>99; j--)

if ((i*j>max) && (palin(i*j)))

{

max = i*j;

}


printf("3자리수의 곱으로 만들 수 있는 최대 palindromic 수는 %d 입니다.", max);

return 0;

}


bool palin(int num)

{

int i = 0;

int a[10] = { 0 };

while (num)

{

a[i] = num % 10;

num = num / 10;

i++;

}


for (int j = 0; j < i / 2; j++)

{

if (a[j] != a[i - j - 1])

return FALSE;

}


return TRUE;

}

이것이다. 길이도 훨씬 줄어들고, 밑줄을 친 부분에서 i*j>max가 성립할때를 조건으로 palin함수보다 먼저 넣어주어서 palin함수의 실행 횟수를 최소화 시켜 보았다.

그러다보니 이번에는 새로운 생각이 났다. 


배열안에 값을 넣어주었으니까 그걸 string형으로 인식해서 수를 거꾸로 만든다음 비교하면 어떨까? 그게 더 간결하고 보기 좋지않을까?


...이부분은... 문자열에 대한 이해도가 아직 부족해서인지 아직 좀 힘들다...ㅎ...ㅎㅎㅎ.... 공부를 좀 더 한 뒤에 꼭 고치러 오겠다!!!


어제 오늘 합해서 이 문제에만 5시간정도는 쓴 것 같은데 하면서 정말 많은걸 배웠다. 우선 값의 비교같은걸 여러번 해줘야 할때는 지금처럼 배열로 만들어서 비교하는게 효율적인 것 같다. 그리고 외부 함수를 만들어서 boolean변수로 true또는 false를 return 해 줌으로써 여러번의 연산이 끝나고 두개의 값이 같은지 다른지 반환해주는 것도 중요하다고 생각한다. 생각해 보면 sort같은걸 할때도 다 boolean자료형을 만들어서 해당 자료형을 쓴 함수를 이용해서 비교햇던거 같으니까... 음...어쨌든 오늘은 여기까지!


반응형

'Language > C언어' 카테고리의 다른 글

문자열에 관한 고찰(1)  (0) 2017.10.08
2차원 배열과 포인터에 대해 Araboza  (0) 2017.09.26
Scanf와 &  (2) 2017.09.07
Visual Studio의 scanf와 scanf_s  (0) 2017.09.05