λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[λ°±μ€€] 1476. λ‚ μ§œ 계산

 

πŸ“ͺ [λ‚ μ§œ 계산 [1476번]

 

 

1476번: λ‚ μ§œ 계산

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

www.acmicpc.net

 


 

 

πŸ“‹ λ¬Έμ œμ„€λͺ…

  • μ€€κ·œκ°€ μ‚¬λŠ” λ‚˜λΌλŠ” μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” 연도와 λ‹€λ₯Έ 방식을 μ΄μš©ν•œλ‹€. μ€€κ·œκ°€ μ‚¬λŠ” λ‚˜λΌμ—μ„œλŠ” 수 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이 μ£Όμ–΄μ§„λ‹€. λ¬Έμ œμ— λ‚˜μ™€μžˆλŠ” λ²”μœ„λ₯Ό μ§€ν‚€λŠ” μž…λ ₯만 μ£Όμ–΄μ§„λ‹€.4

1 16 16

 

[좜λ ₯]

첫째 쀄에 E S M으둜 ν‘œμ‹œλ˜λŠ” κ°€μž₯ λΉ λ₯Έ 연도λ₯Ό 좜λ ₯ν•œλ‹€. 1 1 1은 항상 1이기 λ•Œλ¬Έμ—, 정닡이 μŒμˆ˜κ°€ λ‚˜μ˜€λŠ” κ²½μš°λŠ” μ—†λ‹€.

16

 

 

πŸ”‘ λ¬Έμ œν’€μ΄

1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19의 λ²”μœ„λ‘œ, 각각 15, 28, 19λ₯Ό μ£ΌκΈ°λ‹¨μœ„λ‘œ μˆœν™˜ν•¨μ„ μ•Œ 수 μžˆλ‹€. 

즉 μ΄λŠ” λ‚˜λ¨Έμ§€μ˜ κ°œλ…μ„ μ΄μš©ν•΄ λͺ¨λ“ˆλŸ¬(%)λ₯Ό 톡해, λ‹€μŒκ³Ό 같이 μ‹μœΌλ‘œ κ°„λ‹¨νžˆ ν‘œν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.

좜λ ₯κ°’ % μ£ΌκΈ°λ‹¨μœ„ = μž…λ ₯κ°’

 

ν—ˆλ‚˜ λͺ¨λ“ˆλŸ¬ μ—°μ‚°μ˜ 경우 N으둜 λͺ¨λ“ˆλŸ¬λ₯Ό ν•œλ‹€κ³  ν•˜μ˜€μ„ λ•Œ, κ°’μ˜ λ²”μœ„κ°€ 0λΆ€ν„° N-1κΉŒμ§€μ΄λ―€λ‘œ N일 경우, μ˜ˆμ™Έ μ²˜λ¦¬κ°€ ν•„μš”ν•˜λ‹€. (Ex. N=15일 경우, λͺ¨λ“ˆλŸ¬ μ—°μ‚°μ˜ κ²°κ³ΌλŠ” 0μ΄λ‚˜ ν•΄λ‹Ή λ¬Έμ œμ—μ„œ eλŠ” 15이기 λ•Œλ¬Έμ΄λ‹€.)

이λ₯Ό κ³ λ €ν•˜μ—¬ μž‘μ„±ν•œ 문제 풀이 μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

def check_e(earth, year_val) -> True:
    if year_val % 15 == 0 and earth == 15:
        return True
    elif year_val % 15 == earth:
        return True
    else:
        return False


def check_s(sun, year_val) -> True:
    if year_val % 28 == 0 and sun == 28:
        return True
    elif year_val % 28 == sun:
        return True
    else:
        return False


def check_m(moon, year_val) -> True:
    if year_val % 19 == 0 and moon == 19:
        return True
    elif year_val % 19 == moon:
        return True
    else:
        return False


e, s, m = map(int, input().split())

year = 1
while True:
    if check_e(e, year) and check_s(s, year) and check_m(m, year):
        print(year)
        break
    else:
        year += 1

 

μœ„μ˜ μ½”λ“œλ₯Ό μ’€ 더 닀듬어 보자.

λ¬Έμ œμ—μ„œ μ„Έ 수인 e, s, m의 λ²”μœ„λŠ” 1 ≤ e ≤ 15, 1 ≤ s ≤ 28, 1 ≤ m ≤ 19이닀.

λͺ¨λ“ˆλŸ¬ 연산을 ν†΅ν•œ 15, 28, 19의 κ²°κ³Όκ°’ λ²”μœ„λŠ” 0 ≤ _ ≤ 14,  0 ≤ _ ≤ 27,  0 ≤ _ ≤ 18이닀.

즉 μ΄λŠ” e-1, s-1, m-1둜 ν‘œν˜„μ„ ν™œμš©ν•˜μ—¬ 0 ≤ _ ≤ 14,  0 ≤ _ ≤ 27,  0 ≤ _ ≤ 18의 λ²”μœ„μ™€μ˜ μΌμΉ˜κ°€ κ°€λŠ₯ν•˜λ©°,
이와 같이 ν‘œν˜„μ‹œ μœ„μ™€ 달리 λ”°λ‘œ λ³„λ„μ˜ μ˜ˆμ™Έμ²˜λ¦¬κ°€ ν•„μš” μ—†λ‹€. (단, year 좜λ ₯μ‹œ +1 ν•„μš”)

이λ₯Ό κ³ λ €ν•œ 문제 풀이 μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

 

E, S, M = 15, 28, 19                    # μ£ΌκΈ° μƒμˆ˜
e, s, m = map(int, input().split())     # μž…λ ₯ κ°’

e -= 1
s -= 1
m -= 1                                  # ν‘œν˜„ 일치

year = 0

while True:
    if year % E == e and year % S == s and year % M == m:
        print(year + 1)
        break
    else:
        year += 1

 

 

ν•˜μ§€λ§Œ μœ μ‚¬ν•˜μ§€λ§Œ λ‹€λ₯Έ μ½”λ“œμΈ μ•„λž˜μ˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•΄λ³΄μž.

e,s,mμ—μ„œ 1을 λΉΌμ£Όκ³ , year을 좜λ ₯μ‹œ 1을 더해주지 μ•Šκ³ , λ‘˜λ‹€ μƒλž΅ν•˜μ—¬ μ½”λ“œλ₯Ό μ§€ 수 μ—†μ„κΉŒ?

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄ 닡은 ν•  수 없닀이닀. μ΄μœ λŠ” μ•„λž˜μ™€ κ°™λ‹€.

이와 같이 μ§  μ½”λ“œμ—μ„œ μ„Έ 수인 e, s, m의 λ²”μœ„λŠ” 1 ≤ e ≤ 15, 1 ≤ s ≤ 28, 1 ≤ m ≤ 19이닀.

ν—ˆλ‚˜ λͺ¨λ“ˆλŸ¬ 연산을 ν†΅ν•œ 15, 28, 19의 κ²°κ³Όκ°’ λ²”μœ„λŠ” 0 ≤ _ ≤ 14,  0 ≤ _ ≤ 27,  0 ≤ _ ≤ 18이닀.

λ”°λΌμ„œ μ΄λŠ” e=15, s=28, m=19인 경우만 생각해보더라도 "λ¬΄ν•œ 루프"λ₯Ό 돌게 λ˜λŠ” κ²½μš°κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.
즉, μ•žμ„œ λ§ν•œ μ½”λ“œμ˜ 경우, λΉ„κ΅μ—°μ‚°μžμ˜ μ’Œμ™€ 우의 비ꡐ λ²”μœ„κ°€ 달라 였λ₯˜κ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— λΆˆκ°€λŠ₯ν•˜λ‹€.

(μœ„μ˜ 두 μ½”λ“œμ™€ 같이 μ–‘μͺ½μ˜ 비ꡐ λ²”μœ„λ₯Ό 맞좰 μ£Όμ–΄μ•Ό ν•œλ‹€.)

 

E, S, M = 15, 28, 19                    # μ£ΌκΈ° μƒμˆ˜
e, s, m = map(int, input().split())     # μž…λ ₯ κ°’

year = 0

while True:
    if year % E == e and year % S == s and year % M == m:
        print(year)
        break
    else:
        year += 1

 

 


 

πŸ”” 풀이/κ°œλ…μ •λ¦¬

  1. λͺ¨λ“ˆλŸ¬ (%) : λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•΄μ£ΌλŠ” μ—°μ‚°μž

 

728x90