본문 바로가기
알고리즘 공부/백준

[JAVA 45일차 / 하루 3문제] 10870번, 25501번, 24060번

by maverick11471 2025. 4. 4.

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번째 저장된 수 확인
        }
    }
}
  • 문제로 나온 다른 언어를 해석하는게 어렵다.