8~9. 사용자 정의 함수(최대공약수/ k번째 약수/ 마지막문자 뽑기/ 최대값) [프로젝트명 : Tutorial8, 9]
(Tutorial8)
사용자 정의 함수는 정해진 특정한 기능을 수행하는 모듈(작은 기능을 수행하는 장치)을 의미한다. 함수를 활용하여 하나의 문제를 잘게 분해할 수 있다.
메인함수에서 모든 알고리즘을 처리하면 매우 비효율적이다. 사용자 정의 함수를 통해 각각의 모듈로서 쉽게 수정되고 보완되는 장점이 있다.
1. 사용자 정의 함수를 만들어보자. ( Main 클래스 안 <-> Main함수 밖)
(1) public static 이후에 함수는 [반환형]을 먼저 써주어야한다. 그 다음 [함수명], [매개변수] 순이다.
- 매개변수는 함수가 처리할 값을 사전적으로 주어주는 것이다.
// 반환형, 함수명, 매개변수
public static int function(int a, int b, int c) {
return 0;
}
2. 3개의 수 최대 공약수를 찾는 프로그램을 만들어보자.
[ 3개의 수 중 가장 작은 수 찾기 -> 찾은 가장 작은 수를 1씩 줄여가면서(줄여나가다가 나타나면 종료되니 최대가 됨)
-> 3개 모두 나눈 나머지가 0인 공약수 찾고 바로 반환하여 함수 종료시키기]
(1) 최대공약수를 찾을 때는 먼저 3개의 값 중 가장 작은 수를 먼저 찾아내야한다.
- if a와 b를 먼저 비교한 뒤 -> b가 더 작은 경우, if b와c를 비교해서 둘 중 더 작은 값을 min에 넣어준다.
-> a가 더 작은 경우, if a와 c를 비교해서 더 작은 값을 min에 넣어준다.
int min;
if(a>b) {
if(b >c ) {
min =c;
} else {
min = b;
}
}else {
if(a>c) {
min = c;
}else {
min = a;
}
}
(2) 가장 작은 수를 for문을 통해, 1이 될 때까지 줄여주면서 그 안에 포함된 모든 수(약수 포함)를 돌면서,
if문을 통해 [ 3개의 수를 나눈 나머지가 모두 0이 되는, 공통약수]들을 찾아준다.
만약 i가 반환되면 바로 [return i;를 통해 값을 반환하면서, 함수를 바로 종료] 시킨다. 그러면 더 최대공약수가 나오자마자 바로 함수가 종료되므로, 2번째 큰 공약수는 무시된다.
for(int i = min; i>0; i--) {
if( a%i==0 && b%i==0 && c%i==0) {
return i;
}
}
(3) 만약 최대공약수가 없는 경우에 -1값을 반환하도록 return -1;을 함수 맨 마지막에 준다.
return -1;
(4) 메인함수에서 사용자정의함수 function()을 사용하여, 문자를 출력해주자.
public static void main(String[] args) {
System.out.println("(400, 300, 750);의 최대공약수 : " + function(400, 300, 750) );
}
(5) 출력값
(400, 300, 750);의 최대공약수 : 50
(Tutorial9)
3. 약수중 K번째로 작은 수를 찾는 프로그램을 작성해보자.
[ 1부터 숫자까지 증가시키면서, 숫자로 나누어 떨어지는 약수가 k번 발견될 때, 반환한다. 이 때 몇번인지는 k--;로 센다]
(1) 매개변수는 2개를 받자, 약수를 찾을 수인 number와 k번째를 의미하는 k이다.
(2) 1부터 약수를 찾을 숫자 number까지 1씩 증가시키면서, 약수를 의미하는 [number % i ==0] 을 찾을 때마다, k를 1씩 뺀다.
그러다가 k가 0이 되는 순간에 그 약수 i를 return시킨다.
ex> 만약 10번째 약수를 찾기위해, k에 10을 집어 넣었다면, 처음 찾았을 때는 9, 2번째찾으면 8, ... , 10번째 찾으면 0이 된다.
이 때, 약수를 찾은 횟수가 k만큼 돌아서 0이 되는 순간에 return시켜서 해당 약수를 반환시키는 것이다.
(3) for문을 통해 1부터 숫자까지 돌았는데, k번째 약수가 안나타난다면, for문을 빠져나와서 -1을 return하도록 한다.
public static int function(int number, int k) {
for(int i =1; i<=number; i++) {
if(number % i ==0 ) {
k--;
if(k==0) {
return i;
}
}
}
return -1;
}
(4) 메인매쏘드에서 함수를 사용해보자. 3050의 10번째 약수를 받아와 result에 넣어주고, 출력하자.
public static void main(String[] args) {
int result = function(3050, 10);
if(result == -1) {
System.out.println("3050의 10번째 약수는 없습니다.");
}else {
System.out.println("3050의 10번째 약수는 "+result+"입니다");
}
}
(5) 출력값
3050의 10번째 약수는 610입니다
4. 문자열의 마지막 단어를 반환하는 함수를 작성해보자.
(1) 문자열 하나를 입력 받아, 문자열의 단어 하나를 반환하는 public static char function(String input) {} 매쏘드를 만들자.
(2) input.charAt()을 이용해서, 문자열 중 하나의 단어만 가져올 수 있다. 이때, 파라미터에 문자열변수.length() -1 을 넣으면 가장 마지막 단어의 index를 의미하게 된다.
(charAt()의 index는 0부터 세고, length는 1부터 세니까.. length-1하면 마지막 index값을 가져올 수 있다)
public static char function(String input) {
return input.charAt(input.length()-1);
}
(3) 매인매쏘드에서 사용해본다.
public static void main(String[] args) {
System.out.println("Hellow World의 마지막 단어는 "+function("Hello World") +" 입니다.");
}
(4) 출력값
Hellow World의 마지막 단어는 d 입니다.
5. max()를 활용해서 최대값을 저장하는 함수를 작성해보자.
[ 2개 중 최대값은 삼항연사자로 만든 함수를 만들고, 3개 중 최대값은 2개 최대값 함수를 이용해서,
최대값을 뽑아 낸 것을 담아 놓고, 그것을 다시 2개 최대값 함수로 비교하자]
(1) 2개의 정수를 받아 삼항 연산자를 이용해서 큰놈을 return하자.
public static int max(int a, int b) {
return (a>b)? a:b;
}
(2) 3개의 정수를 받아, (1)에서 만든 매쏘드를 활용해서 최대값을 뽑아내자.
public static int function(int a, int b, int c) {
int result = max(a,b);
result = max(result, c);
return result;
}
(3) 메인매쏘드에서 출력해보자.
public static void main(String[] args) {
System.out.println("(345, 567, 789)중 가장 큰 값 : "+function(345,567,789));
}
'Java > 기초 튜토리얼' 카테고리의 다른 글
12. 배열(Array) (입력받은 배열의 최대값/ 100개의 랜덤 정수의 평균) [ Tutorial12 ] (0) | 2018.02.19 |
---|---|
10~11. 반복함수와 재귀함수(팩토리얼 / 피보나치 수열) ) [프로젝트명 : Tutorial10, 11] (0) | 2018.02.19 |
7. 기본 입출력 / 파일 입출력 (Scanner/file 입출력) [프로젝트명 : Tutorial7] (0) | 2018.02.18 |
5~6. 조건문 & 반복문(contains/점수조건/equals/합/삼각형/원 만들기) [프로젝트명 : Tutorial5, 6] (0) | 2018.02.08 |
4. 연산자(operator) (증감/삼항연산/거듭제곱pow()) [프로젝트명 : Tutorial4] (0) | 2018.01.28 |