본문 바로가기

Java/백준

[JAVA] 백준 1010 다리 놓기

1010번: 다리 놓기 (acmicpc.net)

 

1010번: 다리 놓기

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

www.acmicpc.net

 

 

풀이 과정 

 

[수학] 순열, 조합 공식 총정리 (tistory.com)

 

[수학] 순열, 조합 공식 총정리

팩토리얼 ( ! ) 팩토리얼이란 서로 다른 n개를 나열하는 경우의 수를 의미합니다. 기호로는 n! 이렇게 쓰고 계산은 n부터 1씩 줄여나가면서 1이 될때까지의 모든 수를 곱합니다. 순열 ( nPr ) 순열이

coding-factory.tistory.com

 

- M개에서 N개를 선택해야 하며 서로 중복되면 안됨 -> 조합 이용 

- nCr -> 서로 다른 n개에서 r개를 뽑는 것 

 

- nCr = n-1Cr-1 + n-1Cr

- nC0 = nCn =1

 

- 조합은 하나의 원소를 선택할 경우 + 하나의 원소를 선택하지 않을 경우 이 둘의 합을 나타냄 

[Java] 조합 Combination (tistory.com)

 

[Java] 조합 Combination

조합 조합이란 n 개의 숫자 중에서 r 개의 수를 순서 없이 뽑는 경우를 말한다. (위키백과 - 수학에서 조합은 서로 다른 n개의 원소 중에서 순서에 상관없이 r개를 선택하는 것이다. 그 경우의 수

minhamina.tistory.com

 

ex)

(1,2,3) 중에서 2개를 뽑는 조합 -> 3C2

  - (1,X)  : 1을 뽑는 경우 (하나의 원소를 선택할 경우)

  - (X,X) : 1을 뽑지 않는 경우 (하나의 원소를 선택하지 않는 경우)

 

- 1을 뽑은 경우 나머지 (2,3) 중 1개를 선택해야 함  -> 2C1

- 1을 뽑지 않은 경우 (2,3) 모두 선택해야 함  -> 2C2

- 이를 바탕으로 더 이상 쪼개지지 않을 때 까지 , 즉 c=nC0=1이 될 떄까지 구한다면 nCr을 구할 수 있음

 

- 3C2 = 2C1 + 2C2+.... 3C0 = 1이 될 때까지 재귀호출을 통해 구현 

- 재귀를 통해 호출을 하다가 r==0이 될 경우 , 즉 r개를 다 뽑은 경우에는 더 이상 선택의 여지가 없으므로 1을 리턴

- 전체 개수 n이 뽑아야 할 개수 r과 같아졌다면  다 뽑는 것 말고 선택의 여지가 없으므로 1을 리턴 

- 그 이외에는 원소를 선택할 경우 + 선택하지 않을 경우 둘의 합을 계속 재귀로 호출

 

public static int combination(int n , int r)
{

	if(n==r ||r==0) 
    {
    	return 1;
    }
    
    return combination(n-1, r-1) + combination(n-1, r);
}

 

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

public class Main {
    
    public static int combination(int n ,int r)
    {
        if(n==r||r==0)
        {
            return 1;
        }
        
        return combination(n-1,r-1)+combination(n-1,r);
    }
    public static void main(String[] args) throws IOException
    {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        
        int num = Integer.parseInt(br.readLine());
        
       
        for(int i=0; i<num; i++)
        {
        	StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            
            bw.write(combination(m,n)+"");
            bw.newLine();
        }
        
        bw.flush();
        bw.close();
        
        
    }
}

 

 

 

 

- 메모이제이션(Memoization)을 이용하여 동적 계획법으로 활용

- 이전에 풀었던 자료를 저장해놨다가 빠르게 처리 

- dp [][] 배열을 사용하여 이미 계산된 값은 다시 계산하지 않고 중복 계산을 피함 

- 입력값 n과 r에 맞는 조합 결과가 dp[n][r]에 저장되고 출력됨 

 

[백준] 1010번 : 다리 놓기 - JAVA [자바] (tistory.com)

 

[백준] 1010번 : 다리 놓기 - JAVA [자바]

www.acmicpc.net/problem/1010 1010번: 다리 놓기 입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 <

st-lab.tistory.com

 

 

 

정답 

 

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



public class Main {
    
	static int dp[][] = new int[30][30];
	
    public static int combination(int n ,int r)
    {
    	//이미 계산된 값일 경우 
    	if(dp[n][r]>0)
    	{
    		return dp[n][r];
    	}
    	
        if(n==r||r==0)
        {
            return dp[n][r] = 1;
        }
        
        return dp[n][r]=combination(n-1,r-1)+combination(n-1,r);
    }
    public static void main(String[] args) throws IOException
    {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        
        int num = Integer.parseInt(br.readLine());
        
       
        for(int i=0; i<num; i++)
        {
        	StringTokenizer st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            
            bw.write(combination(m,n)+"");
            bw.newLine();
        }
        
        bw.flush();
        bw.close();
        
        
    }
}

 

 

'Java > 백준' 카테고리의 다른 글

[JAVA] 백준 25192 인사성 밝은 곰곰이  (0) 2024.02.16
[JAVA] 백준 1037 약수  (0) 2024.02.16
[JAVA] 백준 11050 이항 계수 1  (0) 2024.02.15
[JAVA] 백준 10872 팩토리얼  (0) 2024.02.15
[JAVA] 백준 24723 녹색거탑  (0) 2024.02.15