문제유형
*완전탐색
문제
준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 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 16 16 |
(출력 1) | 16 |
(입력 2) | 1 2 3 |
(출력 2) | 5266 |
풀이
1. E, S, M을 입력 받아서 입력값 E와 M을 각각 15와 19로 나눴을 때의 나머지 값으로 갱신한다. (S의 범위가 가장 크기 때문에, 28의 배수를 기준으로 삼는다)
2. while문을 이용하여, num값이 15, 28, 19로 나눴을 때 각 E, S, M의 나머지와 같은 경우 반복문 멈춘뒤, 답을 구한다.
예를 들어서, num = 7980, E = 15, S = 28, M = 19일 때 갱신된 E와 M은 0이 되고
[E] 7980 = 15*532 + 0, [S] 7980 = 28*284 + 28, [M] 7980 = 19*420 + 0
이므로 num값이 각각 15, 28, 19로 나눈 나머지가 주어진 E, S, M값인 경우 반복문을 멈춘 뒤 답을 얻는 것이다.
코드
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int E, S, M;
cin >> E >> S >> M;
if (E>=15) E = E%15;
if (M>=19) M = M%19;
int num, cnt=0;
while (true) {
num = 28*cnt + S;
if (num%15 == E && num%19 == M) break;
else cnt++;
}
cout << num;
return 0;
}
'Koala - 13기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[백준/C++] 14889 스타트와 링크 (0) | 2024.01.14 |
---|---|
[백준/C++] 2003번: 수들의 합 2 (0) | 2024.01.13 |
[백준/Python] #2548 대표 자연수 (0) | 2024.01.13 |
[Baekjoon/C++] 15654: N과 M (5) (0) | 2024.01.12 |
[프로그래머스/Python] 소수 찾기 (0) | 2024.01.10 |