๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/BOJ

[๋ฐฑ์ค€] 1107. ๋ฆฌ๋ชจ์ปจ

 

๐Ÿ“ช [๋ฆฌ๋ชจ์ปจ]

 

 

1107๋ฒˆ: ๋ฆฌ๋ชจ์ปจ

์ฒซ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฑ„๋„ N (0 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค.  ๋‘˜์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์˜ ๊ฐœ์ˆ˜ M (0 ≤ M ≤ 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์…‹์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ

www.acmicpc.net

 


 

 

๐Ÿ“‹ ๋ฌธ์ œ์„ค๋ช…

  • ์ˆ˜๋นˆ์ด๋Š” TV๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค. ์ˆ˜๋นˆ์ด๋Š” ์ฑ„๋„์„ ๋Œ๋ฆฌ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋ฒ„ํŠผ์„ ๋„ˆ๋ฌด ์„ธ๊ฒŒ ๋ˆŒ๋Ÿฌ ์ผ๋ถ€ ์ˆซ์ž ๋ฒ„ํŠผ์ด ๊ณ ์žฅ๋‚ฌ๋‹ค.
  • ๋ฆฌ๋ชจ์ปจ์—๋Š” ๋ฒ„ํŠผ์ด 0๋ถ€ํ„ฐ 9๊นŒ์ง€ ์ˆซ์ž, +์™€ -๊ฐ€ ์žˆ๋‹ค. +๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ์ฑ„๋„์—์„œ +1๋œ ์ฑ„๋„๋กœ ์ด๋™ํ•˜๊ณ , -๋ฅผ ๋ˆ„๋ฅด๋ฉด -1๋œ ์ฑ„๋„๋กœ ์ด๋™ํ•œ๋‹ค. ์ฑ„๋„ 0์—์„œ -๋ฅผ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์ฑ„๋„์ด ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์ฑ„๋„์€ ๋ฌดํ•œ๋Œ€ ๋งŒํผ ์žˆ๋‹ค.
  • ์ˆ˜๋นˆ์ด๊ฐ€ ์ง€๊ธˆ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฑ„๋„์€ N์ด๋‹ค. ์–ด๋–ค ๋ฒ„ํŠผ์ด ๊ณ ์žฅ๋‚ฌ๋Š”์ง€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฑ„๋„ N์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฒ„ํŠผ์„ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผํ•˜๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.
  • ์ˆ˜๋นˆ์ด๊ฐ€ ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ์ฑ„๋„์€ 100๋ฒˆ์ด๋‹ค.

 

 

 

๐Ÿ‘‍๐Ÿ—จ ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ

[์ž…๋ ฅ]

์ฒซ์งธ ์ค„์— ์ˆ˜๋นˆ์ด๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ฑ„๋„ N (0 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค.  

๋‘˜์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์˜ ๊ฐœ์ˆ˜ M (0 ≤ M ≤ 10)์ด ์ฃผ์–ด์ง„๋‹ค.

๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์…‹์งธ ์ค„์—๋Š” ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์ฃผ์–ด์ง€๋ฉฐ, ๊ฐ™์€ ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ์–ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

5457
3
6 7 8

 

[์ถœ๋ ฅ]

์ฒซ์งธ ์ค„์— ์ฑ„๋„ N์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒ„ํŠผ์„ ์ตœ์†Œ ๋ช‡ ๋ฒˆ ๋ˆŒ๋Ÿฌ์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

6

 

 

 

๐Ÿ”‘ ๋ฌธ์ œํ’€์ด

๋ฆฌ๋ชจ์ปจ์˜ ๊ฒฝ์šฐ, ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๋Š” '๋ธŒ๋ฃจํŠธํฌ์Šค' ๋ฌธ์ œ์ด๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค ๊ทธ ์ค‘์—์„œ min์„ ๊ตฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ํ˜„์žฌ ์ฑ„๋„์ธ 100์—์„œ ๋ชฉํ‘œ ์ฑ„๋„์ธ N๊นŒ์ง€ +,-๋กœ ์ด๋™ํ•œ ํšŸ์ˆ˜
  2. ๊ณ ์žฅ ๋‚˜์ง€ ์•Š์€ ๋ฒ„ํŠผ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทผ์ฒ˜์˜ ์ˆ˜๋กœ ์ด๋™ ํ›„ +,-๋กœ ์ด๋™ํ•œ ํšŸ์ˆ˜

์œ„์˜ ์‚ฌ๊ณ ๋ฅผ ํ’€์–ด๋‚ธ ๋ฌธ์ œ ํ’€์ด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

 

[์˜ค๋‹ต]

n = int(input())
broke_num = int(input())
broke_names = set() if broke_num == 0 else set(input().split())		# ๊ณ ์žฅ๋‚œ ๋ฒ„ํŠผ์ด ์—†์„ ๊ฒฝ์šฐ, ์„ธ ๋ฒˆ์งธ ์ž…๋ ฅ X.

max_click, min_click = abs(n - 100), abs(n - 100)

for i in range(max_click):
    upper_new = set(str(n + i))
    lower_new = set(str(n - i))
    if broke_names - upper_new == broke_names:  # ๊ต์ง‘ํ•ฉ์ด ์—†์„ ๊ฒฝ์šฐ.
        min_click = len(str(n)) + i
        min_click = max_click if max_click < min_click else min_click
        break
    if broke_names - lower_new == broke_names:  # ๊ต์ง‘ํ•ฉ์ด ์—†์„ ๊ฒฝ์šฐ.
        min_click = len(str(n)) + i
        min_click = max_click if max_click < min_click else min_click
        break
print(min_click)

ํ•ด๋‹น ํ’€์ด์˜ ๊ฒฝ์šฐ, ๋ฐฑ์ค€ ์‚ฌ์ดํŠธ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์˜ˆ๋“ค์€ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋‚˜ ์ฝ”๋“œ ์ œ์ถœ์‹œ ๋ถˆํ•ฉ๊ฒฉ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ๋‹ค.

์˜ค๋žœ ์‹œ๊ฐ„ ์ฐพ์€ ๊ฒฐ๊ณผ, ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ฒซ๋ฒˆ ์งธ ๋ฌธ์ œ ์ฝ”๋“œ๋กœ๋Š” for๋ฌธ ๋‚ด๋ถ€์˜ ์กฐ๊ฑด๋ฌธ ๋‚ด์—์„œ min_click = len(str(n)) + i๋ผ๊ณ  ์„ ์–ธํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ ์ด ๊ฒฝ์šฐ๋Š” ์œ„์˜ ๊ฒฝ์šฐ 2๋ฒˆ์œผ๋กœ ๋ชฉํ‘œ ์ˆซ์ž์ธ N์ด ์•„๋‹Œ N๊ณผ ๊ทผ์ ‘ํ•œ ์ˆ˜๋กœ ๊ฐ„ ํ›„ +,-๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ธฐ์— min_click = len(str(n+i)) + i ๋˜๋Š” min_click = len(str(n-i)) + i ๊ฐ€ ์˜ณ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๋‹ค.

 

๋‘๋ฒˆ ์งธ ๋ฌธ์ œ ์ฝ”๋“œ๋กœ๋Š” N๊ณผ ๊ทผ์ ‘ํ•œ ์ˆ˜๋ฅผ ์ฐพ์„๋•Œ if๋ฌธ์„ ๋‚˜์—ดํ•˜์—ฌ ๋‹จ์ˆœํžˆ upper์„ ์ฐพ๊ณ  lower์„ ์ฐพ๋Š” ๊ตฌ์กฐ๋กœ ์ง  ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” upper๊ณผ lower์ด ๋™์‹œ์— ์ฐพ์•„์งˆ ๊ฒฝ์šฐ lower์ด ๋” ํšจ์œจ์ ์ด๋ผ๋„ upper์— ํ•ด๋‹นํ•˜๋Š” ๋‹ต์ด ์ถœ๋ ฅ๋œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

1555
8
0 1 3 4 5 6 7 9
670

์ฆ‰, ์œ„์™€ ๊ฐ™์€ ์ž…๋ ฅ๊ฐ’์„ ๋„ฃ์—ˆ์„ ๋•Œ ์ตœ์ ์˜ ๊ทผ์ ‘ ์ˆ˜๋Š” 888์ด๋‚˜ 2222๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋ณด์™„ํ•˜์—ฌ ์ฐพ์€ ์ •๋‹ต ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

 

 

[์ˆ˜์ •๋œ ์ •๋‹ต]

n = int(input())
broke_num = int(input())
broke_names = set() if broke_num == 0 else set(input().split())

default_click, min_click = abs(n - 100), abs(n - 100)


def check_broke_exists(error_keys, goal, delta) -> int:
    check_set = set(str(goal + delta))
    if check_set - error_keys == check_set:
        return len(str(goal + delta)) + abs(delta)
    else:
        return -1


for i in range(default_click):
    upper_new = check_broke_exists(broke_names, n, +i)
    lower_new = check_broke_exists(broke_names, n, -i)
    if upper_new >= 0 and lower_new >= 0:
        min_click = min(upper_new, lower_new, default_click)
        break
    elif upper_new >= 0:
        min_click = min(upper_new, default_click)
        break
    elif lower_new >= 0:
        min_click = min(lower_new, default_click)
        break
    else:
        continue

print(min_click)

lower๊ณผ upper์„ ์ฐพ๋Š” ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ฐพ์€ ํ›„, ์ด๋ฅผ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌ ํ•˜์—ฌ ์ฃผ์—ˆ๋‹ค. 

→ ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค lower๊ฐ€ ๋ฌด์กฐ๊ฑด upper๋ณด๋‹ค ๋ฒ„ํŠผ ํด๋ฆญ์˜ ํšŸ์ˆ˜๊ฐ€ ์ ์œผ๋‹ˆ ๊ทธ๋ƒฅ ์กฐ๊ฑด๋ฌธ ์ˆœ์„œ๋งŒ ๋ฐ”๊ฟ”์ค˜๋„ ๋์„ ๋“œ..ใ……..

 

 


 

๐Ÿ”” ํ’€์ด/๊ฐœ๋…์ •๋ฆฌ

  1. ์ง‘ํ•ฉ(set)
    : ๊ต์ง‘ํ•ฉ(&), ์ฐจ์ง‘ํ•ฉ(-), ๊ณต์ง‘ํ•ฉ(set()) ๋“ฑ
  2. ์œ ์‚ฌ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž
    :  true๊ฐ’ if ture์กฐ๊ฑด else false๊ฐ’

 

728x90