UL :)
UL의 개발 블로그
UL :)
전체 방문자
오늘
어제
  • 분류 전체보기 (220)
    • 일상 (1)
    • 회고록 (7)
    • ChatGPT 아카이빙 (0)
    • PS(Java) (114)
      • 백준 (37)
      • 인프런 강의 문제 (77)
    • Web (69)
      • Spring (18)
      • JPA (7)
      • JSP (9)
      • HTML5 (12)
      • CSS (19)
      • HTTP (0)
      • 보안 (2)
    • Language (5)
      • Java (3)
      • JS (1)
      • Python (1)
    • Git, GitHub (4)
    • Settings (18)
      • IntelliJ (7)
      • Eclipse (2)
      • VSCode (3)
      • Android Studio (1)
      • VMware (2)
      • Mac (0)
    • Etc (1)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • ReturnValueHandler
  • @PostMapping
  • consumes
  • 영속성
  • @RequestParam
  • @Id
  • ORM
  • IDENTITY 전략
  • @Column
  • 엔티티 매핑
  • argumentresolver
  • @GetMapping
  • BOJ
  • 1차 캐시
  • EntityManagerFactory
  • 영속성컨텍스트
  • 동일성보장
  • @JoinColumn
  • SEQUENCE 전략
  • 백준
  • 요청헤더
  • TABLE 전략
  • 정렬
  • HandlerMethodArgumentResolver
  • JPA
  • @Table
  • ViewName반환
  • produces
  • HttpMessageConverter
  • @ManyToOne

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
UL :)

UL의 개발 블로그

[PS] 인프런 강의 - DFS 8. 수열 추측하기
PS(Java)/인프런 강의 문제

[PS] 인프런 강의 - DFS 8. 수열 추측하기

2022. 9. 28. 19:12

문제

가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다. 예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있다고 했을 때, 다음과 같은 삼각형이 그려진다.

 

3 1 2 4
 4 3 6
  7 9
  16

 

N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하시오. 단, 답이 여러가지가 나오는 경우에는 사전순으로 가장 앞에 오는 것을 출력하여야 한다.

 

▣ 입력설명
첫째 줄에 두개의 정수 N(1≤N≤10)과 F가 주어진다. N은 가장 윗줄에 있는 숫자의 개수를 의미하며 F는 가장 밑에 줄에 있는 수로 1,000,000 이하이다.

 

▣ 출력설명
첫째 줄에 삼각형에서 가장 위에 들어갈 N개의 숫자를 빈 칸을 사이에 두고 출력한다. 답이 존재하지 않는 경우는 입력으로 주어지지 않는다.

 

▣ 입력예제 1
4 16

 

▣ 출력예제 1
3 1 2 4

풀이

앞서 배운 조합(Combination)의 경우의 수를 이용해서 풀 수 있다.

 

자꾸 빼먹는데... 주의할 점. 답을 찾은 후 스택 프레임이 삭제되고 이전 주소로 돌아갔을 때 재귀 호출을 바로 종료하도록 flag 값을 사용해야 한다.

 

풀이는 이번에도 손필기! 로 대체한다.

 

 

코드

import java.util.Scanner;

public class Main {

    static int[] p, b, ch; //b: combi에서 뽑아낸 것
    static int n, f;
    static int[][] dy; //combi 메모이제이션
    static boolean flag = false; //주의!! 빼먹지 말 것


    public static void DFS(int L, int sum) {
        if(flag) return;
        if(L == n && sum == f) {
            for(int x : p) System.out.print(x + " ");
            flag = true;
        }
        else {
            //숫자 순회 (i 자체가 숫자)
            for(int i=1; i<=n; i++) {
                if(ch[i] == 0) {
                    p[L] = i;

                    ch[i] = 1;
                    DFS(L+1, sum + (p[L] * b[L]));
                    ch[i] = 0;
                }
            }
        }
    }

    //n=3
    public static int combi(int n, int r) {
        if(dy[n][r] > 0) return dy[n][r];
        if(r == 0 || n == r) return 1;
        else return dy[n][r] = combi(n-1, r-1) + combi(n-1, r);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        n = in.nextInt(); //1~10
        f = in.nextInt(); //~1,000,000

        p = new int[n];
        b = new int[n];
        ch = new int[n+1]; //1~n

        dy = new int[n+1][n+1];


        for(int i=0; i<n; i++) { //조합
            b[i] = combi(n-1, i); //i는 0~n-1 까지 돌지만 c는 1~n
        }

        DFS(0, 0);

    }
}
저작자표시 비영리 변경금지 (새창열림)

'PS(Java) > 인프런 강의 문제' 카테고리의 다른 글

[PS] 인프런 강의 - DFS 10. 미로탐색  (0) 2022.10.05
[PS] 인프런 강의 - DFS 9. 조합 구하기  (0) 2022.09.29
[PS] 인프런 강의 - DFS 7. 조합의 경우수(메모이제이션)  (0) 2022.09.28
[PS] 인프런 강의 - DFS 6. 순열 구하기  (0) 2022.09.28
[PS] 인프런 강의 - DFS 5. 동전교환  (0) 2022.09.28
    'PS(Java)/인프런 강의 문제' 카테고리의 다른 글
    • [PS] 인프런 강의 - DFS 10. 미로탐색
    • [PS] 인프런 강의 - DFS 9. 조합 구하기
    • [PS] 인프런 강의 - DFS 7. 조합의 경우수(메모이제이션)
    • [PS] 인프런 강의 - DFS 6. 순열 구하기
    UL :)
    UL :)
    백엔드 개발자를 목표로 달리고 있습니다🔥

    티스토리툴바