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 일 경우 한 블록의 사이즈는 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);
}
}
'백준 문제 풀이' 카테고리의 다른 글
10818번(스택), 18866번(큐), 1654번(이진 탐색) (0) | 2022.07.18 |
---|---|
1966번(큐), 1010번(조합), 1789번 (0) | 2022.07.15 |
10815번 (이진 탐색), 1874번 (스택), 11650번 (정렬) (0) | 2022.07.13 |
2751번, 2231번, 1110번, 1181번, 1436번, 10814번 (0) | 2022.07.12 |
14954번, 15649번, 15650번, 15651번, 15625번 (0) | 2022.07.11 |