재밌고 어려운 IT를 이해해보자~!

[백준] 풀이 본문

알고리즘

[백준] 풀이

언제나즐거운IT 2023. 12. 14. 09:02

CodeUp Programmer를 하다가 같이 교육을 듣는 동기들이 백준 그룹에 초대해줘서 같이 알고리즘 문제를 풀게되었다!
확실히 혼자하는 것 보다 더 동기부여도되서 좋지만, 난이도만 보면 내가 해도 되나 싶기도하다.

그래도 재미있게 할 수 있어서 좋다!

 

1010.

 

다리놓기!

왼쪽에 있는 노드 N개와 오른쪽에 있는 노드M개를 연결해서 다리를 놔야한다.

다리는 서로 곂칠 수 없고 N<=M 이다. 

 

다리 개수를 B로놓고 차근차근생각해보면 

N  M  B

1  1  1

1  2  2

1  3  3

1  4  4

1  5  5

 

2  2  1

2  3  3

2  4  6

2  5  10

 

3  3  1

3  4  4

3  5  10

3  6  20

 

이를 배열로 표현해보면

 

M 1  2  3  4  5 -> N

1  1  2 3 4  5

2  1  1  3  6  10 

3  1  1  1  4  10   20

4

5

 

N <  M 인 상황에서는 아무것도 없는 배열 (1로표현) 이되고 M >=N 부터는 일정한 규칙을 갖는다.

첫째행은 등차 1인 배열 1 2 3 4 5

둘째행은 등차를 이전행 이전원소로 가지는 배열 1 3 6 10 15

셋째행은 등차를 이전행 이전원소로 가지는 배열 1 4 10 20 35

라는 규칙을 갖는다!

 

따라서 그런 배열을 하나 선언하고 원하는 원소값을 찾아주면 된다.

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 br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		

		int[][] arr = new int[30][30];
		for (int i = 0; i < 30; i++) {
			arr[0][i] = i + 1;
		}
		for (int i = 1; i < 30; i++) {
			for (int j = 0; j < 30; j++) {
				if (j <= i) {
					arr[i][j] = 1;
				} else {
					arr[i][j] = arr[i][j - 1] + arr[i - 1][j - 1];
				}
			}
		}
		
		
		int T = Integer.parseInt(br.readLine());
		int[] ans = new int[2];
		for (int a = 0; a < T; a++) {
			String[] temp = br.readLine().split(" ");

		for (int i = 0; i < 2; i++) {
			ans[i] = Integer.parseInt(temp[i]);
		}

			System.out.println(arr[ans[0] - 1][ans[1] - 1] + " ");

		}
	}
}

2439.

 

이별찍기는 5x5 배열이며

첫째행은 공백 " " 4개와 별 1개

둘째행은 공백 " " 3개와 별 2개...

로 이어진다

1행 5열에서 *이 한개 찍혀야 하기 때문에

외부루프는 --를 사용해 받은값부터 1까지 반복을 시키면 된다. (사용자에게 입력을 받아야하기떄문에 1까지~)

외부루프 순환값 a 가 내부루프 순환값 i보다 클동안은 " "공백을 출력하고 i와 같아지면 *을 출력한다!

package atemp;
import java.util.Scanner;
public class temp {
		public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
			int b = sc.nextInt();
			for (int a=b; a>0; a--) {
			 for (int i=1; i<=b; i++) {
				 if (a>i) {
					 System.out.print(" ");
				 } else {
					 System.out.print("*");
				 }
			 }
			 System.out.println();
			}
		}
}

2448.

 

유명한 피보나치수! 

첫번째, 두번째 숫자가 주어지고 3번째부터 규칙이 시작된다.

3번째 숫자는 바로앞 두숫자의 핲, 4번째숫자도 바로앞 두숫자의 합이 이어진다!

N (n) = N (n-1) + N (n-2) 

 

N1 ,N2를 초기화해주고

N3은 N1 + N2를 해준뒤

N2를 N1에 대입하고

N2를 N3에 대입하는걸 반복해준다

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        
        int n = Integer.parseInt(br.readLine());
        // 1 2 3 5 8 13 21

        long[] arr = new long[90];
        long n1 = 0;
        long n2 = 1;
        long fiboN = 0;
     
        for (int i=2; i<=n; i++) {
        	fiboN = n1+n2;
        	n1=n2;
        	n2=fiboN;
        }
        if (n==0) {
        	fiboN = 0;
        } else if (n==1 ) {
        	fiboN = 1;
        }
        System.out.println(fiboN);

    }

}

 

 

'알고리즘' 카테고리의 다른 글

[백준] 17287  (0) 2024.05.19
[백준] 1927  (0) 2024.05.18
Codeup 문제해석 단순반복문  (1) 2023.12.05
Code up 문제해석 if~else2  (0) 2023.12.02
Codeup 문제해석 - if~else문  (0) 2023.11.28
Comments