본문 바로가기

알고리즘

(54)
[코드업] 3716 - 블럭 채우기 5 3∗1∗1블럭과 3∗2∗1 블럭을 이용해서 3∗n∗1블럭 판을 맞추려고 한다. 가능한 모든 가짓수를 1,000으로 나눈 나머지를 구해보자 #include using namespace std; const int DIV = 1000; int dp[10001] = {0, 1, 2, 6,}; int block(int n){ if(dp[n] != 0) return dp[n]; return dp[n] = (block(n - 3) * 3 % DIV + block(n - 2) % DIV + block(n - 1) % DIV) % DIV; } int main(){ int N; cin >> N; cout
[코드업] 3714 - 블럭 채우기 4 'ㄱ'자 모양 블럭과 1∗1의 직사각형 블럭을 이용하여 2∗n 크기의 직사각형 모양으로 채우려고 한다. 가능한 방법의 수를 구하여라. 블럭은 무한정 있다고 가정한다. 이 때 숫자가 커질 수 있으므로 100,007로 나눈 나머지를 출력하시오. #include using namespace std; const int DIV = 100007; int dp[10001] = {0, 1, 5, 11,}; int block(int n){ if(dp[n] != 0) return dp[n]; return dp[n] = (block(n - 3) * 2 % DIV + block(n - 2) * 4 % DIV + block(n - 1) % DIV) % DIV; } int main(){ int N; cin >> N; cout
[코드업] 3712 - 블럭 채우기 3 2∗1과 2∗2 크기의 사각형 블럭을 이용하여 2∗n 크기의 직사각형 모양으로 채우려고 한다. 가능한 방법의 수를 구하여라. 두 사각형 블럭은 무한정 있다고 가정한다. 이 때 숫자가 커질 수 있으므로 100,007로 나눈 나머지를 출력하시오. #include using namespace std; const int DIV = 100007; int dp[10001] = {1, 1,}; int block(int n){ if(dp[n] != 0) return dp[n]; return dp[n] = (block(n - 1) + block(n - 2) * 2) % DIV; } int main(){ int n; cin >> n; cout
[코드업] 3712 - 블럭 채우기 2 다음과 같은 'ㄱ'자 모양의 블럭이 있다. 이 블럭을 이용하여 2∗n 크기의 직사각형 모양으로 채우려고 한다. 가능한 방법의 수를 구하여라. 'ㄱ'자 블럭은 무한정 있다고 가정한다. 이 때 숫자가 커질 수 있으므로 100,000,007로 나눈 나머지를 출력하시오. #include using namespace std; const int DIV = 100000007; int dp[10001] = {0, 0, 0, 2,}; int block(int n){ if(dp[n] != 0) return dp[n]; if(n == 1 || n == 2) return 0; return dp[n] = (block(n - 3) * 2) % DIV; } int main(){ int N; cin >> N; cout
[코드업] 3709 - 블럭 채우기 1 2∗1의 직사각형 블럭을 이용하여 2∗n 크기의 직사각형 모양으로 채우려고 한다. 가능한 방법의 수를 구하여라. 2∗1 직사각형 블럭은 무한정 있다고 가정한다. 이 때 숫자가 커질 수 있으므로 100,000,007로 나눈 나머지를 출력하시오. #include using namespace std; const int DIV = 100000007; int dp[10001] = {0, 1, 2,}; int block(int n){ if(dp[n] != 0) return dp[n]; return dp[n] = (block(n - 2) + block(n - 1)) % DIV; } int main(){ int N; cin >> N; cout
[코드업] 3021 - 큰 수 덧셈 두 큰 수(BigInteger)에 대해서는 숫자를 문자열로 받아와 뒤집어서 처음부터 마지막까지 모조리 한 자리씩 더한 다음에, 10이 넘는 자리마다 자리올림을 수행해주면 된다. #include #include #include #include using namespace std; vector zeroJustify(vector str) { vector::iterator f_iter; for (auto iter = str.end() - 1; iter >= str.begin(); iter--) { if (*iter != 0) { f_iter = iter; break; } if (iter == str.begin() && *iter == 0) { f_iter = str.begin(); break; } } str.e..
[코드업] 3500 - 지뢰 찾기 2 지뢰 찾기 게임을 해본 사람은 다음 경우를 보았을 것이다. 다음 왼쪽 그림의 빨간 칸 (2, 2)를 클릭했는데, 오른쪽과 같은 결과가 나왔다. → 이렇게 나오는 이유는 선택한 칸 주변에 지뢰가 없기 때문이다. 이런 경우 8방향으로 범위를 계속 늘려가며 주변 지뢰 개수가 0이 아닌 정보가 나올때 까지 확장한다. 지뢰 맵의 정보가 주어지고, (r, c)칸을 선택한 후의 화면에 나타날 맵 상태를 출력하시오. 아직 뒤집지 않은 칸은 밑줄(_)로 출력하시오. 더보기 입력 예시 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 ..
[코드업] 2102 - 배수(hard) 더보기 입력 예시 3 출력 예시 111 #include #include using namespace std; unsigned long long N; // 2^64는 10^20보다 작다. // 따라서 1또는 0으로 만들 수 있는 최대의 수는 1을 20번쓰는 것이다.. const unsigned long long limit = 11111111111111111111; unsigned long long minValue = UINT64_MAX; void solve(unsigned long long start){ if (start % N == 0) minValue = min(minValue, start); if (start > limit / 10) return; solve(start * 10 + 1); solve(..