Step by step

한 걸음 한 걸음 천천히

Algorithm/Baekjoon

[BOJ/백준] 1475번 파이썬 해결

개발자 까마귀 2024. 11. 9. 13:18
728x90

이 문제는 숫자 N(1 ~ 1,000,000)가 주어지고 N을 만들기 위해서 필요한 숫자 세트(0 ~ 9)가 몇 개인지 구하는 문제이다.

9와 6은 뒤집어서 9가 6을, 6이 9를 표현할 수 있다.


문자열로 n을 입력받아 리스트에서 해당 위치를 더하며 숫자 세트의 수를 구하는 로직을 짰다.

n = input()

set_arr = [0, 0, 0, 0, 0, 0, 0, 0, 0]

for i in n :
    if int(i) == 9 or int(i) == 6 :
        set_arr[5] += 0.5
    else :
        set_arr[int(i) - 1] += 1

print(round(max(set_arr)))

처음 짠 로직이며, 오답이다. 논리적으로 전혀 문제될 것이 없어서 조금씩 수정해가며 확인하다가 반올림 대신에 아예 올림을 사용해보기로 했다.

import math

n = input()

set_arr = [0, 0, 0, 0, 0, 0, 0, 0, 0]

for i in n :
    if int(i) == 9 or int(i) == 6 :
        set_arr[5] += 0.5
    else :
        set_arr[int(i) - 1] += 1

print(math.ceil(max(set_arr)))

올림을 사용하니 됐다. 그런데 이상했다. 반올림은 사실 숫자를 0.5 더한 다음 내리는 것과 마찬가지이다.

찾아보니, 파이썬의 반올림에는 심각한 문제가 존재했다. 0.5 단위의 숫자를 반올림하면(올림과 내림의 거리가 같을 경우) 가까운 짝수로 반올림 된다는 것이다.

 

import math

n = 0.5

print(math.floor(n + 0.5)) # 1
print(round(n)) # 0

n = 1.5

print(math.floor(n + 0.5)) # 2
print(rount(n)) # 2

때문에, 같은 코드에 n만 바꾸어서 이런 결과가 나오는 것이다.

 

앞으로 파이썬 반올림을 사용하는 것은 되도록이면 지양하는 것이 좋을 것같다.

728x90