https://www.acmicpc.net/problem/1476
문제
> 준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다.
> 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다.
> 각각의 수는 지구, 태양, 그리고 달을 나타낸다.
> 지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때,
이 세 수는 서로 다른 범위를 가진다.
(1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)
> 우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다.
> 1년이 지날 때마다, 세 수는 모두 1씩 증가한다.
> 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.
> 예를 들어, 15년은 15 15 15로 나타낼 수 있다.
> 하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다.
> 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.
> E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때,
준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.
접근
1,1,1부터 시작해서 1일씩 계속 더해나가다는데 각각 15, 28, 19를 넘어가게 되면 1로 초기화 해주며 증가시켜나간다.
그러다 세 수가 각각 예제의 입력으로 주어진 수와 같아지면 총 누적된 일 수를 출력한다.
문제해결
> E,S,M에 예제에 입력으로 들어오는 수를 입력받는다. 이는 목표하는 수 이다.
> 증가시킬 수 e, s, m을 각각 초기값 1로 주고 while문을 들어간다.
> e,s,m이 전부 E,S,M이 될 때까지 반복을 돌려주며 증가시킨다.
> 이 때, 각각 15, 28, 19를 넘어가면 1로 다시 초기화 해준다.
> 총 지난 년 수를 누적하기 위해 rst에 누적시킨다.
코드
import java.io.*;
import java.util.*;
import java.lang.*;
public class Main {
//1476번 날짜 계산
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
public static void main(String[] args) throws IOException {
st = new StringTokenizer(br.readLine());
int E = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int e = 1, s = 1, m = 1, rst = 1;
while(e != E || s != S || m != M) {
e++;
s++;
m++;
if(e > 15) e = 1;
if(s > 28) s = 1;
if(m > 19) m = 1;
rst++;
}
System.out.print(rst);
}
}

후기
시간 초과가 나서 매 while문 마다 %연산을 해줘서 그런가 해서 다른 공식이 있나 계속 찾아봤다.
결론적으로 문제는 %연산을 하면 문제에선15, 28, 19가 넘어가면 1로 바뀌어야 하는데 난 0으로 바뀌게 되어 무한루프가 나왔던것이다.