앞으로 읽어도, 뒤로 읽어도 같은 수 > 퀴즈게시판

퀴즈게시판

답을 맞히시면, 문제를 내신 회원님이 채택을 해드립니다.
채택은 '좋아요'와 같습니다.

앞으로 읽어도, 뒤로 읽어도 같은 수 정보

앞으로 읽어도, 뒤로 읽어도 같은 수

본문

아래의 문제의 답을 도출하는 과정을 프로그래밍 언어로 구현하시오.(php, javascript... 뭐든 좋습니다)

  

앞으로 읽어도, 뒤로 읽어도 같은 수는

101, 6, 7777 와 같은 경우가 있습니다, 

23, 876, 7727 와 같은 경우는 아닙니다.


문제) 어떤 수 N (N 은 10자리 이하인 자연수) 이 주어질 때, N보다 큰 수 중에서 앞으로 읽어도, 뒤로 읽어도 같은 수중 가장 작은 수를 출력하시오. 

댓글 5개

간단하고 빠르고 좋네요.

큰 숫자가 오면 느릴줄 알앗는데 그렇지는 않네요

12 ~ 3 자리 넘어가야 느려지네요.

잘 배웠습니다.
  • 채택 0
<?php

set_time_limit(0);
//ini_set('memory_limit','1G');
header('Content-Type: text/html; charset=utf-8');



function microtime_float() {

    list($usec, $sec) = explode(" ", microtime());
    return (((float)substr((string)$usec, 0, 4) + (float)$sec)) * 1000;
}



function get_excute_time($msg, $start_time){

    $end_time = microtime_float();
    $time = ($end_time - $start_time) / 1000;

    echo "$msg : $time seconds" . PHP_EOL ;
}



$start_time = microtime_float();



/*

각 자리수별로 조건에 맞는 가장 작은 수는 2, 11, 101, 1001, ...... 1000000001
1자리수를 제외하고는 모두, 양옆이 1이며 나머지는 0으로 구성된 수
1자리수가 2인 이유는 입력받는 값이 자연수이기 때문, 즉, 예외

각 자리수별로 조건에 맞는 가장 큰 수는 9, 99, 999, 9999 ...... 9999999999
전부 9로만 구성된 수

들어온 수가 9, 99, 999, 9999 ...... 9999999999 등 전부 9로만 구성된 수라면
조건에 맞는 가장 작은 수는 현재 수의 자리수 보다 한자리 큰 수이고 마지막이 1이다.
9 -> 11. 99 -> 101, 999 -> 1001 ...... 9999999999 10000000001

9로만 구성된 수가 아니라면 같은 자리수에 조건에 맞는 수가 있다.
*/

function check_all_nine ($string, $length) {

    for ($i = 0; $i < $length; $i++) {

        if ($string[$i] != '9')
            return false;
    }

    return true;
}

function get_number ($input) {

    $string = (string)$input;
    $length = strlen($string);

    if ($input == 1) // 1
        return 2;

    if ($length == 1 && $input != 9)  // 9 가 아닌 한자리수
        return ($input + 1);

    if (pow(10, ($length - 1)) == $input)  // 10, 100, 1000 ......
        return ($input + 1);

    if (check_all_nine ($string, $length) === true) //전부 9로 구성
        return pow(10, $length) + 1;

    if ($length % 2 == 1) {//홀수

        $length_half = floor($length / 2);
        $a = substr($string, 0, $length_half);
        $a_ = '';
        for ($i = ($length_half - 1); $i >= 0; $i--) {

            $a_ .= $a[$i];
        }

        $a_ = (int)$a_;
        $b = (int)substr($string, ($length_half + 1), $length_half);
        $c = substr($string, $length_half, 1);

        if ($a_ > $b) {

            return (int)($a . $c . (string)$a_);
        }
        else {

            if ($c != '9') {

                return (int)($a . (string)((int)$c + 1) . (string)$a_);
            }
            else {

                $a = (string)((int)$a + 1);
                $a_ = '';
                for ($i = ($length_half - 1); $i >= 0; $i--) {

                    $a_ .= $a[$i];
                }

                return (int)($a . '0' . $a_);
            }
        }
    }
    else {//짝수

        $length_half = $length / 2;
        $a = substr($string, 0, $length_half);
        $a_ = '';
        for ($i = ($length_half - 1); $i >= 0; $i--) {

            $a_ .= $a[$i];
        }

        $a_ = (int)$a_;
        $b = (int)substr($string, $length_half, $length_half);

        if ($a_ > $b) {

            return (int)($a . (string)$a_);
        }
        else {

            $a = (string)((int)$a + 1);
            $a_ = '';
            for ($i = ($length_half - 1); $i >= 0; $i--) {

                $a_ .= $a[$i];
            }

            return (int)($a . $a_);
        }
    }
}

$input = 1;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 5;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 10;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 10000;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 1000000000;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 9;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 99999;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 9999999999;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 123451234;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 123491234;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 123454321;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 123494329;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 1234512345;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 1234554321;
echo $input . " => " . get_number($input) . PHP_EOL;

$input = 1234565432;
echo $input . " => " . get_number($input) . PHP_EOL;

get_excute_time("진행 시간", $start_time);

?>
  • 채택 0
1 => 2
5 => 6
10 => 11
10000 => 10001
1000000000 => 1000000001
9 => 11
99999 => 100001
9999999999 => 10000000001
123451234 => 123454321
123491234 => 123494321
123454321 => 123464321
123494329 => 123505321
1234512345 => 1234554321
1234554321 => 1234664321
1234565432 => 1234664321
진행 시간 : 0 seconds
  • 채택 0
전체 1,339 |RSS
퀴즈게시판 내용 검색

회원로그인

진행중 포인트경매

  1. 참여74 회 시작24.04.19 15:40 종료24.04.26 15:40
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT