[백준] 1476번 날짜 계산

Peace·2021년 1월 30일
0

[백준] 1476번 날짜 계산

문제 링크: 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이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.

출력

첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.

문제 이해

날짜 계산을 좀 어렵게 한다. 지구(E), 태양(S), 달(M)이 존재하고, 1년 지날 때마다 셋의 숫자가 1씩 증가한다. 세 숫자는 각각 15, 28, 19를 넘을 수 없고 넘는다면, 1로 되돌아간다. 이때 입력으로 들어온 세 숫자를 통해 몇년인지 계산하는 문제이다.

문제 접근

brute-force로 재귀 함수로 풀어 봤다.
1. 입력을 받는다.
2. 1,1,1부터 체크를 한다.
3. 각 숫자의 상한선을 넘는지 체크한다.그리고 지금 세고 있는 날짜와 입력받은 날짜가 동일한 지 체크한다. 만약 동일하다면 year를 출력하고, 아니라면 year에 +1을 하고, 각 숫자에게도 +1하여 재귀 호출을 한다.

코드 구현(c++)

#include <iostream>

using namespace std;

int resultE, resultS, resultM;

int year = 1;

bool checkResult(int e, int s, int m){
    if(e == resultE && s == resultS && m == resultM) return true;
    return false;
}

int countYear(int e, int s, int m){
    if(e > 15) e = 1;
    if(s > 28) s = 1;
    if(m > 19) m = 1;
    if(checkResult(e, s, m)) return year;
    year++;
    
    return countYear(e + 1, s + 1, m + 1);
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);

    cin >> resultE >> resultS >> resultM;

    cout << countYear(1,1,1) << "\n";
}

평가

다시 처음으로 돌아와 brute-force를 풀려고 한다. 최대한 brute-force형식으로 풀고, 다음에 dp로 풀 때 도움될 수 있도록 해야겠다.

profile
https://peace-log.tistory.com 로 이사 중

0개의 댓글

관련 채용 정보