'Programming'에 해당되는 글 14건

  1. 2015.04.26 crc 정리
  2. 2015.04.25 Using Python Z3 theorem solver (3)
  3. 2014.10.09 android php server gcm & multipart
  4. 2014.07.30 Python Assembly Emulator
  5. 2014.07.11 DimiManager 개발 후기
  6. 2014.04.11 심심해서 만든거..
  7. 2014.02.03 간단한 정렬 알고리즘 정리
  8. 2014.02.01 타이머 함수
  9. 2014.01.20 [dovelet]-crypt
  10. 2013.10.11 os 판별 코드

crc 정리

2015.04.26 17:56

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Z3 은 Microsoft에서 개발한 수식 해석 도구로 방정식과 같은 수학적인 요소들의 해결을 가능하게 해준다. Binary Analysis에 대한 부분도 Z3이 많이 사용 되는데 Pin과 함깨 Concolic Execution이 가능하게 해준다거나 Valgrind의 output을 Z3으로 처리를 해주는 등의 작업을 해줄수 있다. 


설치과정은 아래 링크를 참조하면 쉽게 할 수 있으니 생략하고..

https://github.com/Z3Prover/z3



간단한 예제들을 봐보자.

z3의 Int라는 함수를 이용해 변수 x와 y를 만들어 주고 solve라는 함수에 조건을 줘서 방정식을 해결해준 모습이다.

>>> from z3 import *

>>> x = Int('x')

>>> y = Int('y')

>>> solve(x>2, y<10, x+2*y==7)

[y = 0, x = 7]


아래처럼 expression 들에 대한 traversing도 가능하다

>>> n = x+y>=3

>>> n.num_args()

2

>>> n.children()

[x + y, 3]

>>> n.arg(0)

x + y

>>> n.decl()

>= 


아래는 실수 집합에 대한 수를 정의한후 set_option()이라는 함수를 이용해 추가적인 조건을 줘 값을 출력하는 예제이다 precision에 30을 설정함으로써 소수점 30째자리까지 결과값이 출력이 되도록 해주었다.  

>>> x = Real('x')

>>> y = Real('y')

>>> solve(x**2+y**2==3, x**3==2)

[x = 1.2599210498?, y = -1.1885280594?]

>>> set_option(precision=30)

>>> solve(x**2+y**2==3, x**3==2)

[x = 1.259921049894873164767210607278?,

 y = -1.188528059421316533710369365015?]


이제 Z3의 핵심이자 Binary Analysis에서 가장 많이 쓰이는 Solver에 관해서 알아 볼탠데 위의 예제에서 사용했던 solve()함수는 이 Solver을 이용한 함수이다. Z3은 다양한 Solver를 제공하는데 다음 예를 봐보자.

>>> x = Int('x')

>>> y = Int('y')

>>> s = Solver()

>>> s

[]

>>> s.add(x>10, y==x+2)

>>> s

[x > 10, y == x + 2] 

>>> s.check()

sat

>>> s.push()

>>> s.add(y<11)

>>> s

[x > 10, y == x + 2, y < 11]

>>> s.check()

unsat

>>> s.pop()

>>> s

[x > 10, y == x + 2]

>>> s.check()

sat


Solver()로 기본 solver를 생성하고 add()를 통해 수식들을 추가해 줄 수 있다. 그 뒤 check()라는 함수를 통해 solution이 발견되었을 경우 sat(satisfiable)라는 출력 값을, solution이 발견되지 않았을경우 unsat(unsatisfiable)라는 출력 값을 내뱉는다. push()나 pop()을 이용해서는 solver에 수식을 추가로 더해주거나 뺄수 있다. 


아래 예제와 같이 다양한 메소드를 활용해 가독성을 넓힐 수 도 있다.

>>> x, y, z = Reals('x y z')

>>> s = Solver()

>>> s.add(x>1, y>1, x+y>3, z-x<10)

>>> s.check()

sat

>>> m = s.model()

>>> for d in m.decls():

...     print "%s = %s" %(d.name(), m[d])

... 

z = 0

y = 2

x = 2



Z3에서는 비트 단위를 이용하여 데이터를 표현하는 방식인 비트백터도 사용을 할 수 가 있다. 바로 예제를 살펴보자.

>>> x = BitVec('x', 16)

>>> y = BitVec('y', 16)

>>> simplify(x+y-1)

65535 + x + y

>>> a = BitVecVal(-1, 16)

>>> b = BitVecVal(65535, 16)

>>> simplify(a==b)

