접근 방식 : E, S ,M 값의 주기는 1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19 이다. 준규가 사는 나라의 년도를 X로 했을 때, 입력으로 주어지는 E,S,M은 X를 각 변수의 최대값으로 나눈 나머지라고 볼 수 있다. 즉, E를 예로 든다면 X = aM + E (M은 몫) 관계가 성립한다. 따라서 X의 값은 X-E, X-S, X-M 을 각각 15, 28, 19 로 나누었을 때 동시에 나머지가 0이 되는 숫자중 최솟값이다.
1년도부터 시작해서 하나하나 체크하면서 X 값이 될 수 있는지 판단했다. 문제는 범위를 어디까지 돌려야하냐는건데 세 수의 주기를 보면 15,28,19 인데 이 세 수는 모두 서로소이다. 세 수가 모두 서로소 라는건 주기가 15*28*19라는 얘기다. 예를 들어 E,S,M 값의 순서쌍 (x, y, z) 가 n일이 지난 후 (x, y, z)로 왔다면 n은 반드시 15의 배수이면서 28의 배수이면서 19의 배수일 수 밖에 없다. 그래야 15로 나눈 나머지와 28로 나눈나머지와 19로 나눈 나머지가 같기 때문이다. 따라서 이 문제에서는 순서쌍이 7980개이고 따라서 7980개 이후로는 똑같은 순서쌍이 반복된다. 나는 그냥 10000으로 설정하고 반복문을 돌렸다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> using namespace std; int E, S, M; void solve() { for (int i = 1; i <= 10000; i++) { if (((i - E) % 15) == 0 && ((i - S) % 28) == 0 && ((i - M) % 19) == 0) { cout << i << endl; return; } } } int main() { cin >> E >> S >> M; solve(); return 0; } | cs |
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[BOJ 14500] 테트로미노 (0) | 2018.08.06 |
---|---|
[BOJ 1107] 리모컨 (0) | 2018.08.06 |
삼성 S/W expert 2115번 벌꿀 채취 (0) | 2018.06.07 |
삼성 S/W expert 2117번 홈 방범 서비스 (0) | 2018.06.05 |
삼성 S/W expert 2382번 미생물 격리 (0) | 2018.05.31 |