kitel algorithm 1

Post on 15-Apr-2017

72 Views

Category:

Software

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

OF KITELBY KITEL

FOR KITELS/W 능력 향상을 위한 Algorithm 세미나

37th 김진오

목차• Why Algorithm? // 왜 부른거야• Standard Input & Output //scanf 는 Cin보다 강하다 .

• 기초수학 // 초등학교로 돌아갑시다 .

• 문자열 // 귀찮다고 무시했죠 ?

• 재귀 !! Recursive!!! 재귀 !!!! // 미쳤나 ..

Why Algorithm?• 삼성 , LG, SK, KT, 제니퍼 소프트 외국 기업들

// 삼성은 알고리즘에 눈이 멀었다 .

• 대학원도 알고리즘 시험이 기본• 알파고 이놈 !

• 코드 양을 줄여라 !

Standard Input&Output

• scanf 는 Cin 보다 강하다 !

• 가장 큰 차이 : 속도 . // 알고리즘은 시간싸움이다 .

• ..? 불편하잖아요 !

scanf 는 Cin 보다 빠르다• 와 같은 관계• 작은 입력에는 차이가 없지만 큰 입력에는 속수무책

scanf 는 Cin 보다 빠르다

scanf 는 Cin 보다 불편하잖아요 !

• 사실 공채시험에서는 Cin 을 쓰던 , scanf 를 쓰던 다 풀 수 있도록 충분한 런타임을 제공한다 .

• 공부는 불편하게 해야죠• 편하게 백수 될래요 ?

scanf(“ %d”,&KITEL);

• 차이는 ?

• “%d” 와 “ %d” 공백 하나 .

• 그래서 차이는 ?

• 입력을 받을 줄 아는구나 !

scanf• scanf(“\n%d”,&KITEL);

New line character 무시 .

• scanf(“ %d”,&KITEL);공백 무시 . (New line character 포함 )

• scanf(“abc %d”,&KITEL);abc 무시사실 무시가 아니고 입력을 받고 어디에도 저장을 안함 .알고리즘 문제푸는데 엄청나게 유용한 팁 .

여러개 입력받기• 2 차원 배열을 써야하는 경우에 한 줄에 두 개의 정수가 들어오는 경우가 많다 .

• scanf("%d %d",&A, &B);

버퍼처리 ?• 버퍼처리란 ?숫자를 입력받고 문자를 입력받을 때 씹히는 현상 .숫자를 입력하고 누르는 엔터 (New line character)때문 .

• Cin 쓰면 버퍼 신경 안써도 되잖아요 .

• !!

• scanf(“\n%c”,&character);안받아요 .

기초수학• 저 공돌인데요 ?

• 미안 내가 수학이 약해서 ..

Why Mathematics?

• 코딩에서 수학이란 ?

• 코드의 양을 줄이자 !

• 알고리즘은 물 흐르듯 흘러가야 ..

초등학교• 최대공약수• 최소공배수

GCD, LCM

• Greatest Common Divisor 최대공약수• Lowest Common Multiple 최소공배수

종종 문제풀이에 키가 되는 녀석들

GCD(12,4)

• 12 4

• 8 4

• 4 4

• 12 - 4 = 8

• 8 - 4 = 4

• GCD(12,4) == 4

두 수가 같아질때 까지 .

GCD(6,16)• 6 16

• 6 10

• 6 4

• 2 4

• 2 2

• |6 - 16| = 10

• |6 - 10| = 4

• 6 - 4 = 2

• |2 - 4| =2

• GCD(6,16) == 2

두 수 중에 큰 녀석의 값을 두 값의 절대값 차이와 바꾼다 .

GCD - CODEint gcd(int parm_a, int parm_b){

if(parm_a*parm_b == 0){return 0;

}while(parm_a != parm_b){

if(parm_a > parm_b){parm_a = parm_a - parm_b;

}else{

parm_b = parm_b - parm_a;}

}return parm_a;

}

GCD - CODE

int gcd(int parm_a, int parm_b){return b ? gcd(parm_b,parm_a%parm_b) :

parm_b;}

삼항연산자• Format

Variable = (Condition) ? (return A) : (return B);

• if(condition){ // 이거랑 똑같다 .Variable=A;

} else{

Variable=B;}

• ex)SangHyeok = Handsome ? Yes : No;

• ex) 임시 변수와 최대값을 비교하여 최대값 갱신하기 .MAX = MAX > temp ? MAX : temp;

LCM

• LCM = A*B/GCD

중학교

• 시간 = 거리 / 속력

여왕벌 문제X m/s

L

여왕벌 문제• 날아간 시간 ==

• 시간 * 속력 = 거리

고등학교

• 구분구적법

원의 넓이 구하기

원의 넓이 구하기 - CODE

대학교

• 제곱근 없이 제곱근 문제 풀기

제곱근 구하기• sqrt 함수 쓰면 되잖아요 !

• 나가세요 ..

• 공부는 불편하게 .

Newton-Raphson• 처음보는데 ?

• 공학수학에 나와요 ..

• 근사값 구하는 방법 알아두면 좋다 .

• https://en.wikipedia.org/wiki/Newton%27s_method

Newton-Raphson

Newton-Raphson - CODE

축 ! 졸업 !

문자열• 수학하니깐 지겨워서요• 쉽잖아요• ?

• 에이 설마 못 풀까봐 ?

