기록공간

[TIL] BOJ - 2739,10430,2439,2775,2579,1744(JAVA) 본문

TIL(Today I Learned)

[TIL] BOJ - 2739,10430,2439,2775,2579,1744(JAVA)

mkm101 2023. 5. 1. 20:49
반응형

1. 백준 2739

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;
 
class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        
        for(int i=1; i<=9; i++) {
            System.out.println(N+" * " + i +  " = " + N*i);
        }
        sc.close();
    }
}
cs

 

1. 키보드로부터 입력으로 받을 Scanner 객체를 생성해준다.

2. 1~9 까지 곱셈을 수행할 숫자 N을 입력 받는다.

3. 1부터 9까지 곱셈을 수행해야 하기 때문에, 반복문 for를 사용해서 System.out.println()메소드를 사용해 구구단의 각단을 출력해준다.

4. 마지막으로 Scanner 클래스를 닫아준다. 

 

 

2. 백준 10430
 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;
 
class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int A = sc.nextInt();
        int B = sc.nextInt();
        int C = sc.nextInt();
        
        System.out.println((A+B)%C);
        System.out.println(((A%C)+(B%C))%C);
        System.out.println((A*B)%C);
        System.out.println(((A%C)*(B%C))%C);
        
        sc.close();
    }
}
cs

 

3. 백준 - 2439 (별찍기 - 2)

문제 접근 :

출력 창을 보면, 첫번 째 줄에는 별이 하나, 두번 째 줄에는 별이 2개, N번 째 줄에는 별이 N개 찍혀있음을 알 수 있다. 따라서 숫자 N을 입력받으면, N번만큼의 반복문을 사용해야 함을 알 수 있다.(1)  

 

또한, 첫번 째 별 출력하는 과정에서는, N-1칸 만큼의 공백이 존재하고, 두번 째 별을 출력하는 과정에서는 N-2 번 만큼의 공백이 존재한다.

 

따라서, N-i번 만큼의 공백을 만들어줄 반복문이 필요하다. (2)

 

마지막으로, i번 째 행에는 i 번만큼의 별이 출력되므로, 별을 출력할 반복문이 필요하다. (3)

 

따라서 총 3번의 반복문이 필요함을 알 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;
 
class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
 
 
        int N = sc.nextInt();
        for(int i=1; i<=N; i++) {
            for(int j=1; j<=N-i; j++) { 
                System.out.printf(" ");
            }
            for(int k=1; k<=i; k++) {
                System.out.printf("*");    
             }
            System.out.print('\n');
        }
    }
}
cs

 

 

4.백준 2775 (부녀회장이 될테야)

 

 

문제 접근 방법 :

(조건 : 0층의 i호에는 i명이 살 수 있다.  또한, n과k는 0보다 같거나 크고, 14보다 작거나 같다.)

 

문제에서는  a층의 b호에 살려면, 아래(a-1)층의 1호부터 b호 까지 사람들의 수를 합한 만큼 사람들을 데려와 살아야 한다고했다. 또한,  입력으로 k( 층), n(호)가 주어지면, k층 n호에 거주할 수 있는 인원을 구해야한다.

 

위 조건을 잘 활용해, 2차원 배열을 사용해  0층 i(1<i<=14)호에 해당하는 사람들을 초기화 해주었다.

 

다음, 1층부터 14층까지 i호에 해당하는 사람들을 아래층의 i번째 호에 해당하는 사람들 만큼 더해주었다.

 

자세한 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;
 
class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int T = sc.nextInt();
        
        int[][] dp = new int[15][15]; 
        
        for(int i=1; i<=14; i++) {
            dp[0][i] = i; 
        }
        for(int i=1;i<=14; i++) {
            for(int j=1;j<=14; j++) {
              int sum=0;
              for(int k=1; k<=j; k++) {
                  sum += dp[i-1][k];
              }
              dp[i][j]=sum;
            }
        }
        for(int i=0; i<T; i++) {
            int k=sc.nextInt();
            int n= sc.nextInt();
            System.out.println(dp[k][n]);
        }
        sc.close();
    }
}
cs

 

 

5. 2579 - 계단 오르기 

 

 

문제 접근 방법 :  계단은 한 번에, 한 계단 혹은 두 계단씩 오를 수 있다. 또한, 세개의 계단을 모두 밞아서는 안된다는 제약이 있다. 예를들어, 시작점 부터, 3번 째 계단까지 가는걸 계산해보자.

1->3 혹은 2->3  이렇게 밖에 갈 수 없다. 1->2->3 이렇게 계단을 올라간다면,  규정에 어긋나는것이다.

 

또한 얻을 수 있는 총 점수의 최대값을 구하는 프로그램을 작성하라했으므로, 

i번째 계단에서 얻을 수 있는 최대 점수를 점화식으로 구현하면, DP[i] = Math.max(DP[i-2]+staris[i],DP[i-3]+stairs[i-1]+stairs[i])가 될 것이다.

 

즉, i번째 계단까지 오르는 방법은 (i-1)번째 계단에서 한 계단을 올라오거나, (i-2)번째 계단에서 두 계단을 올라오는 두 가지 방법이 있다. 첫 번째 경우는 i-1번째 계단에서 한 계단을 올라오므로, 그 전에는 i-2번째 계단에 있어야 한다. 따라서 이 경우의 최대 점수는 DP[i-2] + stairs[i]가 된다. 두 번째 경우는 i-2번째 계단에서 두 계단을 올라오므로, 그 전에는 i-3번째 계단에 있어야 한다. 따라서 이 경우의 최대 점수는 DP[i-3] + stairs[i-1] + stairs[i]가 된다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;
 
class Main {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        
        int[] stairs = new int[n+1]; // 각 계단마다 점수를 저장할 배열
        int[] dp = new int[n+1];  // 최대로 얻을 수 있는 점수를 저장할 배열
        
        for(int i=0; i<n; i++) {
            stairs[i] = sc.nextInt();
        }
        
        dp[1= stairs[1]; // 첫 번째 계단까지 오를 때, 얻을 수 있는 최대 점수
        
        if(n>2) {
            dp[2= stairs[1+ stairs[2]; // 두 번째 계단까지 오를 때, 얻을 수 있는 최대 점수
        }
        
        for(int i=3; i<=n; i++) {
            dp[i] = Math.max(dp[i-2]+stairs[i],dp[i-3]+stairs[i-1]+stairs[i]);
        } //i - 2번째 계단까지 오르고 i번 째 계단을 밞았을 때와, i-3번째 계단까지오른 후,i-1,i번째 계단을 밞았을 경우 중 최대 값 
        
        System.out.println(dp[n]);
        sc.close();
        
    }
}
cs
반응형