True


BitVec()을 통해 16bit크기의 변수를 선언해줬다. 3번째 줄의 simplify를 수행했을때 16bit에서 -1은 65535임을 알 수 있다. 


지금까지 알아본 내용들을 이용하여 Olympic CTF 2014 Welcome To Forensics 문제의 일부를 풀어보자.

eval('FUNCTION FUNCTI0N($PARAMETER) { 

/* ' OMFG A FUNCTION !!! */ 

IF (STRLEN($PARAMETER) <> 16): 

RETURN FALSE; 

ENDIF; 

DIM; $ARRAY = ARRAY(); 

FOR ($I = 1; $I <= STRLEN($PARAMETER); $I++): 

$ARRAY[$I] = ORD(SUBSTR($PARAMETER, $I - 1, 1)); 

ENDFOR; 

IF ((($ARRAY[3] * $ARRAY[6]) ^ ($ARRAY[2] * $ARRAY[2])) - 7320): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[11] * $ARRAY[14]) ^ ($ARRAY[9] * $ARRAY[11])) - 15882): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[15]) ^ ($ARRAY[11] * $ARRAY[4])) - 11789): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[1] * $ARRAY[9]) ^ ($ARRAY[8] * $ARRAY[9])) - 7184): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[16]) ^ ($ARRAY[7] * $ARRAY[11])) - 10366): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[9] * $ARRAY[4]) ^ ($ARRAY[4] * $ARRAY[2])) - 6902): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[15]) ^ ($ARRAY[11] * $ARRAY[16]))): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[6]) ^ ($ARRAY[6] * $ARRAY[1])) - 2277): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[10] * $ARRAY[9]) ^ ($ARRAY[16] * $ARRAY[15])) - 4385): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[2] * $ARRAY[7]) ^ ($ARRAY[1] * $ARRAY[10])) - 15468): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[3] * $ARRAY[14]) ^ ($ARRAY[6] * $ARRAY[15])) - 8075): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[3]) ^ ($ARRAY[5] * $ARRAY[10])) - 11550): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[3]) ^ ($ARRAY[9] * $ARRAY[8])) - 7668): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[12]) ^ ($ARRAY[12] * $ARRAY[1])) - 3032): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[7] * $ARRAY[4]) ^ ($ARRAY[8] * $ARRAY[13])) - 14067): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[3]) ^ ($ARRAY[7] * $ARRAY[7])) - 11997): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[12] * $ARRAY[11]) ^ ($ARRAY[5] * $ARRAY[8])) - 13208): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[16]) ^ ($ARRAY[7] * $ARRAY[13])) - 11282): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[2] * $ARRAY[12]) ^ ($ARRAY[13] * $ARRAY[2])) - 1126): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[8] * $ARRAY[15]) ^ ($ARRAY[9] * $ARRAY[2])) - 326): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[11]) ^ ($ARRAY[15] * $ARRAY[12])) - 5115): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[16] * $ARRAY[2]) ^ ($ARRAY[15] * $ARRAY[7])) - 1213): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[13] * $ARRAY[12]) ^ ($ARRAY[1] * $ARRAY[16])) - 9471): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[6] * $ARRAY[16]) ^ ($ARRAY[1] * $ARRAY[3])) - 6359): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[16] * $ARRAY[5]) ^ ($ARRAY[14] * $ARRAY[9])) - 7177): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[14] * $ARRAY[10]) ^ ($ARRAY[10] * $ARRAY[1])) - 5846): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[4] * $ARRAY[3]) ^ ($ARRAY[13] * $ARRAY[12])) - 15954): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[8] * $ARRAY[8]) ^ ($ARRAY[1] * $ARRAY[14])) - 3254): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[4] * $ARRAY[15]) ^ ($ARRAY[7] * $ARRAY[8])) - 12137): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[3] * $ARRAY[10]) ^ ($ARRAY[5] * $ARRAY[4])) - 131): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[5] * $ARRAY[4]) ^ ($ARRAY[6] * $ARRAY[10])) - 2685): 

RETURN FALSE; 

ENDIF; 

IF ((($ARRAY[11] * $ARRAY[12]) ^ ($ARRAY[10] * $ARRAY[14])) - 7242): 

RETURN FALSE; 

ENDIF; 

RETURN "YES, $PARAMETER"; 


RETURN TRUE;')


이 무수히 많은 조건들을 일일이 통과할수는 없고 다른 방법이 필요한데 z3을 써주면 아주 간단히 문제를 풀 수 있다.

