λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ 문제 풀이

[μ΄μ½”ν…Œ] μ‹œκ°

by syLim___ 2023. 2. 22.
728x90

좜처: 이것이 취업을 μœ„ν•œ μ½”λ”©ν…ŒμŠ€νŠΈλ‹€  with 파이썬 (λ‚˜λ™λΉˆ)

https://www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=2

 

문제

  • μ •μˆ˜ N이 μž…λ ₯되면 00μ‹œ 00λΆ„ 00μ΄ˆλΆ€ν„° Nμ‹œ 59λΆ„ 59μ΄ˆκΉŒμ§€μ˜ λͺ¨λ“  μ‹œκ° μ€‘μ—μ„œ 3이 ν•˜λ‚˜λΌλ„ ν¬ν•¨λ˜λŠ” λͺ¨λ“  경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”. 예λ₯Ό λ“€μ–΄ 1을 μž…λ ₯ν–ˆμ„ λ•Œ λ‹€μŒμ€ 3이 ν•˜λ‚˜λΌλ„ ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ„Έμ–΄μ•Ό ν•˜λŠ” μ‹œκ°μž…λ‹ˆλ‹€.
    • 00μ‹œ 00λΆ„ 03초
    • 00μ‹œ 13λΆ„ 30초
  • λ°˜λ©΄μ— λ‹€μŒμ€ 3이 ν•˜λ‚˜λ„ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ μ„Έλ©΄ μ•ˆ λ˜λŠ” μ‹œκ°μž…λ‹ˆλ‹€.
    • 00μ‹œ 02λΆ„ 55초
    • 01μ‹œ 27λΆ„ 45초

 

문제 쑰건

  • 풀이 μ‹œκ°„: 15λΆ„
  • μ‹œκ°„ μ œν•œ: 2초
  • λ©”λͺ¨λ¦¬ μ œν•œ: 128MB
  • μž…λ ₯ 쑰건: 첫째 쀄에 μ •μˆ˜ N이 μž…λ ₯λ©λ‹ˆλ‹€. (0<=N<=23)
  • 좜λ ₯ 쑰건: 00μ‹œ 00λΆ„ 00μ΄ˆλΆ€ν„° Nμ‹œ 59λΆ„ 59μ΄ˆκΉŒμ§€μ˜ λͺ¨λ“  μ‹œκ° μ€‘μ—μ„œ 3이 ν•˜λ‚˜λΌλ„ ν¬ν•¨λ˜λŠ” λͺ¨λ“  경우의 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

 


μž‘μ„± μ½”λ“œ

 

κ·Έλƒ₯ λ‹¨μˆœ κ΅¬ν˜„ λ¬Έμ œκ°™μ•˜κ³ 

00μ‹œ 00λΆ„ 00μ΄ˆλΆ€ν„° Nμ‹œ 59λΆ„ 59초 λ²”μœ„ λ‚΄μ—μ„œ

(κ°€λŠ₯ν•œ λͺ¨λ“  μ‹œκ° 개수) - (3이 단 ν•˜λ‚˜λ„ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ‹œκ° 개수) λ₯Ό κ³„μ‚°ν•˜μ—¬ 좜λ ₯ν•˜μ˜€λ‹€.

 

κ°€λŠ₯ν•œ λͺ¨λ“  μ‹œκ°μ€

μ‹œ: 0~nκΉŒμ§€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ --> n+1κ°€μ§€

λΆ„: μ‹­μ˜μžλ¦¬μˆ˜ 0~5κΉŒμ§€, 일의자리수 0~9κΉŒμ§€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ--> 6 * 10 = 60κ°€μ§€

초: μ‹­μ˜μžλ¦¬μˆ˜ 0~5κΉŒμ§€, 일의자리수 0~9κΉŒμ§€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ --> 6 * 10 = 60κ°€μ§€

λ”°λΌμ„œ κ°€λŠ₯ν•œ λͺ¨λ“  μ‹œκ°μ˜ 개수 = (n+1) * 60 * 60 κ°€μ§€κ°€ λœλ‹€.

 

3이 단 ν•˜λ‚˜λ„ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ‹œκ°μ€

각 μžλ¦¬μ— λ“€μ–΄μ˜¬ 수 μžˆλŠ” μˆ«μžμ€‘ 3만 μ œμ™Έν•˜κ³  경우의 수λ₯Ό κ΅¬ν•˜λ©΄ λœλ‹€

λ”°λΌμ„œ

μ‹œ: μ£Όμ–΄μ§„ n이 0~2인 경우 --> 0~nκΉŒμ§€ λͺ¨λ‘ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ (n+1)κ°€μ§€

     μ£Όμ–΄μ§„ n이 3~12인 경우 --> 3 λΉΌκ³  λ‹€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ (n+1)-1  = nκ°€μ§€

     μ£Όμ–΄μ§„ n이 13~22인 경우 --> 3, 13 두 숫자 λΉΌκ³  λ‹€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ  (n+1)-2 = (n-1)κ°€μ§€

     μ£Όμ–΄μ§„ n이 23인 경우 --> 3, 13, 23 μ„Έ 숫자 λΉΌκ³  λ‹€ λ“€μ–΄μ˜¬ 수 μžˆμœΌλ―€λ‘œ (n+1)-3 = (n-2)κ°€μ§€

