백준의 로마숫자 만들기(16922) 문제이다.
[ 문제 바로가기 ]
[ 문제풀이 ]
1) 쉽게 이야기 하면 { 1, 5, 10 , 50 } 에서 N개를 뽑는 중복조합의 수를 출력하면 되는 문제이다.
그렇다면 왜 조합인지 알아보자.
로마에서는 숫자 I, V, X, L 4개를 사용한다고 하였는데, 이 때 이 숫자들이 의미하는 것이 { 1, 5, 10, 50 } 이라고 하였다.
그렇다면 4개중에 2개를 뽑아보자.
아마, II, IV, IX, IL, VI, VV, VX, VL, XI, XV, XX, XL, LI, LV, LX, LL 이렇게 나올 것이다.
이 때 위에서 진자헥 표시된 2개의 숫자를 한번 봐보도록 하자. 저 2개의 숫자는 다른 숫자일까??
뭐 실제 로마숫자에서는 다른 숫자일수도 있다. 그런데 이 문제에서는 각 숫자들의 합을 의미한다고 하였다.
즉, I + X 나, X + I 나 똑같은 숫자라는 것이다. 이 말은 순서에 영향을 미치지 않는다는 말이다.
{ I, X } 를 뽑나 { X, I }를 뽑는 것이 같은 경우이기 때문이다.
즉, 우리는 중복조합을 구현하게 되면, 이 문제의 답을 출력해낼 수 있는 것이다.
아직 중복조합에 대해서 잘 알지 못한다면 아래의 글을 읽고 문제를 해결해 보도록 하자.
[ 소스코드 ]
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include<iostream> #define endl "\n" using namespace std; int N, Answer; int Roma[] = { 1, 5, 10, 50 }; bool Visit[1000 + 1]; void Input() { cin >> N; } void DFS(int Cnt, int D, int Total) { if (Cnt == N) { if (Visit[Total] == false) { Visit[Total] = true; Answer++; } return; } for (int i = D; i < 4; i++) { DFS(Cnt + 1, i, Total + Roma[i]); } } void Solution() { DFS(0, 0, 0); cout << Answer << endl; } void Solve() { Input(); Solution(); } int main(void) { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("Input.txt", "r", stdin); Solve(); return 0; } | cs |
'[ BOJ Code ] > # BOJ -' 카테고리의 다른 글
[ 백준 16926 ] 배열 돌리기1 (C++) (0) | 2019.07.07 |
---|---|
[ 백준 16923 ] 다음 다양한 단어 (C++) (0) | 2019.07.07 |
[ 백준 16917 ] 양념 반 후라이드 반 (C++) (0) | 2019.07.07 |
[ 백준 2933 ] 미네랄 (C++) (4) | 2019.07.05 |
[ 백준 16987 ] 계란으로 계란치기 (C++) (2) | 2019.07.05 |