#!/usr/bin/python


from z3 import *

array = [ BitVec('a%i'%i,8) for i in range(0,17)]


s = Solver()

s.add(((array[3] * array[6]) ^ (array[2] * array[2])) == 7320)

s.add(((array[11] * array[14]) ^ (array[9] * array[11])) == 15882)

s.add(((array[14] * array[15]) ^ (array[11] * array[4])) == 11789) 

s.add(((array[1] * array[9]) ^ (array[8] * array[9])) == 7184) 

s.add(((array[13] * array[16]) ^ (array[7] * array[11])) == 10366) 

s.add(((array[9] * array[4]) ^ (array[4] * array[2])) == 6902)          

s.add(((array[13] * array[15]) ^ (array[11] * array[16])) == 0)

s.add(((array[14] * array[6]) ^ (array[6] * array[1])) == 2277) 

s.add(((array[10] * array[9]) ^ (array[16] * array[15])) == 4385) 

s.add(((array[2] * array[7]) ^ (array[1] * array[10])) == 15468) 

s.add(((array[3] * array[14]) ^ (array[6] * array[15])) == 8075) 

s.add(((array[6] * array[3]) ^ (array[5] * array[10])) == 11550) 

s.add(((array[5] * array[3]) ^ (array[9] * array[8])) == 7668) 

s.add(((array[13] * array[12]) ^ (array[12] * array[1])) == 3032) 

s.add(((array[7] * array[4]) ^ (array[8] * array[13])) == 14067) 

s.add(((array[6] * array[3]) ^ (array[7] * array[7])) == 11997) 

s.add(((array[12] * array[11]) ^ (array[5] * array[8])) == 13208) 

s.add(((array[5] * array[16]) ^ (array[7] * array[13])) == 11282) 

s.add(((array[2] * array[12]) ^ (array[13] * array[2])) == 1126) 

s.add(((array[8] * array[15]) ^ (array[9] * array[2])) == 326) 

s.add(((array[5] * array[11]) ^ (array[15] * array[12])) == 5115) 

s.add(((array[16] * array[2]) ^ (array[15] * array[7])) == 1213) 

s.add(((array[13] * array[12]) ^ (array[1] * array[16])) == 9471) 

s.add(((array[6] * array[16]) ^ (array[1] * array[3])) == 6359) 

s.add(((array[16] * array[5]) ^ (array[14] * array[9])) == 7177) 

s.add(((array[14] * array[10]) ^ (array[10] * array[1])) == 5846) 

s.add(((array[4] * array[3]) ^ (array[13] * array[12])) == 15954) 

s.add(((array[8] * array[8]) ^ (array[1] * array[14])) == 3254) 

s.add(((array[4] * array[15]) ^ (array[7] * array[8])) == 12137) 

s.add(((array[3] * array[10]) ^ (array[5] * array[4])) == 131) 

s.add(((array[5] * array[4]) ^ (array[6] * array[10])) == 2685) 

s.add(((array[11] * array[12]) ^ (array[10] * array[14])) == 7242) 


for i in range(1,17):

    s.add(array[i] >= 32 and array[i] <= 126)


print s.check()

print s.model()


Z3을 다루는데에 이론적인 부분은 많이 필요 없다고 생각하여 예제중심으로 포스팅을 하였읍니다~


Reference

http://blog.dragonsector.pl/2014/02/olympic-ctf-2014-welcome-to-forensics.html

http://z3prover.github.io/api/html/namespacez3py.html

http://cpl0.net/~argp/papers/z3py-guide.pdf

'Programming' 카테고리의 다른 글

Using Python Z3 theorem solver  (3) 2015.04.25
android php server gcm & multipart  (0) 2014.10.09
DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
Posted by xer0s 트랙백 3 : 댓글 3

앱 서버 개발을 하면서 막혔던 부분이 gcm이랑 multipart 이렇게 두개 정도 였는데 정리겸 포스팅 해봅니다.



일단 아래는 push알림을 주는 gcm소스이고, API KEY는 본인이 직접 google에서 키를 발급받으셔야 됩니다.

$msg 인자는 push알림을 줄 json 인자고 $result는 db에서 reg_id를 뽑아 아직 fetch 하지 않은 resource 값입니다.

function gcmSend($msg, $result=NULL)

