kitel algorithm 1

108
OF KITEL BY KITEL FOR KITEL S/W 능능 능능능 능능 Algorithm 능능능 37th 능능능

Upload: -

Post on 15-Apr-2017

72 views

Category:

Software


3 download

TRANSCRIPT

Page 1: Kitel algorithm 1

OF KITELBY KITEL

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

37th 김진오

Page 2: Kitel algorithm 1

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

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

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

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

Page 3: Kitel algorithm 1

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

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

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

• 코드 양을 줄여라 !

Page 4: Kitel algorithm 1

Standard Input&Output

• scanf 는 Cin 보다 강하다 !

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

• ..? 불편하잖아요 !

Page 5: Kitel algorithm 1

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

Page 6: Kitel algorithm 1

scanf 는 Cin 보다 빠르다

Page 7: Kitel algorithm 1

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

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

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

Page 8: Kitel algorithm 1

scanf(“ %d”,&KITEL);

• 차이는 ?

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

• 그래서 차이는 ?

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

Page 9: Kitel algorithm 1

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

New line character 무시 .

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

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

Page 10: Kitel algorithm 1

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

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

Page 11: Kitel algorithm 1

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

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

• !!

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

Page 12: Kitel algorithm 1

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

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

Page 13: Kitel algorithm 1

Why Mathematics?

• 코딩에서 수학이란 ?

• 코드의 양을 줄이자 !

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

Page 14: Kitel algorithm 1

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

Page 15: Kitel algorithm 1

GCD, LCM

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

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

Page 16: Kitel algorithm 1

GCD(12,4)

• 12 4

• 8 4

• 4 4

• 12 - 4 = 8

• 8 - 4 = 4

• GCD(12,4) == 4

두 수가 같아질때 까지 .

Page 17: Kitel algorithm 1

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

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

Page 18: Kitel algorithm 1

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;

}

Page 19: Kitel algorithm 1

GCD - CODE

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

parm_b;}

Page 20: Kitel algorithm 1

삼항연산자• 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;

Page 21: Kitel algorithm 1

LCM

• LCM = A*B/GCD

Page 22: Kitel algorithm 1

중학교

• 시간 = 거리 / 속력

Page 23: Kitel algorithm 1

여왕벌 문제X m/s

L

Page 24: Kitel algorithm 1

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

• 시간 * 속력 = 거리

Page 25: Kitel algorithm 1

고등학교

• 구분구적법

Page 26: Kitel algorithm 1

원의 넓이 구하기

Page 27: Kitel algorithm 1

원의 넓이 구하기 - CODE

Page 28: Kitel algorithm 1

대학교

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

Page 29: Kitel algorithm 1

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

• 나가세요 ..

• 공부는 불편하게 .

Page 30: Kitel algorithm 1

Newton-Raphson• 처음보는데 ?

• 공학수학에 나와요 ..

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

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

Page 31: Kitel algorithm 1

Newton-Raphson

Page 32: Kitel algorithm 1

Newton-Raphson - CODE

Page 33: Kitel algorithm 1

축 ! 졸업 !

Page 34: Kitel algorithm 1

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

• 에이 설마 못 풀까봐 ?

• 그래도 다시 한 번

Page 35: Kitel algorithm 1

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

searching 능력 .

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

• 쉽다고 ?

• 입력 받는데만 한 세월 .

Page 36: Kitel algorithm 1

필수적인 함수들• 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”

Page 37: Kitel algorithm 1

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

• // 문자열 뒤집기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

Page 38: Kitel algorithm 1

재귀 !!• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

• 재귀 !!

Page 39: Kitel algorithm 1

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

Page 40: Kitel algorithm 1

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

• 코드 간소화 .

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

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

Page 41: Kitel algorithm 1

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

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

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

Page 42: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Page 43: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Page 44: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Page 45: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Push

Page 46: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

Page 47: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

Page 48: Kitel algorithm 1

