문제
최근에 ICPC 탐사대는 남아메리카의 잉카 제국이 놀라운 문명을 지닌 카잉 제국을 토대로 하여 세워졌다는 사실을 발견했다. 카잉 제국의 백성들은 특이한 달력을 사용한 것으로 알려져 있다. 그들은 M과 N보다 작거나 같은 두 개의 자연수 x, y를 가지고 각 년도를 <x:y>와 같은 형식으로 표현하였다. 그들은 이 세상의 시초에 해당하는 첫 번째 해를 <1:1>로 표현하고, 두 번째 해를 <2:2>로 표현하였다. <x:y>의 다음 해를 표현한 것을 <x':y'>이라고 하자. 만일 x < M 이면 x' = x + 1이고, 그렇지 않으면 x' = 1이다. 같은 방식으로 만일 y < N이면 y' = y + 1이고, 그렇지 않으면 y' = 1이다. <M:N>은 그들 달력의 마지막 해로서, 이 해에 세상의 종말이 도래한다는 예언이 전해 온다.
예를 들어, M = 10 이고 N = 12라고 하자. 첫 번째 해는 <1:1>로 표현되고, 11번째 해는 <1:11>로 표현된다. <3:1>은 13번째 해를 나타내고, <10:12>는 마지막인 60번째 해를 나타낸다.
네 개의 정수 M, N, x와 y가 주어질 때, <M:N>이 카잉 달력의 마지막 해라고 하면 <x:y>는 몇 번째 해를 나타내는지 구하는 프로그램을 작성하라.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다. 각 줄에는 네 개의 정수 M, N, x와 y가 주어진다. (1 ≤ M, N ≤ 40,000, 1 ≤ x ≤ M, 1 ≤ y ≤ N) 여기서 <M:N>은 카잉 달력의 마지막 해를 나타낸다.
출력
출력은 표준 출력을 사용한다. 각 테스트 데이터에 대해, 정수 k를 한 줄에 출력한다. 여기서 k는 <x:y>가 k번째 해를 나타내는 것을 의미한다. 만일 <x:y>에 의해 표현되는 해가 없다면, 즉, <x:y>가 유효하지 않은 표현이면, -1을 출력한다.
예제 입력 1
3
10 12 3 9
10 12 7 2
13 11 5 6
Plain Text
복사
예제 출력 1
33
-1
83
Plain Text
복사
My solution
날짜 계산에서 사용한 중국인의 나머지 정리를 다시 사용하는 문제다.
하나의 숫자를 증가시키면서 나머지 연산을 했을 때 나누는 값을 넘어가면 다시 1부터 증가하기 시작한다.
이 문제에서도 나머지 정리를 사용하지 않으면 1 ≤ M, N ≤ 40,000이기 때문에 시간초과 발생
→ M으로 N을 구해야 한다.
result를 -1로 초기화 한 후,
while문으로 (x-y) 이 n으로 나누어 떨어질 때 x 값이 result가 된다.
나누어 떨어지지 않으면, x에 M만큼 더해줘서 M만큼 한 바퀴씩 돌려준다. 굳이 1씩 더해주지 않고도 구현할 수 있는 방법이다.
다른 풀이 - 최소 공배수로 해도 시간 초과가 난다!
이 반복의 끝이 바로 문제에 나오는 '종말의 해' 인데 이 날을 구하는 방법은 바로 N과 M의 최소 공배수를 구하는 것입니다. 이 N과 M의 최소공배수를 G라고 한다면 이 G번째 해가 달력의 마지막이기 때문에 첫번째 해부터 G번째 해까지 <X,Y>로 표현되는 해가 없다면 <X,Y> 가 유효하지 않은 표현이고 따라서 -1을 출력해주면 되는겁니다.
Code
const solution = function (i) {
const TC = i
.toString()
.trim()
.split('\n')
.map(v => v.split(' ').map(Number));
TC.shift();
let result = '';
for (const [M, N, x, y] of TC) {
let X = x;
let year = -1;
while (X <= M * N) {
if ((X - y) % N === 0) {
year = X;
break;
}
X += M;
}
result += year + '\n';
}
console.log(result.substring(0, result.length - 1));
return result.substring(0, result.length - 1);
};
describe('카잉달력', () => {
it('TC1', () => {
expect(
solution(`3
10 12 3 9
10 12 7 2
13 11 5 6`)
).toStrictEqual(`33
-1
83`);
});
});
JavaScript
복사