{

$header = array('Content-Type:application/json', 'Authorization:key=API_KEY');


$arr=array();

$arr['data']=array();

$arr['data']=$msg;

$arr['registration_ids']=array();


$i=0;

while($row=mysql_fetch_array($result))

{

$arr['registration_ids'][$i]=$row['reg_id'];

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,'http://android.googleapis.com/gcm/send');

curl_setopt($ch,CURLOPT_HTTPHEADER, $header);

curl_setopt($ch,CURLOPT_POST, true);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode($arr));

$response=curl_exec($ch);

$obj=json_decode($response, true);


if($obj['results'][0]['error']=="NotRegistered")

{

$reg_id=$row['reg_id'];

$query="DELETE FROM user where reg_id='".$reg_id."'";

mysql_query($query) or die(mysql_error());

}

}

}



그리고 다음은 multipart인데 클라이언트에서 서버로 이미지를 업로드 할때 쓰이는 방식입니다.

인자 $key는 FILES로 받은 타입이 배열일때 그걸 $key로 분리한거고 $error는... 제가 코딩한 방식 때문에 따로 추가시켜준 인자인데 소스를 보시고 이해하시면 될꺼 같습니다.

 function imageUpload($key=NULL, $error=NULL)

{

if($error == UPLOAD_ERR_OK)

{

$imagetype = exif_imagetype($_FILES['file']['tmp_name'][$key]);

if($imagetype != 2 && $imagetype != 3)

{

$return['msg'] = "Only JPG and PNG";

ReturnResult($return);

}

if($_FILES['file']['size'][$key] > 1024*1024*10)

{

$return['msg'] = "Too big";

ReturnResult($return);

}

$filename = substr(sha1(rand().time()), 0, 20).".jpg";

while(1)

{

if(file_exists("images/".$filename))

{

$filename = substr(sha1(rand().time()), 0, 20).".jpg";

}

else

break;

}


if(!move_uploaded_file($_FILES['file']['tmp_name'][$key], "filepath".$filename))

{

$return['msg'] = "Move Uploaded File";

ReturnResult($return);

}

else

{

return $filename;

}

}

else

{

$return['msg'] = "Error while uploading File";

ReturnResult($return);

}

} 



이해를 돕기 위해 imageUpload를 호출한 부분도 올립니다.

foreach($_FILES['file']['error'] as $key => $error)

{

$filename = imageUpload($key, $error);

$query = "INSERT INTO image(imageLoc, isThumbNail, diary_id) VALUES('".$filename."', 0, ".$row[0].")";

mysql_query($query);

} 




'Programming' 카테고리의 다른 글

Using Python Z3 theorem solver  (3) 2015.04.25
android php server gcm & multipart  (0) 2014.10.09
DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
Posted by xer0s 트랙백 0 : 댓글 0

Python Assembly Emulator

2014.07.30 02:16

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

DimiManager 개발 후기

2014.07.11 22:35 from Programming

학교에서 뜻이 맞는 친구들이랑 팀을 꾸려서 STAC 2014 대회 출전 연습겸 어플 개발을 해봤다.

어플 이름은 DimiManager로 학생들의 스케줄을 관리해주고 공지등을 올려주는 그런 앱이다.


결론부터 말하자면..

서버 개발을 맡았었는데 첫 개발이라 그런지 망했고, 여러가지 느낀점들이 많았는데..


1. 어떤 개발이든 기획을 확실히 하자(디비 설계를 포함한..)

2. Trello(일정 관리), 문서화 등을 체계적으로 확실히 하자

3. 소스관리를 확실히 체계적으로 하자 ( 나 같은 경우는 로컬에도 여러곳곳에 저장해놔서 소스들이 햇갈린 적도 많았고 github도 이용했지만 관리가 제대로 안되었다)

4. 서버 개발 같은경우 예외처리를 확실히 해주자

(예외가 생각해보면 정말 많이 있는데 이를 확실히 처리해줘야 될꺼 같다.)


php+mysql을 이용 했는데 나름 연습도 되고 나쁘진 않았던거 같다 ( 첫 팀계발 치곤..)


GCM 사용하면서도 암이 좀 걸렸었는데 오류시 몇가지 팁을 좀 주자면(경험 바탕)


1. MySQL에 reg_id를 저장한 값이 짤리거나 이상한 값이 추가되진 않았는지 

( reg_id 같은 경우 data type을 text로 해줘야 한다.  varchar(100)까지 잡아 주고 해봤는데도 안됫음..)


2. 모듈화를 확실히 하자

예를들어 gcmSend하는 함수는 따로 라이브러리로 빼두고 각 소스별로 msgSend 같은 함수만 선언해서 json으로 넘겨주면 소스가 확실히 읽기 편하고 수정도 편해진다..


