Problem Solving/[ν•­ν•΄99] TIL

99클럽 μ½”ν…Œ μŠ€ν„°λ”” 13일차 TIL / 그리디

geum 2024. 11. 9. 20:40

✏️ 문제

https://www.acmicpc.net/problem/27961

 

λ§ˆλ²•μ†Œλ…€μΈ λ§ˆλ„μΉ΄λŠ” λ„ˆλ¬΄λ‚˜λ„ 고양이λ₯Ό μ’‹μ•„ν•˜λŠ” λ‚˜λ¨Έμ§€ λ§ˆλ²•μ„ μ΄μš©ν•˜μ—¬ 고양이 N마리λ₯Ό μ§‘μ—μ„œ ν‚€μš°κΈ°λ‘œ κ²°μ‹¬ν–ˆλ‹€!

λ§ˆλ„μΉ΄λŠ” ν•œ 번의 ν–‰λ™μ—μ„œ λ‹€μŒ 2가지 λ§ˆλ²• 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜μ—¬ μ‚¬μš©ν•œλ‹€. μ²˜μŒμ—λŠ” λ§ˆλ„μΉ΄μ˜ 집에 고양이가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

  • 생성 λ§ˆλ²•: 고양이 1마리λ₯Ό λ§ˆλ„μΉ΄μ˜ 집에 μƒμ„±ν•œλ‹€.
  • 볡제 λ§ˆλ²•: λ§ˆλ„μΉ΄μ˜ 집에 μžˆλŠ” 고양이 일뢀 λ˜λŠ” μ „λΆ€λ₯Ό λŒ€μƒμœΌλ‘œ ν•˜μ—¬ λ³΅μ œν•œλ‹€. 즉, λ§Œμ•½ ν˜„μž¬ λ§ˆλ„μΉ΄μ˜ 집에 고양이가 마리 μ‘΄μž¬ν•œλ‹€λ©΄, 0마리 이상 k마리 μ΄ν•˜μ˜ 고양이λ₯Ό λ§ˆλ„μΉ΄μ˜ 집에 μΆ”κ°€ν•  수 μžˆλ‹€.

 

λ§ˆλ„μΉ΄λŠ” μœ„μ˜ 가지 λ§ˆλ²•μ„ 적절히 μ‚¬μš©ν•˜μ—¬, μ΅œμ†Œμ˜ 행동 횟수둜 λ§ˆλ„μΉ΄μ˜ 집에 μ •ν™•νžˆ N마리의 고양이가 μžˆλ„λ‘ λ§Œλ“€κ³  μ‹Άλ‹€. 계산을 μ–΄λ €μ›Œν•˜λŠ” λ§ˆλ„μΉ΄λ₯Ό μœ„ν•΄ μ΅œμ†Œμ˜ 행동 횟수λ₯Ό κ³„μ‚°ν•΄μ£Όμž!

 

πŸ€– μž…μΆœλ ₯ μ˜ˆμ‹œ

 

🧐 λ‚œμ΄λ„/μ†Œμš” μ‹œκ°„

βœ… λ‚œμ΄λ„: solved.ac κΈ°μ€€ B1

βœ… μ†Œμš” μ‹œκ°„: 42λΆ„

βœ… ꢌμž₯ μ‹œκ°„: 1μ‹œκ°„ 15λΆ„

 

πŸ’‘ 풀이

1) 문제 μœ ν˜• νŒŒμ•…

μ²˜μŒμ—λŠ” N의 μž…λ ₯ λ²”μœ„κ°€ 10의 12μŠΉκΉŒμ§€κΈΈλž˜ 음 이뢄탐색? ν–ˆλŠ”λ° μ–΄λ–»κ²Œ 써먹어야 할지 λ– μ˜€λ₯΄μ§€ μ•Šμ•˜λ‹€.

 

λ‹€μŒμœΌλ‘œ λ– μ˜¬λ¦° 방법은 νŒ¨ν„΄μ΄ μžˆλŠ”μ§€ μ°ΎλŠ” κ²ƒμ΄μ—ˆλ‹€. N=0~N=20κΉŒμ§€ 직접 μ μ–΄κ°€λ©΄μ„œ ν™•μΈν•΄λ³΄λ‹ˆκΉŒ νŒ¨ν„΄μ΄ 있긴 ν–ˆλŠ”λ° λ‚΄ λ¨Έλ¦¬λ‘œλŠ” μΌλ°˜ν™” μ‹œν‚¬ 방법이 보이지 μ•Šμ•˜κΈ° λ•Œλ¬Έμ— 이 방법도 일단 패슀!

 

