첫 문제는 연속된 자연수의 합이 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
#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;
}
첫번째 문제는 금방 풀고 두 번째 문제에서 규칙을 찾는데 시간을 썼다. 백준에서 푼 기억이 나기도 하고 풀이 방법이 확실치 않아 블로그를 찾아봤지만 그림까지 있음에도 쉽게 이해되지 않았다. 그러던 와중 세 번째 블로그에 들어갔는데 어딘가 익숙한 그림이 보여서 보니 내 포스팅이었다! 역시 내가 써서 그런지 내가 헷갈렸던 부분을 정확하게 설명하고 있었다. 색다른 경험이라 이 문제를 더 잊어버리진 않을 것 같다.
'코딩 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 두 큐 합 같게 만들기 (0) | 2022.10.07 |
---|---|
[프로그래머스] 성격 유형 검사하기 (1) | 2022.10.07 |
[프로그래머스] 124나라 - C++ (0) | 2022.08.15 |
[프로그래머스] 더 맵게 - C++/Java (0) | 2022.08.02 |
[프로그래머스] 오픈채팅방 - C++/Java (0) | 2022.08.01 |