-
Day 2 함수와 배열코딩 테스트 2024. 12. 20. 10:48
1. 함수(메소드)
1-1. 함수란?
* 함수(메소드)는 특정 작업을 수행하는 코드 블록이다.
- 입력: 필요한 값을 전달받아 작업 수행
- 출력: 결과를 반환하거나 작업만 수행
- 반복적인 작업을 하나의 함수로 정의하면 코드를 효율적으로 관리할 수 있음.
1-2. 함수의 구조
[접근제어자] [static 여부] 반환형 함수명(매개변수) { // 함수 내부의 작업 return 반환값; // 반환형이 void인 경우 생략 가능 }
(예제)
public static int addNumbers(int a, int b) { return a + b; }
요소 설명 접근제어자 public, private 등 접근 범위를 설정 static 여부 클래스 메소드(static) 여부 반환형 함수가 반환하는 값의 타입(int, void 등) 함수명 함수 이름 (소문자로 시작) 매개변수 함수가 입력받는 값 1-3. 함수 호출과 실행
- 함수는 호출해야 실행된다. 호출 방법은 함수명(매개변수) 이다.
(예제)
public class Main { public static void main(String[] args) { int sum = addNumbers(5, 10); // 함수 호출 System.out.println("Sum: " + sum); } public static int addNumbers(int a, int b) { return a + b; } }
(출력)
Sum: 15
1-4. 함수의 반환형과 매개변수
(1) 반환형이 있는 함수
public static int square(int num) { return num * num; }
(2) 반환형이 없는 함수 (void)
public static void greet(String name) { System.out.println("Hello, " + name); }
(3) 매개변수가 없는 함수
public static void displayMessage() { System.out.println("Welcome to Java!"); }
2. 배열 (Array)
2-1. 배열이란?
- 배열은 동일한 데이터 타입의 값을 연속적으로 저장하는 자료구조이다.
- 인덱스를 사용해 각 값을 참조하며, 인덱스는 0부터 시작한다.
- 자바 배열은 고정 크기이다.
2-2. 배열 선언과 초기화
(1) 배열 선언
int[] arr = new int[5]; // 크기 5의 정수 배열 선언
(2) 배열 초기화
int[] arr = {10, 20, 30, 40, 50}; // 선언과 동시에 값 초기화
(3) 배열 요소 접근
System.out.println(arr[0]); // 첫 번째 요소 출력 arr[1] = 25; // 두 번째 요소 변경
2-3. 배열의 길이
- 배열의 길이는 .length 속성을 사용해 확인할 수 있습니다.
int[] arr = {10, 20, 30}; System.out.println("배열의 길이: " + arr.length); // 출력: 3
2-4. 배열 순회
(1) for 문 사용
for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }
(2) 향상된 for 문 사용
for (int num : arr) { System.out.println(num); }
3. 함수와 배열의 조합
3-1. 배열을 함수의 매개변수로 전달
- 배열은 참조형 데이터 타입으로 함수에 전달된다.
public static void printArray(int[] arr) { for (int num : arr) { System.out.print(num + " "); } } public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5}; printArray(numbers); // 출력: 1 2 3 4 5 }
3-2. 배열을 반환하는 함수
- 함수가 배열을 반환할 수도 있다.
public static int[] createArray() { return new int[]{10, 20, 30}; } public static void main(String[] args) { int[] arr = createArray(); for (int num : arr) { System.out.print(num + " "); // 출력: 10 20 30 } }
4. 실습 문제
* 문제 1: 배열의 합 구하기
- 설명: 사용자로부터 배열의 크기와 요소를 입력받아 배열의 합을 구하세요.
(입력 예시)
5 1 2 3 4 5
(출력 예시)
배열의 합: 15
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } int sum = 0; for (int num : arr) { sum += num; } System.out.println("배열의 합: " + sum); } }
* 문제 2: 최댓값과 최소값 찾기
- 설명: 사용자로부터 배열을 입력받아 최대값과 최소값을 출력하세요.
(입력 예시)
4 10 20 5 7
(출력 예시)
최대값: 20 최소값: 5
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } int max = arr[0]; int min = arr[0]; for (int num : arr) { if (num > max) max = num; if (num < min) min = num; } System.out.println("최대값: " + max); System.out.println("최소값: " + min); } }
* 문제 3: 배열 역순 출력
- 설명: 배열을 입력 받아 역순으로 출력하세요.
(입력 예시)
5 10 20 30 40 50
(출력 예시)
50 40 30 20 10
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.println("역순 출력:"); for (int i = n - 1; i >= 0; i--) { System.out.print(arr[i] + " "); } } }
* 문제 4: 배열 평균 구하기
- 설명: 사용자로부터 정수 배열을 입력받아 평균을 계산하는 프로그램을 작성하세요.
소수점 두 자리까지 출력하세요.
(입력 예시)
5 10 20 30 40 50
(출력 예시)
평균: 30.00
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } double sum = 0; for (int num : arr) { sum += num; } double average = sum / n; System.out.printf("평균: %.2f\n", average); } }
* 문제 5: 배열 내 특정 값 개수 세기
- 설명: 사용자로부터 정수 배열과 특정 값을 입력받아 배열 내에서 해당 값이 몇 번 등장하는지 출력하세요.
(입력 예시)
5 1 2 2 3 4 2
(출력 예시)
2는 2번 등장합니다.
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.print("찾을 값 입력: "); int target = sc.nextInt(); int count = 0; for (int num : arr) { if (num == target) { count++; } } System.out.println(target + "는 " + count + "번 등장합니다."); } }
* 문제 6: 배열 정렬 후 출력
- 설명: 배열을 입력받아 오름차순으로 정렬한 후 출력하세요.
(입력 예시)
5 4 1 3 5 2
(출력 예시)
1 2 3 4 5
(코드)
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } Arrays.sort(arr); System.out.println("정렬된 배열:"); for (int num : arr) { System.out.print(num + " "); } } }
* Arrays.sort(arr);
: 자바에서 제공하는 배열 정렬 기능.
배열을 오름차순으로 정렬해주는 메소드.
* 문제 7: 배열 중복 제거
- 설명: 배열을 입력받아 중복된 값을 제거하고 출력하세요.
(입력 예시)
5 1 2 2 3 4
(출력 예시)
1 2 3 4
(코드)
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } Set<Integer> set = new HashSet<>(); for (int num : arr) { set.add(num); } System.out.println("중복 제거 후 배열:"); for (int num : set) { System.out.print(num + " "); } } }
* Set<Integer> set = new HashSet<>();
: Set 인터페이스와 이를 구현한 HashSet 클래스를 사용해 Integer 값(정수 타입)을 저장할 수 있는
"중복 없는 집합(set)" 을 생성하는 선언
- Set: 중복을 허용하지 않는 데이터 컬렉션. 데이터 순서와 관계없이 고유한 값만 저장할 수 있는 자료구조 정의.
중복 자동 제거
Set<Integer> set = new HashSet<>(); set.add(1); set.add(2); set.add(2); // 중복 값 System.out.println(set); // 출력: [1, 2]
.
- HashSet: Set 인터페이스의 구현체로, 내부적으로 HashMap을 사용해 데이터 저장.
데이터 중복 자동 제거, 데이터 저장 순서 보장 안함.
* 문제 8: 두 배열의 합
- 설명: 두 개의 배열을 입력받아, 같은 인덱스에 있는 값의 합을 새로운 배열로 출력하세요.
(입력 예시)
3 1 2 3 4 5 6
(출력 예시)
5 7 9
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr1 = new int[n]; int[] arr2 = new int[n]; System.out.println("첫 번째 배열 입력:"); for (int i = 0; i < n; i++) { arr1[i] = sc.nextInt(); } System.out.println("두 번째 배열 입력:"); for (int i = 0; i < n; i++) { arr2[i] = sc.nextInt(); } int[] result = new int[n]; for (int i = 0; i < n; i++) { result[i] = arr1[i] + arr2[i]; } System.out.println("두 배열의 합:"); for (int num : result) { System.out.print(num + " "); } } }
* 문제 9: 배열 회전
- 설명: 배열을 오른쪽으로 한 칸 회전시키세요.
(입력 예시)
5 1 2 3 4 5
(출력 예시)
5 1 2 3 4
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } int last = arr[n - 1]; // 1단계: 배열의 마지막 요소 저장, arr[4] = 5 for (int i = n - 1; i > 0; i--) { // 2단계: 배열 요소를 뒤로 한 칸씩 이동 arr[i] = arr[i - 1]; } arr[0] = last; // 3단계: 마지막 요소를 첫 번째 위치로 이동, arr[0] = 5 System.out.println("회전된 배열:"); for (int num : arr) { System.out.print(num + " "); } } }
i = 4: arr[4] = arr[3] → {1, 2, 3, 4, 4}
i = 3: arr[3] = arr[2] → {1, 2, 3, 3, 4}
i = 2: arr[2] = arr[1] → {1, 2, 2, 3, 4}
i = 1: arr[1] = arr[0] → {1, 1, 2, 3, 4}* 문제 10: 배열의 짝수와 홀수 구분
- 설명: 배열에서 짝수와 홀수를 구분하여 각각 출력하세요.
(입력 예시)
5 1 2 3 4 5
(출력 예시)
짝수: 2 4 홀수: 1 3 5
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.print("짝수: "); for (int num : arr) { if (num % 2 == 0) { System.out.print(num + " "); } } System.out.print("\n홀수: "); for (int num : arr) { if (num % 2 != 0) { System.out.print(num + " "); } } } }
* 배열 11: 배열에서 가장 가까운 값 찾기
- 설명: 사용자로부터 배열과 기준값을 입력받아 배열에서 기준값과 가장 가까운 값을 출력하세요.
(입력 예시)
5 10 15 20 25 30 18
(출력 예시)
20
(코드)
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("배열 크기 입력: "); int n = sc.nextInt(); int[] arr = new int[n]; System.out.println("배열 입력:"); for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.print("기준값 입력: "); int target = sc.nextInt(); int closest = arr[0]; // 1단계: 가장 가까운 값을 첫 번째 요소로 초기화 int minDiff = Math.abs(target - arr[0]); // 1단계: 최소 차이를 첫 번째 요소와의 차이로 초기화 for (int num : arr) { // 2단계: 배열의 모든 요소를 순회하며 차이를 비교 int diff = Math.abs(target - num); // 현재 요소와 target의 차이를 계산 if (diff < minDiff) { // 현재 차이가 최소 차이보다 작으면 minDiff = diff; // 최소 차이를 갱신 closest = num; // 가장 가까운 값을 갱신 } } System.out.println("가장 가까운 값: " + closest); } }
* Math.abs
: 숫자의 "절댓값"을 반환한다.
'코딩 테스트' 카테고리의 다른 글
Day 3 문자열 처리와 2차원 배열 강의 (0) 2024.12.22 Day 1 자바 기본 문법 학습 (1) 2024.12.19