λ§ˆμ§€λ§‰μœΌλ‘œ 문제λ₯Ό λ‹€μ‹œ μ½μ–΄λ³΄λ‹ˆκΉŒ 볡제λ₯Ό μ΅œλŒ€ν•œ 많이 써야겠닀 싢은 생각이 λ“€μ—ˆλ‹€. 이런 νŒ¨ν„΄μ€ 그리디 문제(like 동전 문제)μ—μ„œ 많이 봀던 것 κ°™μ•„μ„œ 그리디 μœ ν˜•μœΌλ‘œ λΆ„λ₯˜ν•˜κ³  λ‚˜λˆ—μ…ˆμ„ 잘 ν™œμš©ν•˜λŠ” λ°©ν–₯으둜 문제λ₯Ό ν’€μ–΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

 

2) 아이디어 흐름

β‘  ν˜„μž¬ 고양이 수, μ—°μ‚° 횟수 μ €μž₯용 λ³€μˆ˜ μ„ μ–Έ

λ¬Έμ œλŒ€λ‘œλΌλ©΄ 초기 고양이 μˆ˜λŠ” 0마리, μ—°μ‚° νšŸμˆ˜λ„ 0λ²ˆμ΄μ§€λ§Œ N이 0인 경우λ₯Ό μ œμ™Έν•˜κ³  ν•œ 마리λ₯Ό μΆ”κ°€ν•˜λŠ” 생성 과정이 무쑰건 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— ν˜„μž¬ 고양이 μˆ˜μ™€ μ—°μ‚° 횟수 λͺ¨λ‘ μ΄ˆκΈ°κ°’μ„ 1둜 쀬닀.

 

β‘‘ ν˜„μž¬ 고양이 μˆ˜μ™€ N 비ꡐ

λͺ©ν‘œλŠ” 더도 말고 λœλ„ 말고 μ •ν™•νžˆ N마리λ₯Ό λ§Œλ“œλŠ” κ²ƒμ΄λ―€λ‘œ ν˜„μž¬ 고양이 μˆ˜κ°€ Nκ³Ό 같아지기 μ „κΉŒμ§€λ§Œ while문을 돌렀주면 λœλ‹€.

 

whileλ¬Έ μ•ˆμ—μ„œλŠ” λ”± ν•œ 마리만 μΆ”κ°€λ˜λŠ” 생성 과정은 κ³ λ €ν•  ν•„μš”κ°€ μ—†κ³  ν˜„μž¬ 고양이 수의 2λ°°κΉŒμ§€ 늘릴 수 μžˆλŠ” 볡제 κ³Όμ •λ§Œ μ‹ κ²½μ“°λ©΄ 되기 λ•Œλ¬Έμ— ν˜„μž¬ 고양이 수 *= 2와 μ—°μ‚° 횟수 += 1을 계속 μˆ˜ν–‰ν•΄μ£Όλ©΄ 풀이 끝

 

β‘’ μ˜ˆμ™Έ 처리

β‘ μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ N=0이면 생성 과정이 ν•„μš”μ—†λ‹€. if문을 μ΄μš©ν•΄μ„œ N == 0이면 λ°”λ‘œ 0 좜λ ₯, N != 0이면 β‘ , β‘‘ μˆœμ„œλŒ€λ‘œ 처리되게 μ½”λ“œλ₯Ό μ§°λ‹€.

 

사싀 μ²˜μŒμ— μ˜ˆμ™Έ 처리λ₯Ό μ•ˆ ν•΄μ„œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€ ν•œ 번 λ§Œλ‚¬λ‹€ κ»„ κ»„

 

3) κ΅¬ν˜„

import sys

input = sys.stdin.readline

N = int(input())

if N == 0:
    print(0)
else:
    cats = 1

    answer = 1

    while cats < N:
        cats *= 2
        answer += 1

    print(answer)

 

4) μ–΄λ €μ› λ˜ 점/배운 μ 

🚨 μ–΄λ €μ› λ˜ 점

  • μ˜€λŠ˜μ€ μ–΄λ €μ› λ˜ 점보닀 μ•„μ‰¬μš΄ 점이라고 ν•˜λŠ” 게 λ§žκ² λ‹€. ν’€κ³  λ³΄λ‹ˆκΉŒ μ½”λ“œλŠ” μ—„μ²­ κ°„λ‹¨ν•œλ° 'λ‚˜λˆ—μ…ˆμ„ 잘 μ“°λŠ” 것' 이걸 λ°”λ‘œ λ– μ˜¬λ¦¬μ§€ λͺ»ν•΄μ„œ 브둠즈 문제 치고 μ‹œκ°„μ„ λ„ˆλ¬΄ 많이 μ“΄ 게 아쉽닀.

❗ 배운 점

  • μ½”λ“œ λ‹€ 짜고 λ‚˜μ„œ μ˜ˆμ™Έκ°€ μžˆμ„μ§€ ν•œ 번 더 μƒκ°ν•˜λŠ” μŠ΅κ΄€μ„ κ°€μ§€μž.