OF KITEL
BY KITEL
FOR KITEL
S/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 - CODE
int 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=re
verse
• //단어별 역순
http://59.23.113.171/30stair/esrever/esrever.php?pname=es
rever
• //지뢰
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(“%dn”,makeTen(5)); ==> 10
재귀는 이럴때 유용하다
• 좌우대칭 산모양
• 대칭!
• Back tracking. 무언가를 찾아야 할 때.
좌우대칭 산모양
• http://59.23.113.171/30stair/pTp/pTp.php?pname=p
Tp
• 재귀! 샌드위치를 잘 만들어 보세요.
• 싫으면 알아서 잘 해보세요. 김밥을 드시던가.
좌우대칭 산모양 -
CODE
N=3
CALL STACK
현재 위
치
다시 시
작
좌우대칭 산모양 -
CODE
PUSH
CALL STACK
recursive(3);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
좌우대칭 산모양 -
CODE
PUSH
recursive(3);
CALL STACK
recursive(2);
3
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
2
좌우대칭 산모양 -
CODE
PUSH
CALL STACK
recursive(3);
recursive(2);
2
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
1
recursive(1);
좌우대칭 산모양 -
CODE
PUSH
CALL STACK
recursive(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);
좌우대칭 산모양 -
CODE
POP
CALL STACK
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
1
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
1
1
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
PUSH
CALL STACK
1
1
recursive(0);
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
1
0
recursive(0);
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
POP
CALL STACK
1
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
1
1
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
1
1
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
POP
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 STACK
recursive(3);
recursive(2);
2
12
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
2
PUSH
12
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
1
12
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
1
12
recursive(1);
PUSH
recursive(0);
좌우대칭 산모양 -
CODE
CALL STACK
12
0
recursive(0);
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
POP
CALL STACK
12
recursive(3);
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
1
12
recursive(1);
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
1
121
recursive(1);
0 생략
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
121
0 생략
POP
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
2
121
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
recursive(2);
2
121
좌우대칭 산모양 -
CODE
CALL STACK
recursive(3);
121
POP
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
121
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
1213
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
1213
recursive(2);
PUSH
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
1213
recursive(2);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
1213
recursive(2);
recursive(1);
PUSH
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
1213
recursive(2);
0 생략
recursive(1);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
12131
recursive(2);
recursive(1);
0 생략
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
12131
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
12131
recursive(2);
POP
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
12131
recursive(2);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
121312
recursive(2);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
121312
recursive(2);
recursive(1);
0 생략
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
1213121
recursive(2);
recursive(1);
0 생략
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1
1213121
recursive(2);
recursive(1);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1213121
recursive(2);
POP
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
1213121
recursive(2);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
2
1213121
recursive(2);
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
1213121
POP
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
1213121
좌우대칭 산모양 -
CODE
recursive(3);
CALL STACK
3
1213121
좌우대칭 산모양 -
CODE
CALL STACK
1213121
POP
좌우대칭 산모양 -
CODE
1213121
좌우대칭 산모양 -
CODE
1213121
다 그렸다..
다 그렸다..
다 그렸다..
그냥 산 하나만 그려보
자
그냥 산 하나만 그려보
자

Kitel algorithm 1