[Python] G5_1107_리λͺ¨μ»¨ πŸ“Ί

Sangho HanΒ·2023λ…„ 6μ›” 13일
post-thumbnail

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

문제

μˆ˜λΉˆμ΄λŠ” TVλ₯Ό 보고 μžˆλ‹€. μˆ˜λΉˆμ΄λŠ” 채널을 돌리렀고 ν–ˆμ§€λ§Œ, λ²„νŠΌμ„ λ„ˆλ¬΄ μ„Έκ²Œ λˆ„λ₯΄λŠ” λ°”λžŒμ—, 일뢀 숫자 λ²„νŠΌμ΄ κ³ μž₯났닀.

리λͺ¨μ»¨μ—λŠ” λ²„νŠΌμ΄ 0λΆ€ν„° 9κΉŒμ§€ 숫자, +와 -κ°€ μžˆλ‹€. +λ₯Ό λˆ„λ₯΄λ©΄ ν˜„μž¬ λ³΄κ³ μžˆλŠ” μ±„λ„μ—μ„œ +1된 μ±„λ„λ‘œ μ΄λ™ν•˜κ³ , -λ₯Ό λˆ„λ₯΄λ©΄ -1된 μ±„λ„λ‘œ μ΄λ™ν•œλ‹€. 채널 0μ—μ„œ -λ₯Ό λˆ„λ₯Έ κ²½μš°μ—λŠ” 채널이 λ³€ν•˜μ§€ μ•Šκ³ , 채널은 λ¬΄ν•œλŒ€ 만큼 μžˆλ‹€.

μˆ˜λΉˆμ΄κ°€ μ§€κΈˆ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 채널은 N이닀. μ–΄λ–€ λ²„νŠΌμ΄ κ³ μž₯λ‚¬λŠ”μ§€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 채널 N으둜 μ΄λ™ν•˜κΈ° μœ„ν•΄μ„œ λ²„νŠΌμ„ μ΅œμ†Œ λͺ‡ 번 λˆŒλŸ¬μ•Όν•˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μˆ˜λΉˆμ΄κ°€ μ§€κΈˆ 보고 μžˆλŠ” 채널은 100λ²ˆμ΄λ‹€.

μž…λ ₯

