[#21314] 민겸 수
문제
#21314 민겸 수
Silver2
적용 알고리즘: Greedy 알고리즘
풀이 방법
가장 큰 수: 문자열에서 K로 끝날 때마다 문자열을 쪼갬
가장 작은 수: 가장 큰 수에서 K를 M과 분리(붙어있는 M제외 모든 문자열을 자르기)
코드 흐름
큰 수 구하기
- K가 등장하기 전까지 M이 나온 횟수(cnt)를 계산
- K가 나온 경우, 5*10^cnt
- 마지막 문자가 K가 아닌 경우 만일 cnt가 존재한다면 따로 계산
작은 수 구하기
- K가 등장하기 전까지 M이 나온 횟수(cnt)를 계산
- K가 나온 경우, 10^cnt를 계산하고, 이후 5를 더해줌
- 마지막 문자가 K가 아닌 경우 만일 cnt가 존재한다면 따로 계산
코드
❗️런타임(Overflow) 에러 발생
import math
num = input()
min_num = ""
max_num = ""
# 가장 큰 수 구하기
cnt = 0
for i in range(len(num)):
temp1 = 1
if (num[i] == "M"):
cnt += 1
if (num[i] == "K"):
temp1 = int(5 * math.pow(10, cnt))
max_num += str(temp1)
cnt = 0
if (cnt != 0): # 남은 M 처리
max_num = max_num + "1" * cnt
# 가장 작은 수 구하기
cnt = 0
for i in range(len(num)):
temp1 = 1
if (num[i] == "M"):
cnt += 1
if (num[i] == "K"):
temp1 = int(math.pow(10, cnt - 1))
if (temp1 != 0):
min_num = min_num + str(temp1) + "5"
else:
min_num += "5"
cnt = 0
if (cnt != 0):
min_num += str(int(math.pow(10, cnt - 1)))
print(max_num)
print(min_num)
❗️런타임(ValueError) 에러 발생 -> 틀렸습니다>
파이썬에서는 일반적으로 정수의 길이 제한이 없기 때문에 Overflow Error이 발생할 수 없음 즉, 위 코드에서 int로 형 변환을 할 때 발생한 것. 따라서 이를 int 형으로 변환하지 않고 바로 str로 사용한 뒤, math 계산 과정에서 나오는 소숫점을 따로 제거해 줌 => Value Error 발생..
“.” 여부에 따라 temp를 바꾸었지만 .. 틀렸습니다.
# 코드 일부 발췌
if (num[i] == "K"):
temp = str(5 * math.pow(10, cnt))
if ("." in temp):
temp = temp[0:temp.index(".")]
max_num += temp
cnt = 0
정답은 잘 나오는데 런타임 에러가 발생하였다. 대체 백준은 얼마나 큰 수를 집어넣는 것인가… 10의 ~승으로, 즉 숫자로 문제를 푸는 전략을 선택했는데 문자로 풀어야하는 문제일까? 또한 나는 최대수와 최소수를 따로따로 구하였는데 사실상 최소수는 최대수 구하는 과정에서 조금만 변경해주면 된다. 번거롭게 코드를 두 번이나 작성하지 않는 방법이 있을까 한번 고안해봐야겠다. 그리고 내가 너무 복잡하게 이 문제를 풀려고 했던 것 같다…
생각해보니 파이썬에서는 Overflow Error가 float형 등을 다루는게 아니면 발생할 수가 없다… 아무튼 고치고 이제 ValueError을 새로 마주함. 이것도 나름 손을 보니 이제는 틀렸단다. 반례 다 찾아서 다 해봤는데 과연 무엇이 문제일까..