Stack

• 가장 기초적인 Data structure

• Push, Pop

• FILO(First In Last Out)

Pop

Page 49: Kitel algorithm 1

재귀• 좀 더 착하게 생긴 녀석이랑 놀아보자• 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

Page 50: Kitel algorithm 1

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

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

Page 51: Kitel algorithm 1

좌우대칭 산모양

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

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

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

Page 52: Kitel algorithm 1

좌우대칭 산모양 - CODEN=3

CALL STACK

현재 위치 다시 시작

Page 53: Kitel algorithm 1

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);

Page 54: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

3

Page 55: Kitel algorithm 1

좌우대칭 산모양 - CODEPUSH

recursive(3);

CALL STACK

recursive(2);

3

Page 56: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2

Page 57: Kitel algorithm 1

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);recursive(2);

2

recursive(1);

Page 58: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

1

recursive(1);

Page 59: Kitel algorithm 1

좌우대칭 산모양 - CODEPUSH

CALL STACKrecursive(3);recursive(2);

1

recursive(1);recursive(0);

Page 60: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

0

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

Page 61: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

0

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

Page 62: Kitel algorithm 1

좌우대칭 산모양 - CODEPOP

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

Page 63: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

1

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

Page 64: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

11

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

Page 65: Kitel algorithm 1

좌우대칭 산모양 - CODEPUSH

CALL STACK

11

recursive(0);

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

Page 66: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

10

recursive(0);

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

Page 67: Kitel algorithm 1

좌우대칭 산모양 - CODEPOP

CALL STACK

1

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

Page 68: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

11

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

Page 69: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

11

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

Page 70: Kitel algorithm 1

좌우대칭 산모양 - CODEPOP

CALL STACK

1

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

recursive(3);recursive(2);

Page 71: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

1

recursive(3);recursive(2);

2

Page 72: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

212

Page 73: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2

PUSH

12

recursive(1);

Page 74: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

Page 75: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

PUSH

recursive(0);

Page 76: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

120

recursive(0);

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

Page 77: Kitel algorithm 1

좌우대칭 산모양 - CODEPOP

CALL STACK

12

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

Page 78: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

112

recursive(1);

Page 79: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

1121

recursive(1);0 생략

Page 80: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

121

0 생략

POP

Page 81: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2121

Page 82: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);recursive(2);

2121

Page 83: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACKrecursive(3);

121

POP

Page 84: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

3121

Page 85: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213

Page 86: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213

recursive(2);

PUSH

Page 87: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213

recursive(2);

Page 88: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213

recursive(2);recursive(1);

PUSH

Page 89: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213

recursive(2);

0 생략recursive(1);

Page 90: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

112131

recursive(2);recursive(1);

0 생략

Page 91: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

112131

recursive(2);recursive(1);

Page 92: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

12131

recursive(2);

POP

Page 93: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

212131

recursive(2);

Page 94: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

2121312

recursive(2);

Page 95: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1121312

recursive(2);recursive(1);

0 생략

Page 96: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213121

recursive(2);recursive(1);

0 생략

Page 97: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

11213121

recursive(2);recursive(1);

Page 98: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1213121

recursive(2);

POP

Page 99: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213121

recursive(2);

Page 100: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

21213121

recursive(2);

Page 101: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

1213121

POP

Page 102: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213121

Page 103: Kitel algorithm 1

좌우대칭 산모양 - CODE

recursive(3);

CALL STACK

31213121

Page 104: Kitel algorithm 1

좌우대칭 산모양 - CODE

CALL STACK

1213121

POP

Page 105: Kitel algorithm 1

좌우대칭 산모양 - CODE

1213121

Page 106: Kitel algorithm 1

좌우대칭 산모양 - CODE

1213121

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

Page 107: Kitel algorithm 1

그냥 산 하나만 그려보자

Page 108: Kitel algorithm 1

그냥 산 하나만 그려보자