πŸ“ Coding Test Study/Algorithm Problem

[Baekjoon][C++] 1476번 λ‚ μ§œκ³„μ‚° λ¬Έμ œμ„€λͺ… 및 μ½”λ“œ

ibelieveinme 2021. 3. 3. 01:49
728x90
 

1476번: λ‚ μ§œ 계산

μ€€κ·œκ°€ μ‚¬λŠ” λ‚˜λΌλŠ” μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” 연도와 λ‹€λ₯Έ 방식을 μ΄μš©ν•œλ‹€. μ€€κ·œκ°€ μ‚¬λŠ” λ‚˜λΌμ—μ„œλŠ” 수 3개λ₯Ό μ΄μš©ν•΄μ„œ 연도λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 각각의 μˆ˜λŠ” 지ꡬ, νƒœμ–‘, 그리고 달을 λ‚˜νƒ€λ‚Έλ‹€. 지ꡬλ₯Ό λ‚˜νƒ€

www.acmicpc.net

β–· λ¬Έμ œμ„€λͺ…

μ€€κ·œκ°€ μ‚¬λŠ” λ‚˜λΌλŠ” 연도λ₯Ό ν‘œν˜„ν•  λ•Œ E, S, M μ„Έ 문자둜 ν‘œν˜„ν•œλ‹€.

각각의 λ¬Έμžκ°€ κ°€μ§€λŠ” λ²”μœ„λŠ” 1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19 이닀.

E, S, M이 μ£Όμ–΄μ§ˆ λ•Œ,  E S M으둜 ν‘œμ‹œλ˜λŠ” κ°€μž₯ λΉ λ₯Έ 연도λ₯Ό 좜λ ₯ν•˜μž.

 

β–· λ¬Έμ œν’€μ΄

이 문제의 경우 ν‘œν˜„ν•  수 μžˆλŠ” λ…„λ„λŠ” 15 * 28 * 19 = 7980λ…„κΉŒμ§€ μ΄λ―€λ‘œ

브루트포슀 λ°©λ²•μœΌλ‘œ 1λ…„ λΆ€ν„° 7980λ…„κΉŒμ§€ κ΅¬ν•˜λ‹€κ°€ μ •λ‹΅κ³Ό κ°™μ•„μ§€λŠ” μˆœκ°„μ„ 찾으면 λœλ‹€.

 

이 λ•Œ, λ¬Έμ œμ—μ„œ μ£Όμ–΄μ§„ E, S, M의 값은

year mod 15 = E,

year mod 28 = S,

year mod 19 = M λ₯Ό λ‚˜νƒ€λ‚΄λ―€λ‘œ(λ‚˜λ¨Έμ§€ κ°’)

 

1λ…„ λΆ€ν„° 7980λ…„κΉŒμ§€ 연도λ₯Ό μ¦κ°€μ‹œν‚¬ λ•Œ,

ν˜„μž¬ 연도 yearλ₯Ό year % 15 && year % 28 && year % 19 둜 κ³„μ‚°ν–ˆμ„ λ•Œ,

κ·Έ 값듀이 μ£Όμ–΄μ§„ E, S, M의 κ°’κ³Ό λͺ¨λ‘ μΌμΉ˜ν•œλ‹€λ©΄ ν˜„μž¬μ˜ 연도가 μ •λ‹΅ 연도이닀.

 

β–· μ‹œκ°„λ³΅μž‘도

ν‘œν˜„ν•  수 μžˆλŠ” 년도λ₯Ό N이라 ν•˜λ©΄, Nκ°€μ§€μ˜ 경우의 μˆ˜κ°€ ν•„μš”ν•˜λ―€λ‘œ O(N)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°–λŠ”λ‹€.

 

β–· μ •λ‹΅μ½”λ“œ

#include <iostream>
using namespace std;

void Input();
void CalculateYear(int E, int S, int M);

int main() {
	Input();
	return 0;
}

void Input() {
	int E, S, M;
	cin >> E >> S >> M;
	CalculateYear(E, S, M);
}

void CalculateYear(int E, int S, int M) {
	int e = 1, s = 1, m = 1;
	for (int year = 1; ; year++) {
		if (e % 15 == E % 15 &&
			s % 28 == S % 28 &&
			m % 19 == M % 19){
			cout << year;
			break;
		}e++, s++, m++;
	}
}
728x90