이번 문제는 꽤나 애먹었다. 그냥 float() 함수를 사용하면 문제에서 원하지 않는 숫자들도 실수로 인정이 되버리기 때문이다. (예) '12.' 는 float()를 사용한다면 12.0 실수로 출력이 되지만, 문제에서는 이 경우 실수가 아니라고 출력하고 싶다고 하였다.) 따라서 완전 무식한 방법으로 꽤나 오래 시행착오를 겪으며 풀었다:
T = int(input())
for i in range(T):
N = input()
_N = list(N)
if _N[-1] == '.' or N.count('.') > 1:
print('False')
elif _N[-1] != '.' and N.count('.') <= 1:
try:
if N == '0':
print('False')
break
is_it_float = float(N)
check_instance = isinstance(is_it_float, float)
print(check_instance)
except:
print("False")
완전 문제에서 요구하는 부분들을 모두 정의하여 때려박은 모습이다. 하지만 이는 별로 효율적이지 않아 보여서 다른 방법을 생각해봤으나, 따로 모르겠어서 다른 사람의 풀이를 참조하였다.
※ 다른 사람의 풀이 - (1):
count=int(input().strip())
for _ in range(count):
ans=False
try:
string=input().strip()
number=float(string)
ans=True
number=int(string)
ans=False
except:
pass
print(ans)
.strip()은 간단히 말해 문자열의 양쪽 공백과 양쪽의 '\n'도 없애주는 함수이다. 이에 대해서는 다른 포스팅에서 더 알아보도록 하겠다.
여기서 작성자는 ans=False라는 기본값을 두고, try/except를 통해 문제를 풀어나갔다. 만약 number=float(string)이 에러가 나지 않고 성립한다면 ans=True 값이 되고, 만약 이에 더 나아가 number=int(string)도 에러가 걸리지 않고 성립하게 된다면 ans=False로 다시 설정해준다. 만약 도중에 에러가 나게된다면 except로 함수는 다시 나아가게 되는데, 여기서는 따로 정의할 것이 없으므로 바로 pass를 해준다.
마지막으로는 ans를 출력하면서 끝난다.
※ 다른 사람의 풀이 - (2):
import re
for _ in range(int(input())):
print(bool(re.match(r'^[-+]?[0-9]*\.[0-9]+$', input())))
이 작성자는 re를 import하고 Regex를 이용해서 문제를 풀었다. (원래 이 문제가 Regex를 이용해서 푸는 문제라고 한다.) 하지만 나는 이 regex(regular expression)에 대해서 잘 몰랐기 때문에 이를 이해하기 위해서는 조금의 공부가 필요했다. 이 정규 표현식에 대해서는 다른 포스팅에서 한번 다루어보도록 하겠다.
'알고리즘 테스트 > Hackerrank 문제풀이 및 해설' 카테고리의 다른 글
<Hackerrank 문제풀이: 파이썬> Tuples (0) | 2020.11.16 |
---|---|
<Hackerrank 문제풀이: 파이썬> Lists (0) | 2020.11.15 |
<Hackerrank 문제풀이: 파이썬> Finding the percentage (0) | 2020.11.14 |
<Hackerrank 문제풀이: 파이썬> Nested Lists (0) | 2020.11.13 |
<Hackerrank 문제풀이: 파이썬> Find the Runner-Up Score! (0) | 2020.11.13 |