https://www.acmicpc.net/problem/1476
3일만의 다시 코딩문제!
문제를 읽으면 이게 뭔가 싶다
제목은 분명 날짜 계산인데 년도만 구하는 문제고 도대체 어디서 살길래 태왕과 지구와 달의 돌아가는걸 세고있는지
아무튼
각각 횟수로 샐수있는 최대값이 주어지고 1년마다 태양과 지구와 달의 숫자가 1씩 올라갈때
이만큼 돌아갔으면 몇년인가! 라는걸 찾는 문제다
이런 문제내는 사람들 보면 참 아이디어가 좋아
정답률이 66퍼를 돌파해서 와! 쉬운문제! 하고 달려들었다가 골치가좀 아팠다
어떻게 풀까 고민하다가
결국 가장 직관적인 방법을 선택했는데
e와 s와 m중 가장 크게 값을 유지하는 녀석을 뽑고 -> s
s값이 고정일때 m값을 돌려서 같은 값을 찾고
찾았다면 이젠 e값을 찾고 해서 다 통과하면 값을 반환해주는 식으로 끝냈다
대충 식으로 풀자면
earth * 15 + 10(e로 들어온값) == sun * 28 + 20(s로 들어온값) == moon * 19 + 12(m으로 들어온값)
각각 전부 반복문으로 찾아 값이 같은경우가 나올때까지 무한반복!
정말 무식한 방법이 아닐 수가 없다.
#include <stdlib.h>
#include <stdio.h>
/**
q1476 날짜 계산
*/
// k * 15 ... 10 == j * 28 ... 20 == n * 19 ... 12
#define EBASE 15
#define SBASE 28
#define MBASE 19
int match(int target, int base, int max) {
int i = 0;
while (1) {
int mulTarget = base * i + target;
i++;
if (mulTarget == max) return 1;
else if (mulTarget > max) return -1;
}
return -1;
}
/// param: sun, moon, earth
int findMulSun(int sun, int moon, int earth) {
int i = 0;
while (1) {
int mulSun = SBASE * i + sun;
i ++;
// find moon
int matchResult = match(moon, MBASE, mulSun);
if (matchResult == -1) {
// 일치값을 찾지 못하고 값이 넘어섰다. mulSun값을 변화시켜 다시 시도
continue;
}
// find earth
matchResult = match(earth, EBASE, mulSun);
if (matchResult == -1) {
// 일치값을 찾지 못하고 값이 넘어섰다. mulSun값을 변화시켜 다시 시도
continue;
}
// 값을 찾았음.
return mulSun;
}
}
int main(int argc, const char * argv[]) {
int earth = 0, sun = 0, moon = 0;
if (scanf("%d", &earth) == EOF) {
// NZEC에러가 나서 EXIT_FAILURE에서 0으로 변경
return 0;
}
scanf("%d", &sun);
scanf("%d", &moon);
// 우선 작은 애들은 그냥 넘기자
// 1 ~ 15
if (earth == sun && sun == moon) {
printf("%d\n", earth);
return EXIT_SUCCESS;
}
int result = findMulSun(sun, moon, earth);
printf("%d\n", result);
return EXIT_SUCCESS;
}
아 테스트로 돌렸던 소스가 있는데 굳이 필요한가 싶지만 이것도 같이.
/**
e s m 순
15 15 15 15
16 1 16 16
17 2 17 17
18 3 18 18
19 4 19 19
20 5 20 1
21 6 21 2
22 7 22 3
23 8 23 4
24 9 24 5
25 10 25 6
26 11 26 7
27 12 27 8
28 13 28 9
29 14 1 10
1 1 1 1
5266 1 2 3
7980 15 28 19
*/
int test_earth [] = {
15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1, 1, 15
};
int test_sun [] = {
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 1, 1, 2, 28
};
int test_moon [] = {
15,16,17,18,19,1,2,3,4,5,6,7,8,9,10,1,3,19
};
int test_answer [] = {
15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,1,5266,7980
};
int test_e_size = sizeof(test_earth) / sizeof(test_earth[0]);
int test_s_size = sizeof(test_sun) / sizeof(test_sun[0]);
int test_m_size = sizeof(test_moon) / sizeof(test_moon[0]);
int test_answer_size = sizeof(test_answer) / sizeof(test_answer[0]);
if (test_e_size != test_s_size ||
test_e_size != test_m_size ||
test_e_size != test_answer_size
) {
return EXIT_FAILURE;
}
printf("success test_size > %d\n", test_e_size);
for (int i = 0; i < test_e_size; i ++) {
int result = findMulSun(test_sun[i], test_moon[i], test_earth[i]);
if (result != test_answer[i]) {
printf("ERROR: %d, %d, %d => %d 가 나와야합니다. 결과값: %d \n", test_earth[i], test_sun[i], test_moon[i], test_answer[i], result);
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
뭐 별거없다
그렇게 끝!
https://github.com/wiwi-git/c-baekjoon/tree/main/q1476
c-baekjoon/q1476 at main · wiwi-git/c-baekjoon
블로그 업데이트용 백준 코드. Contribute to wiwi-git/c-baekjoon development by creating an account on GitHub.
github.com
'C,C++' 카테고리의 다른 글
| [C]백준 Q.3085 사탕 게임 (0) | 2026.01.10 |
|---|---|
| [C]백준 Q.2309 일곱난장이 (1) | 2026.01.05 |
| [C]백준 Q.6588 골드바흐의 추측 (0) | 2026.01.03 |
| [C]백준 Q.2609,1978,1929 최대공약수 ~ 소수 문제 (0) | 2025.12.18 |
| [C]백준 Q.17425 약수의 합 1 (0) | 2025.12.14 |