본문 바로가기

CT

[BOJ] 20단계 재귀

1 27433 팩토리얼 2
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(factorial(n));
    }

    public static long factorial(long n) {
        if(n == 0 || n == 1) {
            return 1;
        } else {
            return n * factorial(n-1);
        }
    }
}

*0 <= n <= 20 : 반환 값으로 long 사용

 

2 10870 피보나치 수 5
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(fibonacci(n));
    }

    public static int fibonacci(int n) {
        if(n == 0) {
            return 0;
        } else if(n == 1) {
            return 1;
        } else {
            return fibonacci(n-1) + fibonacci(n-2);
        }
    }
}

*피보나치 수열: fn = fn-1 + fn-2

 

3 25501 재귀의 귀재

팰린드롬 찾기

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(reader.readLine());
        for(int i = 0; i < T; i++) {
            String str = reader.readLine();
            count = 0;
            System.out.println(isPalindrome(str) + " " + count);
        }
    }

    public static int recursion(String str, int l, int r) {
        count++;
        if(l >= r) {
            return 1;
        } else if(str.charAt(l) != str.charAt(r)) {
            return 0;
        } else {
            return recursion(str, l+1, r-1);
        }
    }

    public static int isPalindrome(String str) {
        return recursion(str, 0, str.length() - 1);
    }
}

 

4 24060 알고리즘 수업 - 병합 정렬 1

병합 정렬 도중 K번째로 저장되는 수 반환

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static int tmp[];
    static int K;
    static int count = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tokenizer = new StringTokenizer(reader.readLine());
        int A = Integer.parseInt(tokenizer.nextToken());
        K = Integer.parseInt(tokenizer.nextToken());
        tmp = new int[A];
        tokenizer = new StringTokenizer(reader.readLine());
        int[] arr = new int[A];
        for(int i = 0; i < A; i++) {
            arr[i] = Integer.parseInt(tokenizer.nextToken());
        }
        mergeSort(arr, 0, arr.length - 1);
        if(count < K) {
            System.out.println(-1);
        }
    }

    public static void mergeSort(int[] arr, int left, int right) {
        if(left < right) {
            int q = (left + right) / 2;
            mergeSort(arr, left, q);
            mergeSort(arr, q + 1, right);
            merge(arr, left, q, right);
        }
    }

    public static void merge(int[] arr, int left, int mid, int right) {
        int p = left;
        int q = mid + 1;
        int idx = p;
        while(p <= mid && q <= right) {
            if(arr[p] <= arr[q]) {
                tmp[idx++] = arr[p++];
            } else {
                tmp[idx++] = arr[q++];
            }
        }
        while(p <= mid) {
            tmp[idx++] = arr[p++];
        }
        while(q <= right) {
            tmp[idx++] = arr[q++];
        }

        for(int i = left; i <= right; i++) {
            arr[i] = tmp[i];
            if(++count == K) {
                System.out.println(arr[i]);
            }
        }
    }
}

 

5 4779 칸토어 집합
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String input;
        while((input = reader.readLine()) != null) {
            int N = Integer.parseInt(input);
            int pow = (int)Math.pow(3, N);
            char[] arr = new char[pow];
            Arrays.fill(arr, '-');
            cantorSet(arr, 0, arr.length);
            System.out.println(arr);
        }

    }

    public static void cantorSet(char[] arr, int start, int size) {
        if(size < 3) {
            return;
        }
        int m = size / 3;
        cantorSet(arr, start, m);
        cantorSet(arr, start + 2 * m, m);
        for(int i = start + m; i < start + 2 * m; i++) {
            arr[i] = ' ';
        }
    }
}

 

6 2447 별 찍기 - 10
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    private static char[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        arr = new char[N][N];
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                arr[i][j] = '*';
            }
        }

        printStar(0, 0, N);

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < arr.length; i++) {
            sb.append(arr[i]).append("\n");
        }
        System.out.print(sb);
    }

    /**
     * 크기 N의 정사각형의 가운데 (N/3)×(N/3) 정사각형을 공백으로 채우기
     * @param x,y 정사각형 시작점의 좌표
     * @param size 정사각형 변의 길이
     */
    public static void printStar(int x, int y, int size) {
        if(size < 3) {
            return;
        }
        int newSize = size / 3;
        printStar(x, y, newSize);
        printStar(x + newSize, y, newSize);
        printStar(x + newSize * 2, y, newSize);
        printStar(x, y + newSize, newSize);
        printStar(x, y + newSize * 2, newSize);
        printStar(x + newSize * 2, y + newSize, newSize);
        printStar(x + newSize, y + newSize * 2, newSize);
        printStar(x + newSize * 2, y + newSize * 2, newSize);
        for(int i = x + newSize; i < x + newSize * 2; i++) {
            for(int j = y + newSize; j < y + newSize * 2; j++) {
                arr[i][j] = ' ';
            }
        }
    }
}

 

7 11729 하노이 탑 이동 순서
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    private static final StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(reader.readLine());
        //count: 2^n - 1
        sb.append((1 << N) - 1).append("\n");
        towerOfHanoi(N, 1 ,2, 3);
        System.out.print(sb);
    }

    public static void towerOfHanoi(int n, int from, int by, int to) {
        if(n == 1) {
            sb.append(from + " " + to).append("\n");
            return;
        }
        towerOfHanoi(n-1, from, to, by);
        sb.append(from + " " + to).append("\n");
        towerOfHanoi(n-1, by, from, to);
    }
}

'CT' 카테고리의 다른 글

[BOJ] 22단계 동적 계획법 1  (0) 2023.04.20
[BOJ] 21단계 백트래킹  (0) 2023.04.18
[BOJ] 19단계 큐, 덱  (0) 2023.04.14
[BOJ] 18단계 스택  (0) 2023.04.13
[BOJ] 17단계 심화2  (0) 2023.04.13