KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • Level1
  • Level 2
  • js
  • 백준
  • C
  • 문자열
  • 정렬
  • string
  • tree
  • LeetCode
  • Level 0
  • codeup
  • 수학
  • 제코베 JS 100제
  • C++
  • 그래프
  • recursion
  • programmers
  • Level 1
  • 다이나믹 프로그래밍

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun

Coding Note

CodeUp / Recursion(재귀) / 3702번 / 파스칼의 삼각형2 / C++
PS/CodeUp

CodeUp / Recursion(재귀) / 3702번 / 파스칼의 삼각형2 / C++

2020. 9. 13. 17:20

 

문제 설명  

다음과 같은 삼각형을 파스칼의 삼각형이라고 한다.

 

회전 변환된 이 삼각형에서 (r행, c열)의 값을 알 수 있는 프로그램을 작성하시오. 행과 열은 1부터 시작한다.

 

입력

자연수 r과 c가 입력된다. (1 ≤ r, c ≤ 50)

 

출력

(r, c)의 원소 값을 100,000,000으로 나눈 나머지를 출력한다.

 

입력 예시

3 2

 

출력 예시

3

 

#include <iostream>
using namespace std;

int arr[50][50] = { 0 };

int pascal(int r, int c) {
    if(r == 1 || c == 1) // 1행과 1열은 모두 1이므로 1을 저장한다
        arr[r][c] = 1;
        
    if(arr[r][c]) // 만약 배열에 이미 저장되있을경우 그 값을 return(메모이제이션)
        return arr[r][c];
        
    arr[r][c] = (pascal(r, c - 1) + pascal(r - 1, c)) % 100000000;
    
    return arr[r][c];
}

int main() {
    int r, c;
    cin >> r >> c;
    
    cout << pascal(r, c) << endl;
}

여기서 가장 중요했던 것은 pascal 함수 위에 return문 바로 위에있는 줄이 아닌가싶다.

처음엔 어떻게 해야하지 막막했다.

그래서 재귀함수가 되려면 규칙성이 있어야하니, 그 규칙성을 찾기로했다.

눈으로만 보면서 하기엔 헷갈려서 써내려가면서 하니 규칙성이 보였다.

만약 우리가 2행 3열을 구하고자 한다면, 2행 2열과 1행 3열을 더해야한다.

간단하게 나타내면, (2, 3) = (2, 2) + (1, 3) 이다.

이것을 공식으로 나타내보자면, (r, c) = (r, c-1) + (r-1, c) 이다.

이것만 캐치해낸다면, 손쉽게 코드를 작성할 수 있다.

저작자표시 (새창열림)

'PS > CodeUp' 카테고리의 다른 글

CodeUp / Recursion(재귀) / 3733번 / 우박수 길이(3n + 1)(large) / C++  (0) 2020.09.14
CodeUp / Recursion(재귀) / 3704번 / 계단 오르기2 / C++  (0) 2020.09.14
CodeUp / Recursion(재귀) / 1930번 / SuperSum / C++  (0) 2020.09.13
CodeUp / Recursion(재귀) / 1929번 / 우박수(3n+1) - reverse / C++  (0) 2020.09.13
    'PS/CodeUp' 카테고리의 다른 글
    • CodeUp / Recursion(재귀) / 3733번 / 우박수 길이(3n + 1)(large) / C++
    • CodeUp / Recursion(재귀) / 3704번 / 계단 오르기2 / C++
    • CodeUp / Recursion(재귀) / 1930번 / SuperSum / C++
    • CodeUp / Recursion(재귀) / 1929번 / 우박수(3n+1) - reverse / C++
    KimMinJun
    KimMinJun

    티스토리툴바