[백준] 16922번 로마 숫자 만들기
- 알고리즘/백준
- 2020. 5. 16. 19:47
반응형
반응형
문제
로마 숫자에서는 수를 나타내기 위해서 I, V, X, L을 사용한다. 각 문자는 1, 5, 10, 50을 의미하고, 이 문제에서 다른 문자는 사용하지 않는다.
하나 또는 그 이상의 문자를 이용해서 수를 나타낼 수 있다. 문자열이 나타내는 값은, 각 문자가 의미하는 수를 모두 합한 값이다. 예를 들어, XXXV는 35, IXI는 12를 의미한다.
실제 로마 숫자에서는 문자의 순서가 중요하지만, 이 문제에서는 순서는 신경쓰지 않는다. 예를 들어, 실제 로마 숫자에서 IX는 9를 의미하지만, 이 문제에서는 11을 의미한다.
로마 숫자를 N개 사용해서 만들 수 있는 서로 다른 수의 개수를 구해보자.
입력
첫째 줄에 사용할 수 있는 문자의 개수 N (1 ≤ N ≤ 20)이 주어진다.
출력
첫째 줄에 로마 숫자 N개를 사용해서 만들 수 있는 서로 다른 수의 개수를 출력한다.
이 문제는 브루트 포스 문제다. 다만 현재는 반복문을 활용해 문제를 해결했다.
#include <bits/stdc++.h>
using namespace std;
bool check[2500];
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N;
cin >> N;
for(int i = 0; i<=N;i++) {
for(int j = 0;j<=N-i;j++) {
for(int k = 0;k<=N-i-j;k++) {
int l = N-i-j-k;
int sum = i + j*5 + k*10 + l*50;
check[sum] = true;
}
}
}
int ans = 0;
for(int i = 0; i< sizeof(check);i++) {
if (check[i]) {
ans++;
}
}
cout << ans << "\n";
}
#include <iostream>
#include <vector>
using namespace std;
vector<bool> visited(1001, false);
vector<int> selVec;
int inputN;
void myDfs(int start) {
if ((signed)selVec.size() == 3) { // 4등분
int n1 = selVec[0];
int n2 = selVec[1] - selVec[0];
int n3 = selVec[2] - selVec[1];
int n4 = inputN - n1 - n2 - n3;
visited[n1 + n2 * 5 + n3 * 10 + n4 * 50] = true;
return;
}
for (int i = start; i <= inputN; ++i) {
selVec.push_back(i);
myDfs(i);
selVec.pop_back();
}
}
int mySolve() {
myDfs(0);
int ret = 0;
for (int i = 1; i <= 50 * inputN; ++i) {
if (visited[i]) {
ret += 1;
}
}
return ret;
}
int main() {
cin >> inputN;
int resultVal = mySolve();
cout << resultVal;
return 0;
}
dfs로 푼 코드다. 연습을 더 해야겠다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 6679번 싱기한 네자리 숫자 (0) | 2020.05.19 |
---|---|
[백준] 16197번 두 동전 (0) | 2020.05.17 |
[백준] 14226번 이모티콘 (0) | 2020.05.15 |
[백준] 14502번 연구소 (0) | 2020.05.15 |
[백준] 16928번 뱀과 사다리 게임 (0) | 2020.05.15 |