일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- two-layer neural net
- 풀업저항
- leetcode
- cs231n
- 풀다운저항
- assignment1
- Big size image
- #9
- softmax backpropagation
- Backpropagation
- atmega128
- assignment
- autoencoder
- impl
- Features
- backward pass
- Solution
- KNN
- pulldown
- Floating
- TensorFlow
- 회로
- NotFoundError
- neural net
- pullup
- palindrome
- error
- Softmax
- pyTorch
- Circuit
- Today
- Total
코딩공부
Palindromic 수 찾기 본문
오늘은 과제를 하다가 알게된 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 |