안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "햐사드 수" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12947)
1. 문제 : 하샤드 수(Lv. 1)
2. 문제 설명
양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다.
예를 들어 18의 자릿수 합은 1+8=9이고,
18은 9로 나누어 떨어지므로 18은 하샤드 수입니다.
자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
[ 제한 사항 ]
x는 1 이상, 10000 이하인 정수입니다.
[ 입출력 예 및 설명 ]
x | return |
10 | TRUE |
12 | TRUE |
11 | FALSE |
13 | FALSE |
입출력 예 #1
10의 모든 자릿수의 합은 1입니다.
10은 1로 나누어 떨어지므로 10은 하샤드 수입니다.
입출력 예 #2
12의 모든 자릿수의 합은 3입니다.
12는 3으로 나누어 떨어지므로 12는 하샤드 수입니다.
입출력 예 #3
11의 모든 자릿수의 합은 2입니다.
11은 2로 나누어 떨어지지 않으므로 11은 하샤드 수가 아닙니다.
입출력 예 #4
13의 모든 자릿수의 합은 4입니다.
13은 4로 나누어 떨어지지 않으므로 13은 하샤드 수가 아닙니다.
3. 문제 풀이
# 1안
def solution(x):
str_x = str(x)
digitSum = 0
for i in range(len(str_x)):
digitSum += int(str_x[i])
if x%digitSum == 0:
answer = True
else:
answer = False
return answer
# 2안
def solution(x):
digitSum = 0
for digit in str(x):
digitSum += int(digit)
return x % digitSum == 0
문제 설명에 맞는 코드를 작성하기 위해서 총 2안으로 작성했습니다!
두 코드 모두 내용적으로는 동일한 내용인데,
2안은 1안을 조금 더 효율적인 코드로 수정하였습니다!
# 1안 풀이 설명
# [ 문제 풀이 설명 ]
문제와 입출력 예시를 보며, 주어진 x의 자릿수 합을 구하는 것이 필요하겠다고 생각을 했습니다!
자릿수를 가져오기 위해 x를 문자열로 바꿔준 str_x를 생성해 주었습니다.
이후 반복분을 통해 str_x의 자릿수의 값을 INT로 변환하여 더해주었고,
이를 digitSum이라는 변수에 저장해 주었습니다.
이후 x를 digitSum 변수로 나눠서 나머지가 0인지 아닌지를 확인하였습니다.
나머지가 0인 경우에는 answer에 True
나머지가 0이 아닌 경우에는 answer에 False
이렇게 return 값에 할당해 주었습니다!
x=13을 예로 들어볼게요!
digitSum = 1 + 3 = 4
x % digitSum = 13 / 4 = 1
나누어 떨어지지 않으므로 answer = False
# 1안
def solution(x):
# 슬라이싱을 하기 위해 문자열로 변환
str_x = str(x)
digitSum = 0
# str_x의 길이만큼 반복
for i in range(len(str_x)):
# str_x의 각 자리를 합한 digitSum 산출
digitSum += int(str_x[i])
# 나머지가 0인지를 확인하여, 나누어 떨어지는지 확인
if x%digitSum == 0:
answer = True
else:
answer = False
return answer
# 2안 풀이 설명
# [ 문제 풀이 설명 ]
2안의 코드는 1안의 코드와 동일한 내용이고 1안의 코드를 조금 정리해 보았습니다!
문자열로 변경한 x를 바로 이용하여 반복문을 구성하였고
return문도 나머지가 0인지 아닌지에 따라 바로 return에 나타나도록 구성해 보았습니다!
코드는 간결해졌지만,
1안에 비해 해석에 시간이 더 필요한 것 같다고 생각이 들어요!
저는 개인적으로는 코드가 길어지더라도 타인이 해석하기 쉬운 코드가 좋다고 생각해서
다음번에도 1안과 같은 코드를 짤 것 같습니다!
1안과 동일한 내용의 코드라서 예시는 생략 하겠습니다!
# 2안
def solution(x):
digitSum = 0
# 슬라이싱을 하기 위해 문자열로 변환, 반복문 실행
for digit in str(x):
# x의 각 자리를 합한 digitSum 산출
digitSum += int(digit)
# 나머지가 0이면 True를 반환하고, 그렇지 않으면 False를 반환
return x % digitSum == 0
4. 문제 풀이 후기
이번 문제는 주어진 x가 하샤드 수인지를 판별하는 문제였습니다.
주어진 숫자를 문자열로 바꿔서 각 자릿수를 더한 값을 산출하고
나머지가 0인지를 판별하는 코드를 짜보았습니다!
이 외에는 어려운 부분이 없어서 제가 따로 코멘트할 것은 없습니다!
이번 포스팅은 프로그래머스에 있는
python을 이용한 코딩테스트 문제를 풀어보았습니다!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
'Skill Sets > Python' 카테고리의 다른 글
[Python] 음양 더하기(프로그래머스/python/Level 1) (55) | 2023.12.09 |
---|---|
[Python] 핸드폰 번호 가리기(프로그래머스/python/Level 1) (76) | 2023.10.09 |
[Python] 콜라츠 추측(프로그래머스/python/Level 1) (42) | 2023.08.24 |
[Python] 문자열 내 p와 y의 개수(프로그래머스/python/Level 1) (37) | 2023.08.19 |
[Python] 자연수 뒤집어 배열로 만들기(프로그래머스/python/Level 1) (33) | 2023.08.12 |