티스토리 뷰

Problem Solving/백준 온라인 저지

1793-타일링

developer0hye 2020. 9. 11. 22:06

www.acmicpc.net/problem/1793

 

1793번: 타일링

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 숫자 0 ≤ n ≤ 250이 주어진다. 

www.acmicpc.net

간단한 DP 알고리즘으로 풀리는 문제입니다.  그런데, C++ 의 기본 정수 자료형(int, long long, unsigned long long 등)을 사용하여 다룰 수 있는 값보다 처리되는 값의 크기가 크다는 문제가 있었습니다. 이러한 큰 수를 처리할 수 있도록 string 자료형을 사용하였고, 연산 과정은 string 으로 표현된 10진 숫자를 Digit 단위로 접근하여 더하는 식으로 구현하였습니다.

 

주의할 점으로 2x0 직사각형을 채우는 방법의 수를 1로 두고 문제를 풀어야 합니다.

 

코드

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string dp[251];

string add_big_number(string num1, string num2)
{
    string result;

    reverse(num1.begin(), num1.end());
    reverse(num2.begin(), num2.end());

    //처리하기 용이하도록 num1 의 자리수가 num2 의 자리수보다 크거나 같도록 Swap
    if(num1.size() < num2.size()) swap(num1, num2);
    
    int carry = 0;
    for(int i = 0; i < num1.size(); i++)
    {
        int num1_digit = int(num1[i]-48);
        int num2_digit = (i < num2.size())?int(num2[i]-48):0;
        int result_digit = num1_digit + num2_digit + carry;
        carry = int(result_digit >= 10);

        if(carry) result_digit -= 10;
        result_digit = result_digit;

        result.push_back(char(result_digit+48));
    }
    if(carry) result.push_back(char(1+48));
    
    reverse(result.begin(), result.end());
    return result;
}

int main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(NULL);
    // cout.tie(NULL);
    // freopen("1793.txt", "r", stdin);

    dp[0] = "1";
    dp[1] = "1";
    dp[2] = "3";

    for(int i = 3; i <= 250; i++)
    {
        dp[i] = add_big_number(dp[i-1], add_big_number(dp[i-2], dp[i-2]));
    }

    int n;
    while (scanf("%d", &n) == 1) 
    {
        cout << dp[n] << '\n';
    }
    return 0;
}

'Problem Solving > 백준 온라인 저지' 카테고리의 다른 글

17825-주사위 윷놀이  (0) 2020.09.13
4796-캠핑  (0) 2020.09.12
3197-백조의 호수  (0) 2020.09.11
1562-계단 수  (0) 2020.09.07
11053-가장 긴 증가하는 부분 수열  (0) 2020.09.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함