[백준] Baekjoon Online Judge
문제
먹고또자니 <거기 누구세요> 코너에서는 "돌림판"을 돌려 상품을 얻을 수 있다. 이 돌림판은 큰 원형판이 N등분되어있는 형태이다.
N등분 된 각 부분은 0부터 9사이의 숫자가 하나씩 적혀있다. 게임이 시작되면, 임의의 M자리의 수 X와 Y(X ≤ Y)가 주어진다. (단, 이 수는 0으로 시작될 수도 있다.)
그리고 참가자는 돌림판을 힘차게 돌린다. 힘차게 돌던 돌림판이 완전히 멈추게 되는 순간, 12시 방향의 스피너가 특정 부분을 가리키게 될 것이다. 거기서부터 시계방향으로 M칸 연속되는 수를 읽으면 M자리의 수 Z를 얻을 수 있다.
이때 얻은 Z가 X ≤ Z ≤ Y를 만족한다면 게임을 승리하고 Z만원을 얻을 수 있다!

예를 들어, 돌림판이 N = 8 등분되어있고, 시계방향으로 읽었을 때 [3, 7, 8, 3, 1, 9, 2, 7] 과 같다고 하자. X = 200 이고 Y = 311일 경우 "숫자 2"가 적힌 부분부터 시작한다면 Z = 273 으로 X = 200 ≤ 273 ≤ 311 = Y 를 만족하여 게임을 승리한다.
돌림판의 상태와 X, Y가 주어질 때 어느 부분부터 시작하면 게임을 승리할 수 있을 지 알 수 있다. 주어진 조건에 대해서 게임을 승리할 수 있는 가지수를 계산하는 프로그램을 작성하시오.
입력
첫 번째 줄에 테스트케이스의 개수 T가 주어진다.
각 테스트케이스의 첫 줄에는 돌림판을 N등분할 정수 N (1 ≤ N ≤ 100)과 X, Y의 길이 M (1 ≤ M ≤ 9, M ≤ N) 이 주어진다. 그리고 다음 3개의 줄에 X의 각 자리수, Y의 각 자리수, 돌림판의 상태가 주어진다.
X와 Y의 각 자리수는 공백으로 구분되어 0~9사이의 숫자가 한자리씩 주어진다.
돌림판의 상태는 어느 부분부터 시계방향으로 읽었을 때 나타나는 순서대로 주어진다. 돌림판의 숫자도 0~9사이의 숫자가 공백으로 구분되어 주어진다.
출력
각 테스트케이스에 대하여 한 줄씩 정답을 출력한다.
즉, 돌림판에서 X ≤ Z ≤ Y를 만족하는 M자리의 수 Z가 몇 개가 있는 지를 출력한다. 단, 같은 수라도 시작 부분이 다르다면 다른 가지수로 센다. 예를 들어, X와 Y 사이에 있는 수가 123 밖에 없는 데 돌림판에서 2번 나온다면, 1이 아닌 2를 출력한다.
풀이
#include <iostream>
using namespace std;
int N, M;
int X[10], Y[10];
int num[101];
int makeNum(int start, int arr[]);
// 배열을 int로 바꾸기
int makeNum(int start, int arr[]) {
int n = 0;
for (int i = 0; i < M; i++) {
int idx = (start + i) % N;
n = n * 10 + arr[idx];
}
return n;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while (T--) {
// 입력
cin >> N >> M;
for (int i = 0; i < M; i++) cin >> X[i];
for (int i = 0; i < M; i++) cin >> Y[i];
for (int i = 0; i < N; i++) cin >> num[i];
int x = makeNum(0, X);
int y = makeNum(0, Y);
// 게임을 승리할 수 있는 가짓수 구하기
int cnt = 0;
for (int i = 0; i < N; i++) {
int z = makeNum(i, num);
if (x <= z && z <= y) cnt++;
}
// 출력
cout << cnt << '\n';
}
return 0;
}
// 배열을 int로 바꾸기
int makeNum(int start, int arr[]) {
int n = 0;
for (int i = 0; i < M; i++) {
int idx = (start + i) % N;
n = n * 10 + arr[idx];
}
return n;
}
입력 받은 배열을 M자리의 int형 수로 바꿔주는 함수이다. 배열의 시작점과 숫자로 바꿔야 하는 배열이 한가지가 아니기에 이를 매개변수로 받도록 했다.
int x = makeNum(0, X);
int y = makeNum(0, Y);
// 게임을 승리할 수 있는 가짓수 구하기
int cnt = 0;
for (int i = 0; i < N; i++) {
int z = makeNum(i, num);
if (x <= z && z <= y) cnt++;
}
위의 함수로 만든 숫자 z가 범위에 속한다면 cnt를 증가시킨다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 3595번 - 맥주 냉장고 (0) | 2025.04.14 |
---|---|
[Baekjoon/C++] 17283번 - I am Groot (0) | 2025.04.13 |
[Baekjoon/C++] 5032번 - 탄산 음료 (0) | 2025.04.11 |
[Baekjoon/C++] 11505번 - 구간 곱 구하기 (0) | 2025.04.10 |
[Baekjoon/C++] 29615번 - 알파빌과 베타빌 (0) | 2025.04.09 |