Calculate Date(by Modular)

나의 문제 접근 방법

ex) E = 1, S = 2, M = 3 동일한 n에 대해 다음의 3가지 조건을 만족하는 n이 정답이라고 생각했다. 15*n + 1 == E && 28*n + 2 == S && 19*n == M 나머지 연산을 사용할 경우 위를 반대로 생각해서 E, S, M을 각각 15, 28, 19로 나눈 나머지를 n이라고 하면 n은 0부터 계속해서 1씩 증가하고, n%15 == E && n%28 == S && n%19 == M 3가지를 동시에 만족하는 n을 찾으면 된다.

하지만 이것마저도 오류가 좀 있다. 1. 대표적으로 E를 들면 n = 15/30/45/...15의 배수일 때 나머지는 0이 되는데, n=15라면 이것은 15가 되어야 한다. 그래서 나머지마 0이 되버리는 것을 방지하기 위해 적절하게 조작해주어야 한다. (S와 M도 마찬가지이다. n이 28의 배수이거나 n이 19의 배수일 때 나머지가 0이 되면 안 되고 28, 19로 남아있어야 한다.)

어떻게 조작할 것인가?

E) n = 15, n%15 = 15를 만들려면, n-1을 해주고 나오는 나머지 14에 대해 +1을 해준다. => n = 17, (n-1)%15 = 16%15 = 1 + 1 = 2(정답) S와 M도 마찬가지이다.

이제 n을 0부터 1씩 계속해서 증가시키며 n%15==E-1 && n%28==S-1 && n%19==M-1 를 만족하는 n을 찾아서 n+1이 정답이 된다.

2. n이 0부터 시작하는 이유

입력받는 수 E,S,M에서 -1씩 해주고, n을 15,28,19로 나누었을 때 나머지 +1이 정답이 된다. E, S, M이 숫자 그 자체로 1,1,1 이고 i는 1부터 시작하면 정답이 되지만 아래와 같은 오류가 있기 때문에 E-1,S-1,M-1을 해주기 때문ㅇ에 i도 1이 아닌 0부터 시작해야한다.

소스 코드 구현

import java.util.*;
public class CalculateDateESM_Modular_2nd {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int E = sc.nextInt()-1;
		int S = sc.nextInt()-1;
		int M = sc.nextInt()-1;
		for(int i=0;;i++) {//i가 1이 아니라 0부터 시작하는 이유 이해하기.
			if(i%15 == E && i%28 == S && i%19 == M) {//동일한 i에 대해 3가지 조건을 만족하면 
				System.out.println(i+1);
				break;
			}
		}
		
	}

}

Last updated