출처 : https://www.acmicpc.net/problem/1476
1. 문제 설명
준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구(E), 태양(S), 달(M)이다.
(1 <= E <= 15, 1 <= S <= 28, 1 <= M <= 19)
우리가 알고있는 1년은 준규가 사는 나라에서 1 1 1로 나타낸다. 1년이 지날 때 마다 세 수는 모두 1씩 증가하며 범위를 넘어가는 경우에 다시 1이 된다. 예를 들어 15 15 15 일 때, 1년이 지나면 E는 범위를 넘어가기 때문에 1 16 16 이 되는 것이다. 1년이 준규가 사는 나라에서 1 1 1 일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하라.
2. 접근 방식 및 시간복잡도
방법 1. for문을 이용해 i=1부터 종료 조건 없이 i를 1씩 증가시켜준다. e, s, m이 조건에 만족한다면 출력 후 반복문 종료, 아니라면 각 변수의 값을 1씩 증가시켜주면서 범위를 벗어날 경우 다시 1로 초기화시켜준다.
방법 2. (i=0부터) %연산자를 사용하기 위해 각 변수를 -1씩 해주고 i를 15, 28, 19로 %연산을 했을 때의 값이 조건과 일치한다면 i에 1을 더해주고 출력해준다.
둘 다 비슷한 방법인데 직관적으로는 방법 1이 더 쉽게 느껴진다.
시간복잡도 : O(N)
3. 내 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// E = 15, S = 28, M = 19
StringTokenizer st = new StringTokenizer(br.readLine());
int E = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
/*// 방법 1.
int e=1, s=1, m=1; // 1년이 준규가 사는 나라에서 1 1 1
for(int i = 1; ; i++) {
if(E == e && S == s && M == m) {
System.out.println(i); break;
}
e++; s++; m++;
if(e == 16) e = 1;
if(s == 29) s = 1;
if(m == 20) m = 1;
}*/
E -= 1; S -= 1; M -=1;
for(int i = 0; ; i++) {
if(i % 15 == E && i % 28 == S && i % 19 == M) {
System.out.println(i+1); break;
}
}
}
}
4. 느낀 점
쉬운 문제 빠르게 푸는 연습하기!