알고리즘/알고리즘(Java)

06. 앞에서 읽을 때나, 뒤에서 읽을 때 모양이 같은수(대칭수) 찾기

산을좋아한라쯔 2015. 3. 30. 21:04
반응형

## 문제 ##

앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?
(출처: https://projecteuler.net )

 

## 풀이 ##

 

## 소스코드 ##

package p1;

 

public class PalindromeNumber {

         public PalindromeNumber(){

                  test();

         }

        

         private void test(){

                  long p=0,q=0,n=0;

                  long r_p=0,r_q=0,r_n=0;           

                  for(p=999;p>=100;p--){

                           for(q=999;q>=100;q--){

                                   n = p * q;

                                   if(isPalindrome(n)){

                                            if(n>r_n){

                                                     r_n=n;   r_p=p;   r_q=q;

                                            }       

                                           

                                            if(n>=90000 && n<=99999){

                                                     System.out.println("n:"+n+" p:"+p+"  q:"+ q);

                                            }

                                   }

                           }

                  }                

                  System.out.println("n:"+r_n+" p:"+r_p+"  q:"+ r_q);

         }

        

         private boolean isPalindrome(long a){

                  if(a < 0) return false;

                  if(a == 0) return false;

                 

                  int n = (int)Math.log10(a); //자릿수. ex)a=1001 -> n=3                

                  if(n==0) return true; //1자리숫자

                                    

                  //변환 to 각자리를 나타내는 10진수 배열

                  int[] arr = new int[n+1];

                  long d,t;

                  for(int i=n;i>=0;i--){

                           d = (long)Math.pow(10, n-i);                        

                           arr[i] =(int)((int)(a/d)%10); //각자리의 10진수

                  }

                                  

                  //배열의 절반을 나눠서 같은지 비교

                  int half = (n+1)/2; //4->2 5->2 6->3

                  for(int i=0;i<half;i++){

                           if(arr[i] != arr[n-i]){

                                   return false;

                           }

                  }

                  return true;

         }

 

         public static void main(String[] args) {

                  new PalindromeNumber();

 

         }

 

}

 

-끝-

반응형