1476) 날짜계산

경지현·2023년 8월 15일

algorithm_study

목록 보기
21/21

문제요약

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 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이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.
따라서, 주어진 세 숫자(각각 어떤 수의 15, 28, 19의 나머지 비슷한 것) 이 주어졌을 때, 그 어떤 수를 찾는 문제

문제 풀이

이걸 어떻게 수식으로 세울지 고민했지만 답이 안나와서 무식하게 1에서부터 조금씩 늘려가면서 하는 코드를 작성했더니 성공!
근데 그냥 1단위로 숫자를 늘리지 않고 가장 큰 28이라는 단위를 가지고 접근했다. 28*i+S(S는 28의 나머지 같은 거)라는 수식에서 i를 1씩 늘리면서 구했다.

코드

#include<iostream>
 
using namespace std;
int solution(int E, int S, int M){
    int n,tmp, i=0;
    while(true){
        tmp=28*i+S;
        if(tmp%15 == E){
            if(tmp%19 == M){
                n = tmp;break;
            }
            else if(tmp%19==0&&M == 19){
                n = tmp;break;
            }
        }
        else if(E == 15&&tmp%15 == 0){
            if(tmp%19 == M){
                n = tmp;break;
            }
            else if(tmp%19==0&&M == 19){
                n = tmp;break;
            }
        }
        i++;
    }
    return n;
}
int main(){
    int E, S, M;
    scanf("%d %d %d", &E, &S, &M);
    int n = solution(E, S, M);
    cout<<n;
}
profile
그냥 사람

0개의 댓글