함수란? 원하는 목적( ex. 반복 )을 하나의 도구처럼 사용할 수 있도록 해주는 도구
public static void print5Stars() {
코드 작성
}
- static : 정적함수의 표기, 자바의 main함수가 static으로 정의되어 있기 때문에 꼭 함수 선언시 static을 적어줘야 함
- 반환타입 : 반환값이 없는경우 void로 표기
- 함수이름 : camel case에 따라 이름을 표기
1. 값을 반환하지 않는 함수
반복작업을 수행하는 함수
10개의 별찍는 것을 5번 반복하기 문제
: 출력작업을 함수print10Stars()로 정의하여 간단하게 반복적인 처리가 가능하다.
public class Main {
public static void print10Stars() {
for(int i = 0; i < 10; i++)
System.out.print("*");
System.out.println();
}
public static void main(String[] args) {
for(int i = 0; i < 5; i++)
print10Stars();
}
}
인자가 있는 함수
: 가변적인 값이 주어졌을 때에 대한 인자를 통해 적절한 처리가 가능하다.
연속하여 별 5개를 출력하는 것을 n번 반복하는 문제
: 인자n을 통해 요구되는 임의의 반복횟수만큼을 처리한다.
import java.util.Scanner;
public class Main {
public static void printNLines(int n) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < 5; j++)
System.out.print("*");
System.out.println();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int rowNum = sc.nextInt();
printNLines(rowNum);
}
}
인자가 여러개인 함수
최대공약수 구하기
: n, m이 주어졌을 때 이를 인자로 받아 최대공약수를 구하는 함수gcd를 작성하여 해결하였다.
유클리드 호제법(Euclidean algorithm)을 통해 최대공약수를 구할 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(gcd(a, b));
}
public static int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
}
2. 값을 반환하는 함수
반환타입을 반드시 표기하고 그에 맞는 값을 함수 마지막부분에 return으로 반환한다.
Top-down구조를 가진 함수
: 조건이 여러개 주어졌을때 차례로 검사를 수행하는 함수를 정의한다.
2자리 숫자 n이 주어졌을 때, n이 짝수이면서 각 자리 숫자의 합이 5의 배수인지 확인하기
import java.util.Scanner;
public class Main {
public static boolean isMagicNumber(int n) {
return n % 2 == 0 && (n / 10 + (n % 10)) % 5 == 0;
}
public static void main(String[] args) {
// 변수 선언 및 입력:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(isMagicNumber(n))
System.out.println("Yes");
else
System.out.println("No");
}
}
또다른 함수를 호출하는 함수
: 문제가 복잡하다면, 크게 생각하여 이미 해당 함수가 주어져있다고 가정하고 코드를 작성한 뒤, 이후에 실제 필요했던 함수를 작성해내는 식으로 진행한다.
함수를 이용한 369 게임
a이상 b이하 수들 중 3, 6, 9 중에 하나가 들어가 있거나 그 숫자 자체가 3의 배수인 숫자의 개수를 세는 프로그램을 작성해보세요.
: 각 자리 숫자가 3,6,9를 포함하는지 판단하는 함수 contains369()와 3의배수인지 판단하는 함수is369number() 2개의 함수를 정의하고 메인에서 두개를 모두 호출하여 두 단계에 걸쳐서 판별한다.
import java.util.Scanner;
public class Main {
public static boolean contains369(int n) {
while(n > 0) {
if(n % 10 == 3 || n % 10 == 6 || n % 10 == 9)
return true;
n /= 10;
}
return false;
}
public static boolean is369Number(int n) {
return contains369(n) || (n % 3 == 0);
}
public static void main(String[] args) {
// 변수 선언 및 입력:
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int cnt = 0;
for(int i = a; i <= b; i++)
if(is369Number(i))
cnt++;
System.out.println(cnt);
}
}
3. Call by value, Call by reference
call by value : 자바에서 함수에 인자를 넘길 때 기본적으로 값을 복사하여 넘겨주는 방식 -> 함수의 연산이 함수 블록 내에서만 유효하게 된다.
primitive type과 reference type에 해당하는 값을 저장하는 방법의 차이로인해 call by value로 동작함에도 call by reference의 효과를 가질 수 있다.
public class Main {
public static void modify(int[] arr2) { // arr2는 arr와 관련이 없다.
arr2[0] = 10;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
modify(arr.clone()); // 새로운 배열을 만들어 넘기기
for(int i = 0; i < 4; i++)
System.out.print(arr[i] + " ");
}
}
>> 1 2 3 4 # 값에 변화가 없다
reference type인 리스트를 인자로 넘기는 경우 값이 변질될 수 있는 위험 side effect가 존재한다. 이를 막기위해서는 .clone()을 이용해 동일한 리스트를 복사하여 새롭게 넘겨줄 수 있다.
public class Main {
public static void modify(String s) {
s += "apple";
}
public static void main(String[] args) {
String str = "banana";
modify(str);
System.out.print(str);
}
}
반면 String은 reference type임에도 immutable하다. 즉, 값을 바꿀 수 없는 type이다.
public class Main {
public static String modify(String s) {
s += "apple";
return s;
}
public static void main(String[] args) {
String str = "banana";
str = modify(str);
System.out.print(str);
}
}
>> bananaapple
함수내의 문자열 자체를 반환하여 처리한다.
2개 이상의 알파벳
소문자 알파벳으로만 이루어진 문자열 A가 주어졌을 때, 문자열 A를 이루고 있는 서로 다른 알파벳의 수가 2개 이상인지를 판단하는 프로그램을 작성해보세요. 단, 함수를 이용하여 문제를 해결해주세요.
: 문자열내 원소 문자의 중복, 횟수 등을 판단하는 경우 주로 Set을 사용한다. 중복을 허용하지 않는 리스트인 Set에 모든 문자를 저장한 뒤 갯수를 확인할 수 있다.
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static boolean check(String str) {
Set<Character> characters = new HashSet<>();
for (char c : str.toCharArray()) {
characters.add(c);
}
return characters.size() >= 2;
}
public static void main(String[] args) {
// 여기에 코드를 작성해주세요.
Scanner sc = new Scanner(System.in);
String str = sc.next();
if(check(str)){
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
'algorithm' 카테고리의 다른 글
[ 코드트리 조별과제 ] 프로그래밍 연습 - Chapter6. 완전탐색(1) (0) | 2024.08.24 |
---|---|
[ 코드트리 조별과제 ] 프로그래밍 연습 - Chapter5. 시뮬레이션(2) (0) | 2024.08.15 |
[ 코드트리 조별과제 ] 프로그래밍 연습 - Chapter4. 시뮬레이션(1) (0) | 2024.08.11 |
[ 코드트리 조별과제 ] 프로그래밍 연습 - Chapter3. 정렬 (0) | 2024.07.28 |
[ 코드트리 조별과제 ] 프로그래밍 연습 - Chapter2. 재귀함수 (0) | 2024.07.28 |