1. 10870번 피보나치 수 5
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 입력값 읽기
System.out.println(fibonacci(n)); // 결과 출력
}
public static int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fibonacci(n - 1) + fibonacci(n - 2); // 재귀 호출
}
}
- 재귀함수를 기억해야 한다.
2. 25501번 재귀의 귀재
import java.io.*;
public class Main {
static int count; // 재귀 호출 횟수를 저장하는 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine()); // 테스트 케이스 개수
StringBuilder sb = new StringBuilder();
for (int i = 0; i < T; i++) {
count = 0; // 호출 횟수 초기화
String str = br.readLine();
sb.append(isPalindrome(str)).append(" ").append(count).append("\n");
}
System.out.print(sb);
}
public static int isPalindrome(String s) {
return recursion(s, 0, s.length() - 1);
}
public static int recursion(String s, int l, int r) {
count++; // 재귀 호출될 때마다 증가
if (l >= r) return 1; // 기저 조건: 중앙까지 도달하면 회문
else if (s.charAt(l) != s.charAt(r)) return 0; // 앞뒤 문자가 다르면 회문이 아님
else return recursion(s, l + 1, r - 1); // 좌우 한 칸씩 이동하며 재귀 호출
}
}
3. 24060번 알고리즘 수업 - 병합 정렬 1
import java.io.*;
import java.util.*;
public class Main {
static int[] A, tmp; // 원본 배열, 임시 배열
static int K, count, result = -1; // K번째 저장 수 추적
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 배열 크기
K = Integer.parseInt(st.nextToken()); // K번째 저장된 수
A = new int[N]; // 원본 배열
tmp = new int[N]; // 임시 배열 (병합할 때 사용)
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken()); // 배열 입력
}
mergeSort(0, N - 1); // 병합 정렬 실행
System.out.println(result); // K번째 저장된 수 출력 (없으면 -1)
}
static void mergeSort(int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(left, mid); // 왼쪽 정렬
mergeSort(mid + 1, right); // 오른쪽 정렬
merge(left, mid, right); // 병합
}
}
static void merge(int left, int mid, int right) {
int i = left, j = mid + 1, t = left;
while (i <= mid && j <= right) {
if (A[i] <= A[j]) {
tmp[t++] = A[i++];
} else {
tmp[t++] = A[j++];
}
}
while (i <= mid) tmp[t++] = A[i++];
while (j <= right) tmp[t++] = A[j++];
for (int idx = left; idx <= right; idx++) {
A[idx] = tmp[idx];
count++; // 저장될 때마다 count 증가
if (count == K) result = A[idx]; // K번째 저장된 수 확인
}
}
}
- 문제로 나온 다른 언어를 해석하는게 어렵다.
'알고리즘 공부 > 백준' 카테고리의 다른 글
[JAVA 47일차 / 하루 3문제] 2580번, 14888번, 14889번 (0) | 2025.04.09 |
---|---|
[JAVA 46일차 / 하루 3문제] 15651번, 15652번, 9663번 (0) | 2025.04.08 |
[JAVA 44일차 / 하루 3문제] 2108번, 20920번, 27433번 (0) | 2025.04.03 |
[JAVA 43일차 / 하루 3문제] 1037번, 25192번, 26069번 (0) | 2025.04.02 |
[JAVA 42일차 / 하루 3문제] 28279번, 2346번, 24511번 (0) | 2025.03.28 |