3. 클라이언트 같은경우는 ProjectID 서버 같은경우는 API-KEY를 확실히 확인하자


4. GCM 같은 경우는 거의다 인터넷을 통해 소스를 붙여넣기 하지만 그런 과정에서 오류가 생기는 과정이 다반사다. 또한 자기가 가져온 코드가 굉장히 비효율적인 코드일 수도 있기에 항상 여러 소스를 봐보고 가장 적절한걸 고르자.



소스는 완성된것도 아니고 상당히 더러워서 비공개로.. 기능을 별로 없는데 소스가 500줄이 다되가서 ㅜㅜ..

그나저나 요즘 Node.js가 끌리던데 ..

'Programming' 카테고리의 다른 글

Using Python Z3 theorem solver  (3) 2015.04.25
android php server gcm & multipart  (0) 2014.10.09
DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
Posted by xer0s 트랙백 0 : 댓글 0

심심해서 만든거..

2014.04.11 13:43 from Programming

반에서 자리를 바꾸는데 해방이 남의 프로그램을 쓸순 없지..


import random


a = []


for i in range(1, 38):

    a.append(i)


random.shuffle(a)


print "#########################################"

print "#                                       #"

print "#                Dimigo HD              #"

print "#               Random Seat             #"

print "#                                       #"

print "#########################################"


for i in range(0, 6):

    for j in range(0+6*i, 6+6*i):

        print '%d\t' % a[j],

    print ""


print a[36] 






'Programming' 카테고리의 다른 글

android php server gcm & multipart  (0) 2014.10.09
DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
Posted by xer0s 트랙백 0 : 댓글 0

알고리즘 중에서도 정렬과 탐색은 가장 많이 쓰이는 알고리즘중 하나이다. 

이 포스팅에선 코드적으로 구현이 꽤 간편하면서도 햇갈리는 버블 정렬(Bubble Sort) 선택 정렬(Selection Sort)

삽입정렬(Insertion Sort)을 정리해 보려한다.


우선 버블정렬은 c언어 기본문법서도 다룰 만큼 기초적인 정렬 알고리즘이다.


(윤성우의 열혈 자료구조 그림 10-1)


위의 그림에서부터 알수 있듯이 버블정렬은 두 인접한 데이터를 비교해가면서 정렬을 진행하는 방식이다.

위의 작업은 오름차순으로 정렬을 하는 과정으로 정렬의 우선순위가 가장 낮은 큰 값이 맨 뒤로 이동한다.

위와 같이 두번째, 세번째, 네번째 값들도 차례 대로 정렬을 해준다. 

다음은 버블정렬의 구현이다.


void BubbleSort(int arr[], int n)

{

int i, j;

int tmp;


for(i=0; i<n-1; i++)

{

for(j=0; j<(n-i)-1; j++)

{

if(arr[j]>arr[j+1])

{

tmp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = tmp;

}

}

}

}


버블 정렬의 빅오는 O(n^2) 이다. 상당히 좋지 않은 알고리즘에 속한다고 볼수 있다.


그 다음은 선택 정렬이다.


(윤성우 열혈 자료구조 그림 10-5)


위의 그림을 해석해보자면 정렬순서상 가장 앞서는 것을 선택해서 가장 왼쪽으로 이동시키고, 원래 그자리에 있던 데이터는 빈 자리에 가져다 놓는것이다. 딱히 덧붙힐 설명도 없으므로 아래 구현을 참고하길 바란다.


void SelSort(int arr[], int n)

{

int i, j;

int idx;

int tmp;


for(i=0; i<n-1; i++)

{

idx = i;


for(j=i+1; j<n; j++)

{

if(arr[j]<arr[idx])

idx = j;

}


tmp = arr[i];

arr[i] = arr[idx];

arr[idx] = tmp;

}

}


선택 정렬의 빅오는 O(n)으로 버블정렬보다는 성능이 좋지만 여러 경우들을 고려하면 사실 둘은 비슷비슷하다.



마지막으로 삽입 정렬이다.

(윤성우 열혈 자료구조 그림 10-8)


그림을 보면 이해가 쉽게 되리라 생각된다. 첫 번째부터 차레대로 데이터를 비교하며 데이터를 옮겨준다 

단지 코드를 구현해줄때는 정렬이 되야 되는 곳 이후에 있는 데이터들은 뒤로 옮겨 주는 작업도 해줘야 된다.

다음은 삽입 정렬 코드이다.


