백준 문제 풀이

4344번, 11729번, 10870번, 2447번, 10872번, 16395번

qazwsxedc9 2022. 7. 10. 20:16

4344번 

import java.util.Scanner;

public class Practice {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        for (int j = 0; j < count; j++) {
            int num = sc.nextInt();
            int[] scores = new int[num];
            int total=0;;
            for (int i = 0; i < num; i++) {
                scores[i] = sc.nextInt();
                total += scores[i];
            }
            double avg = total / (double) num;
            int over = 0; // 평균이 넘는 학생수
            for (int k = 0; k < num; k++) {
                if (scores[k] > avg) over+=1;
            }
            System.out.println(String.format("%.3f%%",((double)over/num)*100));
        }
    }
}

11719번 (하노이의 탑)


1. (n-1) 개의 원반을 1번에서 2번으로 옮김

2. 맨 밑의 가장 큰 원반을 1번에서 3번으로 옮김

3. (n-1) 개의 원반을 2번에서 3번으로 옮김

import java.util.Scanner;

public class Practice {
    static int count = 0;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        hanoi(num,1,2,3);
        System.out.println(count);
        System.out.println(sb.toString());
    }

    public static void hanoi (int num, int start, int middle, int end) {
        count++;
        if(num == 1){
            sb.append(start + " " + end + "\n");
            return;
        }
        // (num-1) 개의 원반을 start 에서 middle 로 옮김
        hanoi(num-1, start,end,middle);
        // 맨 밑에 있는 가장 큰 원반 1개를 start 에서 end 로 옮김
        sb.append(start + " " + end + "\n");
        // (num-1) 개의 원반을 middle 에서 end 로 옮김
        hanoi(num-1, middle,start,end);
    }
}

10870번 (피보나치 수열)

import java.util.Scanner;

public class Practice {
    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) {
        int index1 = 0;
        int index2 = 1;
        if(n==0) {
            return index1;
        } else if(n==1) {
            return index1+index2;
        } else {
            return fibonacci(n-2)+fibonacci(n-1);
        }
    }
}

2447번 (재귀를 이용한 별 찍기) - 어려움 

반복적으로 쪼개는 방법을 사용한다 

n = 27 일 때 출력

 

n=27 일 경우 한 블록의 사이즈는 9 (9블럭)

n=9 일 경우 한 블록의 사이즈는 3 (9블럭)

n=3 일 경우 한 블록의 사이즈는 1 (9블럭)

별 출력이 4 번 이루어지면 그다음은 반드시 공백이 된다 > count는 별 출력 누적 수를 의미

count == 5가 되었을 때 공백이 발생

 

더이상 블럭을 쪼갤 수 없을 때 (n=1) 별 출력

공백 구간은 공백 문자로 채우고 공백이 아닌 구간을 다시 재귀 호출을 하는 것이다.

import java.util.Scanner;

public class Practice {
    static char[][] arr;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        arr = new char[n][n];
        star(0, 0, n,false);

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

    public static void star(int x, int y, int n, boolean blank) {

        if (blank) {
            for (int i = x; i < x + n; i++) {
                for (int j = y; j < y + n; j++) {
                    arr[i][j] = ' ';
                }
            }
            return;
        }

        if (n == 1) {
            arr[x][y] = '*';
            return;
        }

        int size = n / 3; //쪼개기
        int count = 0;

        for (int i = x; i < x + n; i += size) {
            for (int j = y; j < y + n; j += size) {
                count++;
                if(count==5) {
                    star(i,j,size,true);
                } else {
                    star(i,j,size,false);
                }
            }
        }
    }
}

10872번 (팩토리얼)

주의해야 할 것 > 0! = 1, 1! = 1

import java.util.Scanner;

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

    public static int factorial (int num) {
        if(num<=1) {
            return 1;
        } else {
            return num * factorial(num-1);
        }
    }
}

16396번

정수 n과 k가 주어졌을 때 파스칼의 삼각형에 있는 n번째 행에서 k번째 수를 출력하는 프로그램

주의해야 할 것 >  이차원 배열의 인덱스 조심할 것, 실제로 n번째 행은 인덱스로는 n-1 이다

import java.util.Scanner;

public class Practice {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int k = sc.nextInt();
        int [][] pascal = new int[num][];
        for(int i = 0; i<num; i++) {
            pascal[i] = new int [i+1]; // 가변 배열의 열의 개수를 설정
            for(int j = 0; j<pascal[i].length; j++) {
                if(j==0 || i==j) {
                    pascal[i][j] = 1;
                } else {
                    pascal[i][j] = pascal[i-1][j-1]+pascal[i-1][j];
                }
            }
        }
        System.out.println(pascal[num-1][k-1]);
    }
}

15489번

파스칼의 삼각형은 밑으로 더 있으나 편의상 생략

 

첫째 줄에 R번째 줄, C번째 수를 위 꼭짓점으로 하는 한 변이 포함하는 수의 개수가 W인 정삼각형과 그 내부에 있는 수들의 합을 출력

 

첫 번째 그림은 r= 3, c= 1, w= 4 / 두 번째 그림은 r=3 c=2 w=4  

 

합 구하려는 이중 for문 작성하는게 어려웠다ㅠ 범위 설정으로 뻘짓 길게 했음

import java.util.Scanner;

public class Practice {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int r = sc.nextInt();
        int c = sc.nextInt();
        int w = sc.nextInt();
        int [][] pascal = new int[29][];
        for(int i = 0; i<29; i++) {
            pascal[i] = new int [i+1]; // 가변 배열의 열의 개수를 설정
            for(int j = 0; j<pascal[i].length; j++) {
                if(j==0 || i==j) {
                    pascal[i][j] = 1;
                } else {
                    pascal[i][j] = pascal[i-1][j-1]+pascal[i-1][j];
                }
            }
        }
        int sum = 0;
        for(int i = 0; i<w; i++){
            for(int j = 0; j<i+1; j++) {
                sum += pascal[i-1+r][j-1+c];
            }
        }
        System.out.println(sum);
    }
}