첫째 쀄에 μˆ˜λΉˆμ΄κ°€ μ΄λ™ν•˜λ €κ³  ν•˜λŠ” 채널 N (0 ≀ N ≀ 500,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” κ³ μž₯λ‚œ λ²„νŠΌμ˜ 개수 M (0 ≀ M ≀ 10)이 μ£Όμ–΄μ§„λ‹€. κ³ μž₯λ‚œ λ²„νŠΌμ΄ μžˆλŠ” κ²½μš°μ—λŠ” μ…‹μ§Έ μ€„μ—λŠ” κ³ μž₯λ‚œ λ²„νŠΌμ΄ μ£Όμ–΄μ§€λ©°, 같은 λ²„νŠΌμ΄ μ—¬λŸ¬ 번 μ£Όμ–΄μ§€λŠ” κ²½μš°λŠ” μ—†λ‹€.

좜λ ₯

첫째 쀄에 채널 N으둜 μ΄λ™ν•˜κΈ° μœ„ν•΄ λ²„νŠΌμ„ μ΅œμ†Œ λͺ‡ 번 λˆŒλŸ¬μ•Ό ν•˜λŠ”μ§€λ₯Ό 좜λ ₯ν•œλ‹€.

예제

쑰건

  • μ‹œκ°„ μ œν•œ: 2초
  • λ©”λͺ¨λ¦¬ μ œν•œ: 256MB

μ½”λ“œ

from itertools import product
import sys
input = sys.stdin.readline

# μž…λ ₯
go_num = input().rstrip()
out_cnt = int(input())
# κ³ μž₯λ‚œ λ²„νŠΌμ΄ μ—†λŠ” 경우 (=10개 λͺ¨λ‘ λ™μž‘)
if out_cnt == 0:
    result = min(len(go_num), abs(int(go_num) - 100))
    print(result)
    exit(0)
# λͺ¨λ“  λ²„νŠΌμ΄ κ³ μž₯났을 경우
elif out_cnt == 10:
    a = set(input().rstrip().split())
    print(abs(int(go_num) - 100))
    exit(0)

out_lst = set(input().rstrip().split())
lst = set(str(i) for i in range(10))
lst -= out_lst  # 차집합을 μ΄μš©ν•˜μ—¬ μ‚¬μš©κ°€λŠ₯ν•œ λ²„νŠΌμ„ νŒŒμ•…ν•¨
up_down = abs(int(go_num) - 100) # 초기 채널인 100λ²ˆμ—μ„œ +- μ΄λ™ν•˜λŠ” 경우
minNum = sys.maxsize

for a in range(-1,2): # μ€‘λ³΅μˆœμ—΄μ˜ μ›μ†Œ κ°€μ§€μˆ˜λ₯Ό 3κ°€μ§€ 경우둜 νŒŒμ•…ν•¨
    if a == -1:
        if '0' in lst or len(go_num) == 1:
            continue
    for i in product(lst,repeat=len(go_num)+a):
        num = ''
        for j in i:
            num += j
        
        diff = abs(int(go_num) - int(num))  # κ°€κ³ μž ν•˜λŠ” μ±„λ„κ³Όμ˜ 차이
        click = len(str(int(num)))  # λ²„νŠΌμ„ λˆ„λ₯Έ 횟수 
        diff += click
        if minNum > diff:
            minNum = diff

# 좜λ ₯
result = min(minNum, up_down)
print(result)
  1. out_cnt κ°€ 0 일 κ²½μš°μ™€ 10 일 경우λ₯Ό 미리 κ³ λ €ν•œλ‹€.
  • λͺ¨λ‘ λ™μž‘ν•˜λŠ” κ²½μš°λΌλ„, λ²„νŠΌμ„ 직접 λˆŒλŸ¬μ„œ κ°€λŠ” 것보닀 초기 채널 100 λ²ˆμ—μ„œ +,- 둜 μ΄λ™ν•˜λŠ” 것이 λΉ λ₯Ό 수 있기 λ•Œλ¬Έμ΄λ‹€.

  • Ex) 채널 101 으둜 κ°€κ³ μžν•œλ‹€λ©΄, + 둜 1번이면 κ°€λŠ₯ν•˜μ§€λ§Œ, 101 을 직접 λˆ„λ₯Έλ‹€λ©΄ 3번의 λ™μž‘μ΄ ν•„μš”ν•˜λ‹€.

  • λͺ¨λ“  λ²„νŠΌμ΄ κ³ μž₯났닀면, +,- 둜 μ΄λ™ν•˜λŠ” 방법 λ°–μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

  1. 차집합을 μ‚¬μš©ν•˜μ—¬ lst 에 μ‚¬μš©κ°€λŠ₯ν•œ λ²„νŠΌλ§Œ 남겨쀀닀.
  1. 초기 채널 100 λ²ˆμ—μ„œ +,- 으둜 μ΄λ™ν•˜λŠ” 경우인 up_down λ³€μˆ˜λ₯Ό λ§Œλ“ λ‹€.
  1. go_num 의 길이에 -1,0,+1 ν•œ μ€‘λ³΅μˆœμ—΄λ„ κ³ λ €ν•΄μ€€λ‹€.
  • 0 번 λ²„νŠΌμ΄ κ³ μž₯났고, κ°€κ³ μžν•˜λŠ” μ±„λ„μ˜ μˆ«μžκ°€ ν•œμžλ¦¬ μˆ˜κ°€ μ•„λ‹ˆλΌλ©΄, -1 의 κ²½μš°λ„ κ³ λ €ν•œλ‹€.

  • 0 번 λ²„νŠΌμ„ μ‚¬μš©ν•  수 μžˆλ‹€λ©΄, ꡳ이 κ³ λ €ν•΄μ£Όμ§€ μ•Šμ•„λ„ μžλ™μ μœΌλ‘œ μ—¬λŸ¬ 자리수λ₯Ό νŒŒμ•…ν•  수 있기 λ•Œλ¬Έμ΄λ‹€.

  • go_num 이 1555이고, μ‚¬μš©ν•  수 μžˆλŠ” λ²„νŠΌμ΄ 2,8 뿐이라고 κ°€μ •ν•΄λ³΄μž.

  • λ§Œμ•½ go_num 의 길이인 4둜만 μ€‘λ³΅μˆœμ—΄μ„ λ§Œλ“ λ‹€λ©΄, κ·Όμ‚¬μΉ˜λŠ” 2222 κ°€ λ‚˜μ™€ abs(1555-2222) + len(num) 으둜 671μ΄λΌλŠ” 닡이 λ‚˜μ˜¬ 것이닀.

  • ν•˜μ§€λ§Œ go_num 의 길이보닀 ν•˜λ‚˜ μž‘μ€ 3으둜 μ€‘λ³΅μˆœμ—΄μ„ λ§Œλ“ λ‹€λ©΄, κ·Όμ‚¬μΉ˜λŠ” 888 이 λ‚˜μ™€ abs(1555-888) + len(num) 으둜 670μ΄λΌλŠ” 닡이 λ‚˜μ˜€κ²Œ λœλ‹€.

  • λ™μΌν•œ 이유둜 go_num 의 길이보닀 ν•˜λ‚˜ 큰 μˆ«μžλ‘œλ„ μ€‘λ³΅μˆœμ—΄μ„ λ§Œλ“€μ–΄ νŒŒμ•…ν•΄μ€€λ‹€.

  1. μ΄λŸ¬ν•œ 과정을 κ±°μ³μ„œ λ‚˜μ˜¨ diff 값에 λ²„νŠΌμ„ λˆ„λ₯Έ 횟수인 click 을 더해 μ΅œμ’…μ μœΌλ‘œ minNum 을 μ•Œμ•„λ‚Έλ‹€.
  1. λ§ˆμ§€λ§‰μœΌλ‘œ 미리 λ§Œλ“€μ–΄ λ‘” up_down λ³€μˆ˜μ™€ 비ꡐλ₯Ό ν•œ 후에 더 μž‘μ€ 값을 좜λ ₯ν•΄μ€€λ‹€.

