파이썬 숫자들의 각 자리가 홀수인지 확인하는 방법

조회수 1078회
a = "1234567"
list_1 = []
odd_num = ["1","3","5","7","9"]

for i in range(0,len(a)):
    if a[i] in odd_num:
        list_1.append(i)

저는 a라는 문자열이 각각 모두 홀수로 이루어져 있는지 확인하고 싶은데(예를 들어 5791, 753을 찾고 하나라도 짝수가 들어간 135798은 제외시킬려고) 저렇게 하면 앞자리만 홀수여도 리스트에 추가가 되는데

그래서 제가 생각한 방법은 문자열을 슬라이싱해서 하나씩 리스트에 넣고 집합으로 바꾼 다음에
홀수 리스트를 집합으로 바꾸고 집합끼리 합해도 여전히 홀수 리스트 집합과 같으면 모두 홀수다
라는 생각으로 구현하려다 너무 길어진 것 같은데
혹시 더 간단하게 할 방법이 있을까요?

감사합니다.

3 답변

  • 한 가지만 주제넘게 의견 드리자면, 홀수를 판정하기 위해 1,3,5,7,9 를 나열하지 마시기 바랍니다. 다섯 개 숫자 중 하나라도 실수로 빼먹으면 그대로 크리티컬 에러로 이어지거니와, 이런 세살 버릇이 여든까지 가면 나중에 서버 비밀번호나 VIP 고객 회원ID를 소스에 하드코딩하는 코드몽키 되지 말란 법이 없습니다. 대상을 정의하고, 그 성질을 규명하여, 연역적으로 참인 답을 도출하려고 해 주세요. 컴퓨터 ‘공학’이잖아요.

    다행히 홀수/짝수는 쉬운 정의가 있습니다.

    홀수는 n=2k+1인 k ∈ Z가 존재하는 n ∈ Z이다. 출처

    이게 파이썬에서는, foo % 2 == 1일 때 foo는 홀수다, 가 됩니다.

    나머지 설명은 아래의 작동하는 코드로 대신합니다.

    def is_all_odd(num) :
        for digit in str(num) :
            if int(digit) % 2 == 0 :
                return False
        return True
    
    def has_no_even(num) :
        return len(filter(lambda digit: int(digit) % 2 == 0, str(num).split())) == 0
    
    print(is_all_odd(5791))
    print(is_all_odd(135798))
    
    print(has_no_even(5791))
    print(has_no_even(135798))
    
    • 전공자가 아니라 전혀 그런건 생각을 못 했네요. 정말 감사합니다. 알 수 없는 사용자 2020.9.18 09:35
  • 검사할숫자문자열 = "1357"
    모든홀수들 = "13579"
    set(검사할숫자문자열) <= set(모든홀수들)
    

    뭐 이런 식으로 가능합니다. set 타입에서 <, > 는 부분집합인지 여부를 판단해 줍니다.

  • 간단한 정규식 버전입니다.

    import re
    
    odd = re.compile("^\d[13579]*$")
    print(odd.match('17536'))
    print(odd.match('5364'))
    print(odd.match('9753'))
    print(odd.match('a9753'))
    print(odd.match('993575'))
    
    None
    None
    <re.Match object; span=(0, 4), match='9753'>
    None
    <re.Match object; span=(0, 6), match='993575'>
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)