void InsertSort(int arr[], int n)

{

int i, j;

int data;


for(i=1; i<n; i++)

{

data = arr[i];


for(j=i-1; j>=0; j--)

{

if(arr[j]>data)

arr[j+1] = arr[j];

else

break;

}


arr[j+1] = data;

}

}


빅오는 O(n^2)이므로 버블정렬과 같다. 좋은 알고리즘이라고 볼수는 없겠다.



'Programming' 카테고리의 다른 글

DimiManager 개발 후기  (0) 2014.07.11
심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
os 판별 코드  (0) 2013.10.11
Posted by xer0s 트랙백 0 : 댓글 0

타이머 함수

2014.02.01 19:39 from Programming

자바스크립트 내장 함수중에 특정한 시간에 특정한 함수를 실행할 수 있게 해주는 타이머 함수가 있다.


setTimeout(function, millisecond)

일정 시간 후 함수를 한번 실행

setInterval(function, millisecond)

일정 시간마다 함수를 반복해서 실행

clearTimeout(id)

일정 시간 후 함수를 한번 실행하는 것을 중지

clearInterval(id)

일정 시간마다 함수를 반복하는 것을 중단 


setTimeout() 함수는 한 번만 실행하므로 주의할 사항이 없지만 setInterval() 함수는 지속적으로 실행하므로

지속적으로 컴퓨터의 자원을 소비할 위험이 있기 때문에 주의해야 한다.


// Example


<script>

var intervalID = setInterval(function(){

alert('<p>' + new Date() + '</p>');

}, 1000);


setTimeout(function() {

clearInterval(intervalID);

}, 10000);


</script>


'Programming' 카테고리의 다른 글

심심해서 만든거..  (0) 2014.04.11
간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
os 판별 코드  (0) 2013.10.11
Binary Search  (0) 2013.07.18
Posted by xer0s 트랙백 0 : 댓글 0

[dovelet]-crypt

2014.01.20 19:18 from Programming

// 공백+대문자 기능 없음


#include <stdio.h>

#include <string.h>


void findplace(char encrypt[], char plane[], int place[], int len)

{

int i, j;

for(i=0; i<len; i++)

{

for(j=0; j<53; j++)

{

if(encrypt[i] == plane[j])

{

place[i] = j;

}

}

}

}


int main(void)

{

int k;

char key[27];

char encrypt[80];

char plane[53] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

int place[80];

int len;


scanf("%s", key);

scanf("%s", encrypt);


len = strlen(encrypt);

findplace(encrypt, plane, place, len);

for(k=0; k<len; k++)

{

printf("%c", key[place[k]]);

}


return 0;

}

'Programming' 카테고리의 다른 글

간단한 정렬 알고리즘 정리  (0) 2014.02.03
타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
os 판별 코드  (0) 2013.10.11
Binary Search  (0) 2013.07.18
좋은 사이트..  (0) 2013.07.13
Posted by xer0s 트랙백 0 : 댓글 0

os 판별 코드

2013.10.11 17:34 from Programming

자신이 사용중인 os가 window 7인지 아닌지를 판별해주는 프로그램을 짜봤다.

리버싱 문제낼때 언제 한번 써먹어야 겠다.



#include <stdio.h>

#include <tchar.h>

#include <Windows.h>


int _tmain(int argc, TCHAR *argv[])

{

OSVERSIONINFOEX osver = {0, };

osver.dwOSVersionInfoSize = sizeof(osver);

osver.dwMajorVersion = 6;

osver.dwMinorVersion = 1;

osver.dwPlatformId = VER_PLATFORM_WIN32s;


DWORDLONG dwlConditionMask = 0;

VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_EQUAL);

VER_SET_CONDITION(dwlConditionMask, VER_PLATFORMID, VER_EQUAL);


if(VerifyVersionInfo(&osver, VER_MAJORVERSION | VER_MINORVERSION | VER_PLATFORMID, dwlConditionMask))

_tprintf(TEXT("This system is Window 7\n"));

else

_tprintf(TEXT("This system is not Window 7\n"));


return 0;

}




'Programming' 카테고리의 다른 글

타이머 함수  (0) 2014.02.01
[dovelet]-crypt  (0) 2014.01.20
os 판별 코드  (0) 2013.10.11
Binary Search  (0) 2013.07.18
좋은 사이트..  (0) 2013.07.13
c++ 급여 관리 시스템  (0) 2013.07.09
Posted by xer0s 트랙백 0 : 댓글 0