2015. 1. 25. 19:46ㆍ프로그래밍/알고리즘
몇 주전에 풀다가 답이 틀려 잠깐 멈췄던 부분이 있었는데..
1시간 가량 찾지 못했던 해답을 오늘 3분만에 풀었다.
알고리즘 문제를 하루에 하나 풀어보자고 하는데.. 역시 뭐 생각만큼 쉽지는 않다.
Problem4. A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
직접 푼 알고리즘)
C++환경에서 for문 2개를 써서 풀었다.
999*999부터 100*100까지 비교했다.
여기서 palindrome인지 확인하는 부분이 핵심.
필자는 각 자리의 수를 구하여 최대 6칸의 배열(nArray[6])을 만들었다.
(각 자리의 수를 구하는데 쓸데 없이 코드가 길어졌다...)
최대 자리가 0일때는 5자리 수기 때문에
가운데 자리를 제외한 일의 자리와 만의 자리, 십의자리와 천의자리를 비교.
최대 자리가 0이 아니라면 일의 자리 - 십만의 자리, 십의 자리와 만의 자리, 백의 자리와 천의 자리를 비교한다.
수도 코드는 대충
for(100~999)
for(100~999)
Num1*Num2
if(N[0] == 0)
compare N[1] N[5]
compare N[2] N[4]
else
compare N[0] N[5]
compare N[1] N[4]
compare N[2] N[3]
if(max?)
}
}
뭐 대부분 함수로 빼서 구현하긴 했지만 대충 수도는 이렇게 되는거같다.
다른 사람의 풀이)
특히 비교하는 부분에서 코드가 매우 길어져서 다른 방법을 찾아봤다.
char a[7], char b[7]을 선언한다.
a - 두 수의 곱을 저장할 배열
b - 두 수의 곱을 역순으로 저장한 배열
sprintf(a, "%d", z); strcpy(b, a); _strrev(b);
strrev 문자열을 역순으로 저장하여
strcmp(a, b) == 0
비교 함수를 통해 마무리.. 참 이렇게 몇 줄로 되는걸...
루비를 안 배워서 잘 모르겠지만 루비는 거의 6줄이면 이게 되던데...
알만툴에서 루비 사용한다던데 조금 궁금하긴 하다. 어떤 언어인지.
일단 지금은 유니티가 먼저니 C# 공부나 빡세게!!
여튼 이는 나와 같은 방법으로 구현한 알고리즘 중 결과를 도출해냈던 다른 방법이고,
전제에서 미리 예외를 찾아내 성능을 올리는 방법도 있었다.
만약 palindrome 수가 abccba라고 가정했을 때,
abccba = 100000a + 10000b + 1000c + 100c + 10b + a = 100001a + 10010b + 1100c.
이 값은 11로 묶을 수 있으며 11(9091a + 910b +100c)가 된다.
두 수 중 하나는 무조건 11의 배수임을 활용하면 성능을 훨씬 빠르게 할 수 있다.
아마 이 문제의 핵심이 아니었나한다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
Project Euler Problem16 (0) | 2015.02.24 |
---|---|
Project Euler Problem15 (0) | 2015.02.17 |
Project Euler Problem10 (0) | 2015.02.15 |
Project Euler Problem9 (0) | 2015.02.15 |
Project Euler Problem5 (0) | 2015.02.12 |
Project Euler Problem7 (0) | 2015.02.05 |
Project Euler Problem6 (0) | 2015.02.05 |