λΆ„: (6-1)*(10-1)=45κ°€μ§€

초: 5*9=45κ°€μ§€

λ”°λΌμ„œ 3이 단 ν•˜λ‚˜λ„ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ‹œκ° κ°œμˆ˜λŠ” μ‹œ, λΆ„, 초의 경우λ₯Ό λͺ¨λ‘ κ³±ν•œ μˆ˜κ°€ λœλ‹€.

 

 

κ°€λŠ₯ν•œ λͺ¨λ“  μ‹œκ°κ³Ό, 3이 단 ν•˜λ‚˜λ„ ν¬ν•¨λ˜μ§€ μ•ŠλŠ” μ‹œκ° 쀑 λΆ„*초λ₯Ό κ³„μ‚°ν•˜λŠ” 식은 n의 λ²”μœ„μ— λ”°λΌμ„œ λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.

κ·Έλž˜μ„œ 이 식듀을 λ³€μˆ˜ all, temp에 각각 미리 μ €μž₯해놓고

nλ²”μœ„μ— λ”°λΌμ„œ temp에 n-2 ~ n+1 쀑 μ–΄λ–€ 값을 μΆ”κ°€λ‘œ κ³±ν•΄μ€„μ§€λ§Œ κ²°μ •ν•˜μ—¬ κ²°κ³Όλ₯Ό 좜λ ₯ν–ˆλ‹€

 

n = int(input())

all = (n+1)*6*10*6*10 #κ°€λŠ₯ν•œ λͺ¨λ“  μ‹œκ°
temp = 5*9*5*9 #3 단 ν•œκ°œλ„ 포함 μ•ˆ ν•˜λŠ” λΆ„,초

if n<3:
  print(all - (n+1) * temp)
elif 3<=n<13:
  print(all - n * temp)
elif n==23:
  print(all - (n-2) * temp)
else: 
  print(all - (n-1) * temp)

 


κ°•μ˜ μ˜ˆμ‹œ λ‹΅μ•ˆ

ν•˜λ£¨λŠ” 60*60*24 = 86400μ΄ˆλ°–μ— μ•ˆ 되기 λ•Œλ¬Έμ—

λͺ¨λ“  경우λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ 일일히 λ‹€ 따져도 86400번만 μˆ˜ν–‰ν•˜λ©΄ λ˜λ―€λ‘œ μ œν•œ μ‹œκ°„ 내에 μΆ©λΆ„νžˆ ν’€ μˆ˜κ°€ μžˆλ‹€.

(νŒŒμ΄μ¬μ€ 1μ΄ˆμ— μ•½ 2000만번의 연산을 μˆ˜ν–‰ν•˜λ‹ˆκΉŒ)

 

κ·Έλž˜μ„œ λ‹¨μˆœνžˆ μ‹œκ°μ„ 1μ”© μ¦κ°€μ‹œν‚€λ©΄μ„œ, 3이 ν•˜λ‚˜λΌλ„ ν¬ν•¨λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό μ²΄ν¬ν•˜κ³ 

3이 ν¬ν•¨λ˜μ–΄ 있으면 카운트λ₯Ό μ¦κ°€μ‹œμΌœμ€¬λ‹€


λ‚˜λž‘μ€ λ‹€λ₯΄κ²Œ μ—„μ²­ κ°„λ‹¨ν•˜κ²Œ μƒκ°ν•˜μ—¬ λ°”λ‘œ ν‘Έμ‹  것 κ°™μ•„μ„œ μ‹ κΈ°ν–ˆλ‹€

 

κ°•μ˜/κ΅μž¬μ—μ„œμ²˜λŸΌ 문제λ₯Ό ν’€λ©΄

λ‚΄κ°€ ν‘Ό λ°©λ²•κ³ΌλŠ” λ‹€λ₯΄κ²Œ 경우λ₯Ό λ‚˜λˆ„κ³  그에 λ”°λ₯Έ 경우의 수λ₯Ό λ”°μ Έλ³Ό ν•„μš”κ°€ μ—†μ–΄μ„œ,

λ¬Έμ œν’€μ΄ μ‹œκ°„μ΄ ν™• 쀄어듀 것 κ°™λ‹€.

 

μ €λ ‡κ²Œ λ‹¨μˆœν•˜κ²Œ μƒκ°ν•˜μ—¬ μ½”λ“œλ₯Ό μ§œλ„ μ œν•œμ‹œκ°„ 내에 파이썬이 연산을 μˆ˜ν–‰ν•  수 μžˆλŠ”μ§€ 미리 λ”°μ Έλ³΄λŠ” μŠ΅κ΄€μ„ κ°–λŠ”λ‹€λ©΄

문제 풀이 μ‹œκ°„μ„ 많이 단좕할 수 μžˆμ„λ“―!

 

728x90