- 유형1 : 데이터 사전 입력된 버전
set serveroutput on
set verify off
accept p_num prompt '찾을 숫자는 무엇인가요? '
declare
type array_num is varray( 15 ) of number(10);
v_array array_num := array_num( 1, 7, 11, 12, 14, 23, 33, 47, 51, 64, 67, 77, 130, 672, 871);
v_input number(10) := &p_num;
v_start number(10) := 1;
v_end number(10) := v_array.count;
v_mid number(10) := ( v_start + v_end ) / 2;
v_result number(10) := 0;
begin
while v_start != v_end loop
v_mid := ( v_start + v_end ) / 2;
if v_array( v_mid ) > v_input then
v_end := v_mid - 1;
v_result := v_end;
--dbms_output.put_line( v_start || ' ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
elsif v_array( v_mid ) < v_input then
v_start := v_mid + 1;
v_result := v_start;
--dbms_output.put_line( v_start || ' ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
elsif v_array( v_mid ) = v_input then
v_result := v_mid;
--dbms_output.put_line( v_start || ' @ ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
exit;
end if;
end loop;
if v_array( v_result ) = v_input then
dbms_output.put_line( '결과 : 숫자 중에서 ' || v_input || ' 이 검색 됩니다.' );
elsif v_array( v_result ) != v_input then
dbms_output.put_line( '결과 : 숫자 중에서 ' || v_input || ' 이 검색 되지 않습니다.' );
end if;
end;
/
- 유형2 : 데이터 입력 받는 버전
set serveroutput on
set verify off
accept p_num1 prompt '숫자를 입력하세요 : '
accept p_num2 prompt '찾을 숫자는 무엇인가요? '
declare
type array_num is table of number(10);
v_array array_num := array_num();
v_input number(10) := &p_num2;
v_start number(10) := 1;
v_end number(10);
v_mid number(10) := ( v_start + v_end ) / 2;
v_result number(10) := 0;
begin
v_array.extend( regexp_count( '&p_num1', '[^ ]+' ) );
for v in 1 .. v_array.count loop
v_array(v) := to_number( regexp_substr('&p_num1', '[^ ]+', 1, v) );
end loop;
v_end := v_array.count;
--dbms_output.put_line( v_start || ' ' || v_mid || ' ' || v_end );
while v_start != v_end loop
v_mid := ( v_start + v_end ) / 2;
if v_array( v_mid ) > v_input then
v_end := v_mid - 1;
v_result := v_end;
--dbms_output.put_line( v_start || ' ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
elsif v_array( v_mid ) < v_input then
v_start := v_mid + 1;
v_result := v_start;
--dbms_output.put_line( v_start || ' ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
elsif v_array( v_mid ) = v_input then
v_result := v_mid;
--dbms_output.put_line( v_start || ' @ ' || v_mid || ' ' || v_end );
--dbms_output.put_line( v_array( v_start )|| ' ' || v_array(v_mid ) || ' ' || v_array( v_end ) );
exit;
end if;
end loop;
if v_array( v_result ) = v_input then
dbms_output.put_line( '결과 : 숫자 중에서 ' || v_input || ' 이 검색 됩니다.' );
elsif v_array( v_result ) != v_input then
dbms_output.put_line( '결과 : 숫자 중에서 ' || v_input || ' 이 검색 되지 않습니다.' );
end if;
end;
/