kitel algorithm 1
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
다 그렸다 ..다 그렸다 ..다 그렸다 ..
그냥 산 하나만 그려보자
그냥 산 하나만 그려보자