출처: https://meyouus.tistory.com/64 [정보 공유 - For Me For You For Us]
본문으로 바로가기

 

이번 문제는 꽤나 애먹었다. 그냥 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())))

이 작성자는 reimport하고 Regex를 이용해서 문제를 풀었다. (원래 이 문제가 Regex를 이용해서 푸는 문제라고 한다.) 하지만 나는 이 regex(regular expression)에 대해서 잘 몰랐기 때문에 이를 이해하기 위해서는 조금의 공부가 필요했다. 이 정규 표현식에 대해서는 다른 포스팅에서 한번 다루어보도록 하겠다.