• 그래도 다시 한 번

Why String?• 보통 대기업 .. 은 모르겠고 삼성 공채 기준은

searching 능력 .

• Searching 문제에 종종 짬뽕돼서 나오는 문자열 .

• 쉽다고 ?

• 입력 받는데만 한 세월 .

필수적인 함수들• int strlen(char* parm_str); 문자열의 길이 리턴• char* strcpy(char* dest, char* copy);

copy 할 문자열을 dest 에 복사• char* strncpy(char*, char* copy, int num);

copy 문자열의 시작부터 n 개의 문자를 dest 에 복사 .

• int sprintf(char* buffer, const char* format,…);이게 진짜 꿀 . ( 알고리즘 보다는 실제 개발할때 꿀 )ex)char str[100]; int str_len;str_length=sprintf(str,”KITEL %dth %s”,37,”Jinoh Kim”);==> str_length==20, str==“KITEL 37th Jinoh Kim”

풀어보면 귀찮을 문제들• 공부는 불편하게 해야해요 . 옷차림 빼고 .

• // 문자열 뒤집기http://59.23.113.171/30stair/reverse/reverse.php?pname=reverse

• // 단어별 역순http://59.23.113.171/30stair/esrever/esrever.php?pname=esrever

• // 지뢰http://59.23.113.171/30stair/mine/mine.php?pname=mine

• // 문자 피보나치http://59.23.113.171/30stair/fibos/fibos.php?pname=fibos

재귀 !!• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

어쩌라고• 어쩌라고• 어쩌라고• 어쩌라고• 어쩌라고• 어쩌라고• 어쩌라고

Why Recursive?• 알고리즘 시험은 시간싸움 .

• 코드 간소화 .

• 스택을 구현할 필요가 없다 .

• 하지만 실제 개발할때 사용하면 개 발 . 시스템 과부하가 크다 .

재귀int gcd(int parm_a, int parm_b){

return b ? gcd(parm_b, parm_a%parm_b) : parm_b;}

아까 만났던 그 녀석• 함수가 Call-Stack 에 차곡차곡 쌓였다가 가장 늦게 들어온 녀석부터 빠져나간다 .

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

재귀• 좀 더 착하게 생긴 녀석이랑 놀아보자• int makeTen(int parm){

if(parm<10){return makeTen(parm+1);

}else if(parm>10){

return makeTen(parm-1);}else{

return parm;}

}

printf(“%d\n”,makeTen(5)); ==> 10

재귀는 이럴때 유용하다• 좌우대칭 산모양• 대칭 !

• Back tracking. 무언가를 찾아야 할 때 .

좌우대칭 산모양

• http://59.23.113.171/30stair/pTp/pTp.php?pname=pTp

• 재귀 ! 샌드위치를 잘 만들어 보세요 .

• 싫으면 알아서 잘 해보세요 . 김밥을 드시던가 .

좌우대칭 산모양 - CODEN=3

CALL STACK

현재 위치 다시 시작

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

3

좌우대칭 산모양 - CODEPUSH

recursive(3);

CALL STACK

recursive(2);

3

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);recursive(2);

2

recursive(1);

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

1

recursive(1);

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);recursive(2);

1

recursive(1);recursive(0);

좌우대칭 산모양 - CODE

CALL STACK

0

recursive(3);recursive(2);recursive(1);recursive(0);

좌우대칭 산모양 - CODE

CALL STACK

0

recursive(3);recursive(2);recursive(1);recursive(0);

좌우대칭 산모양 - CODEPOP

CALL STACKrecursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACK

1

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACK

11

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODEPUSH

CALL STACK

11

recursive(0);

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACK

10

recursive(0);

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODEPOP

CALL STACK

1

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACK

11

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACK

11

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODEPOP

CALL STACK

1

recursive(5);recursive(4);recursive(3);recursive(2);

recursive(3);recursive(2);

좌우대칭 산모양 - CODE

CALL STACK

1

recursive(3);recursive(2);

2

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

212

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2

PUSH

12

recursive(1);

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

PUSH

recursive(0);

좌우대칭 산모양 - CODE

CALL STACK

120

recursive(0);

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODEPOP

CALL STACK

12

recursive(3);recursive(2);recursive(1);

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

1121

recursive(1);0 생략

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

121

0 생략

POP

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2121

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2121

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);

121

POP

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

3121

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213

recursive(2);

PUSH

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213

recursive(2);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213

recursive(2);recursive(1);

PUSH

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213

recursive(2);

0 생략recursive(1);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

112131

recursive(2);recursive(1);

0 생략

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

112131

recursive(2);recursive(1);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

12131

recursive(2);

POP

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

212131

recursive(2);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

2121312

recursive(2);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1121312

recursive(2);recursive(1);

0 생략

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213121

recursive(2);recursive(1);

0 생략

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213121

recursive(2);recursive(1);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1213121

recursive(2);

POP

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213121

recursive(2);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213121

recursive(2);

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1213121

POP

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213121

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213121

좌우대칭 산모양 - CODE

CALL STACK

1213121

POP

좌우대칭 산모양 - CODE

1213121

좌우대칭 산모양 - CODE

1213121

다 그렸다 ..다 그렸다 ..다 그렸다 ..

그냥 산 하나만 그려보자

그냥 산 하나만 그려보자

top related