양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.

Harshad함수는 양의 정수 n을 매개변수로 입력받습니다. 이 n이 하샤드수인지 아닌지 판단하는 함수를 완성하세요. 예를들어 n이 10, 12, 18이면 True를 리턴, 11, 13이면 False를 리턴하면 됩니다.

문제 보러가기


코드 및 풀이

이 문제는 주어진 인자 자릿수의 숫자들을 모두 더하는 것이 관건이다. 그러려면 자료형을 잘 구분하는 것이 중요하다. for 반복문에서는 문자 자료형으로 사용해야 하고, 연산을 할 때는 다시 숫자 자료형으로 바꿔주었다.

def Harshad_1(n):
    is_harshad = 0
    sn = str(n)
    for i in sn:
        is_harshad += int(i)
    return True if n % is_harshad == 0 else False
    
print(Harshad_1(12))  # True
print(Harshad_1(42))  # True
print(Harshad_1(67))  # False
print(Harshad_1(44))  # False


다른 사람의 코드를 참고하면 다음과 같다. map()함수를 사용하면 다음과 같이 한 줄로도 구현 가능하다. map() 함수는 제너레이터를 생성하기 때문에 next()로 값을 출력해볼 수 있다.

n = 11
print(next(map(int, str(n))))
print(next(map(int, str(n))))
# 1
# 1

위의 식을 sum()으로 감싸주면 각 자릿수의 합이 구현된다. 이를 이용하여 함수를 정의하면 다음과 같다.

# 타인의 코드 - zip() 사용

def Harshad_2(n):
    retrun True if n % sum(map(int, str(n))) == 0 else False


3번째는 2번째 방식과 비슷하지만 map()함수를 사용하지 않고 간단하게 구현한 방식이다. 역시 자료형을 바꿔가면서 조건을 분리해놓았기에 정리해보았다.

def Harshad_3(n):
    return n % sum(int(x) for x in str(n)) == 0


풀이 별 실행시간 측정하기

각각의 함수를 100,000번 반복한 실행시간의 평균을 구했을 때 다음과 같이 시간이 걸린다. map() 함수를 사용했을 때가 가장 시간이 적게 걸렸다.

print(avg_time(e.Harshad_1(34)))
# 0.6039990694262087

print(avg_time(e.Harshad_2(34)))
# 0.42299507185816765

print(avg_time(e.Harshad_3(34)))
# 0.6299960659816861



Julia Hwang

디발자를 꿈꾸는 웹개발자의 블로그입니다.