λŠλ‚€ 점 & 배운 점

  1. 생각보닀 κ³ λ €ν•΄μ•Όν•  점듀이 λ„ˆλ¬΄ λ§Žμ•„μ„œ κ½€λ‚˜ μ‹œκ°„μ΄ 였래 걸렸던 λ¬Έμ œμ΄λ‹€. λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ˜¬λ €μ€€ λ°˜λ‘€λ“€μ΄ μ—†μ—ˆλ‹€λ©΄ ν•΄κ²°ν•˜κΈ°κ°€ νž˜λ“€μ—ˆμ„ 것 κ°™λ‹€.. μ΄λ²ˆμ—λŠ” λ°˜λ‘€λ₯Ό λ‹€ 넣어보며 μˆ˜μ •μ„ ν–ˆμ§€λ§Œ λ§Œμ•½ 싀전이라면 λ‚΄κ°€ 직접해야 할텐데 쉽지 μ•Šμ„ λ“―ν•˜λ‹€. λ‹€μŒλΆ€ν„°λŠ” λ°˜λ‘€λ₯Ό 직접 μ°Ύμ•„μ„œ ν•΄κ²°ν•΄λ³΄λŠ” μ—°μŠ΅λ„ 해보아야겠닀!

  2. 브루트포슀 문제라 κ·ΈλŸ°μ§€ μ—£μ§€ μΌ€μ΄μŠ€λ“€μ΄ μƒλ‹Ήνžˆ λ§Žμ•˜λ‹€.. κ·Έλž˜λ„ μˆ˜μ • 끝에 해결을 ν–ˆλ‹€λŠ” μ μ—μ„œ λΏŒλ“―ν•¨μ„ λŠλ‚€λ‹€!

profile
μ•ˆλ…•ν•˜μ„Έμš”. λΉ„μ¦ˆλ‹ˆμŠ€λ₯Ό μ΄ν•΄ν•˜λŠ” λ°±μ—”λ“œ 개발자, ν•œμƒν˜Έμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€