문제
m면 주사위와 n면 주사위를 각각 한 번씩 굴렸을 때, 두 주사위의 합이 정확히 10이 되는 경우의 수를 구한다. 각 주사위는 1부터 해당 면의 수까지의 값을 가진다.
결과가 1가지이면 "There is 1 way to get the sum 10.", 그 외에는 "There are X ways to get the sum 10."을 출력한다.
입력
첫 번째 줄에 두 정수 m, n이 주어진다. m은 첫 번째 주사위의 면 수, n은 두 번째 주사위의 면 수이다.
출력
두 주사위의 합이 10이 되는 경우의 수에 따라 정해진 형식으로 한 줄을 출력한다.
예제
| 입력 | 출력 |
|---|---|
6 6 | There are 3 ways to get the sum 10. |
1 9 | There is 1 way to get the sum 10. |
풀이
m면 주사위와 n면 주사위의 합이 10이 되는 경우를 순회하여 개수를 센다.
- 첫 번째 주사위 값
i를 1부터 m까지 순회한다. - 두 번째 주사위 값은
10 - i가 되어야 한다. 10 - i가 1 이상 n 이하이면 유효한 경우이므로ways를 증가시킨다.- 최종
ways값에 따라 단수형 또는 복수형 문장을 출력한다.
핵심 아이디어: 첫 번째 주사위 값을 고정하면 두 번째 주사위 값이 자동으로 결정된다. 따라서 O(m) 순회만으로 모든 경우를 열거할 수 있다.
코드
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m, n;
cin >> m >> n;
int ways = 0;
for (int i = 1; i <= m; i++)
{
if (10 - i >= 1 && 10 - i <= n)
ways++;
}
if (ways == 1)
cout << "There is 1 way to get the sum 10." << "\n";
else
cout << "There are " << ways << " ways to get the sum 10." << "\n";
return 0;
}복잡도
- 시간: O(m) — 첫 번째 주사위 면 수만큼 순회
- 공간: O(1) — 추가 자료구조 없이 카운터 변수만 사용