코딩/프로그래머스

[프로그래머스] 스킬체크 Lv.2

최선을 다하는 2022. 8. 22. 11:04

    첫 문제는 연속된 자연수의 합이 n이 되는 경우의 수를 구하는 문제였다. 미리 0~i까지 숫자들의 합을 구해놓은 뒤 슬라이딩 윈도 기법을 사용하여 s와 e를 두고 arr[s] - arr[e]를 하게 되면 e+1 ~ s까지의 합이 구해진다. 이 값이 n 이 되면 숫자를 늘리고 e를 증가시킨다. 만약 숫자가 작다면 e를 늘리고 숫자가 n보다 크다면 s를 늘려 숫자를 n과 가까워지도록 한다.

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int arr[10001] = {0};

int solution(int n) {
    int answer = 0;
    int s=0,e=0,pivot;
    for(int i=1;i<=10001;i++){
        arr[i] = arr[i-1] + i;

    }
    while(s <= n && e <=n){
        int num = arr[e]- arr[s];
        if( num == n) {
            //cout << s << " "<<e << '\n'; 
            answer++;
            e++;
        }
        else if( num < n){
            e++;
        }
        else s++;

    }
    return answer;
}

 

 

    두번째 문제는 타일 채우기 문제였다. 

https://allmymight.tistory.com/m/36

 

[백준] 2133번 타일 채우기 - C/C++

https://www.acmicpc.net/problem/2133 2133번: 타일 채우기 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. www.acmicpc.net 문제 3 ×N 크기의 벽을 2 ×1, 1 × 2 크기의 타일로 채..

allmymight.tistory.com

 

#include <string>
#include <vector>

using namespace std;

long long arr[5001];

int solution(int n) {
    int answer = 0;
    if(n%2 == 1) return 0;

    arr[0] = 1;
    arr[2] = 3;
    for(int i=4;i<=n;i+=2){
        arr[i] = arr[2] * arr[i-2];
        for(int j=4;j<=i;j+=2){
            arr[i] += arr[i-j] * 2;
        }
        arr[i]%=1'000'000'007;
    }
    answer = arr[n]%1'000'000'007;
    return answer;

}

    첫번째 문제는 금방 풀고 두 번째 문제에서 규칙을 찾는데 시간을 썼다. 백준에서 푼 기억이 나기도 하고 풀이 방법이 확실치 않아 블로그를 찾아봤지만 그림까지 있음에도 쉽게 이해되지 않았다. 그러던 와중 세 번째 블로그에 들어갔는데 어딘가 익숙한 그림이 보여서 보니 내 포스팅이었다! 역시 내가 써서 그런지 내가 헷갈렸던 부분을 정확하게 설명하고 있었다. 색다른 경험이라 이 문제를 더 잊어버리진 않을 것 같다.