연권
달콘박스
연권
전체 방문자
오늘
어제
  • 전체 (308)
    • Web (22)
      • JavaScript (8)
      • TypeScript (2)
      • Node.js (8)
      • HTML (0)
      • CSS (0)
      • Network (1)
      • Browser (0)
      • Patterns (3)
    • Framwork (4)
      • Vue.js (3)
      • Electron (1)
    • Infra&DevOps (1)
    • Algorithm (246)
    • Database (16)
    • Review (15)
    • Test (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준ㅇ
  • 스택
  • 문자열
  • 동적계획법
  • DP
  • javascript
  • 재귀
  • 진수
  • java
  • 정렬
  • 프로그래머스
  • BFS
  • typescript
  • 백준
  • 진법
  • 백트레킹
  • MySQL
  • sql
  • 코딩테스트 연습
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
연권

달콘박스

백준 1010번 다리놓기 [ Java ]
Algorithm

백준 1010번 다리놓기 [ Java ]

2021. 6. 26. 01:50
반응형

서쪽과 동쪽의 사이트를 연결하는 경우의 수를 구하기 위해선 사이트의 수가 더 많은 곳을 기준으로 잡아야 합니다.

문제에서의 예시로 보면 서쪽엔 4개 동쪽엔 7개의 사이트가 있는데 동쪽의 7개의 사이트 중에 4개를 뽑아야 하니 7C4의 연산이 나옵니다.

조합(Combination)의 연산을 하기 위해 조합의 특징중의 하나인 파스칼의 삼각형을 이용합니다.

파스칼의 삼각형 - 위키백과, 우리 모두의 백과사전

nCr = (n-1)C(r-1) + (n-1)Cr 이므로 이걸 함수로 구현하면 아래와 같이 표현할 수 있습니다.

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

구현한 함수로 입력 값중 더 큰값이 n 작은값이 r이라고 보고 문제를 풀어보면 아래와 같이 나옵니다.

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());
        while (t-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            sb.append(combination(Math.max(a, b), Math.min(a, b)) + "\n");
        }
        System.out.print(sb);
    }

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

그런데 문제에는 0.5초라는 시간제한이 있으므로 시간을 더 줄여줘야하는데 nCr의 n의 값이 커질수록 연산해야하는 depth가 깊어지므로 이전에 했던 연산을 저장하기위해 배열을 만들어주어 한 번 했던 연산은 저장하고 이전에 나왔던 연산이면 바로 return을 해주는 방식으로 코드를 수정합니다. (DP)

import java.io.*;
import java.util.*;

public class Main {
    static int[][] memo = new int[30][30];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());
        while (t-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            sb.append(combination(Math.max(a, b), Math.min(a, b)) + "\n");
        }
        System.out.print(sb);
    }

    static int combination(int n, int r) {
        if (r == 0 || n == r)
            return 1;
        if (memo[n][r] != 0) return memo[n][r];
        return memo[n][r] = combination(n-1, r-1) + combination(n-1, r);
    }
}
반응형
저작자표시 동일조건 (새창열림)

'Algorithm' 카테고리의 다른 글

전치행렬 구하기 [javascript]  (0) 2021.08.13
프로그래머스 코딩테스트 연습 Level2 - 단체 사진 찍기 [ Java ]  (0) 2021.07.02
2021 Summer Coding - 여름방학 스타트업 인턴 프로그램 코딩테스트 후기  (0) 2021.05.26
백준 2529번 부등호 [ Java ]  (0) 2021.05.19
백준 15661번 링크와 스타트 [ Java ]  (0) 2021.05.18
    'Algorithm' 카테고리의 다른 글
    • 전치행렬 구하기 [javascript]
    • 프로그래머스 코딩테스트 연습 Level2 - 단체 사진 찍기 [ Java ]
    • 2021 Summer Coding - 여름방학 스타트업 인턴 프로그램 코딩테스트 후기
    • 백준 2529번 부등호 [ Java ]
    연권
    연권

    티스토리툴바