문제: 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.
우선 자연수의 각 자릿수의 합을 구해야 한다. 이건 전에도 해 본 적 있는데, 확실하게 정리하고 넘어갈 필요가 있겠다. 핵심은 리스트 형식으로 바꿔줘야 한다는 것.
x를 문자열로 변환하고, 하나씩 추출해서 더한다.ex x=123이라면 str(x)='123'
접근 1
def solution(x):
answer = sum([int(i) for i in str(x)])
이렇게 for문을 이용하여 str(x)의 각 자릿수를 리스트로 변환 ex '123'=>['1','2','3']
sum 함수를 사용하여 리스트의 합을 구함.
리스트로 바꾸지 않아도 된다.
접근 2
def solution(n):
answer = str(x)
new = 0
for i in answer:
new += int(i)
return new
문자열을 차근차근 더한 값을 새로운 변수에 저장하는 방법도 있다. (계산은 이게 더 빠르다고 함)
def solution(x):
answer = sum([int(i) for i in str(x)])
if x % answer == 0:
return True
else:
return False
문제: 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
range 함수를 쓰면 되지 않을까? a, b의 대소관계는 어떻게 처리하지?=> max, min 조건을 달아주면 어떨까?
def solution(a, b):
return sum(range(min(a, b), max(a, b) + 1))
a와 b 중 작은 수부터 큰 수까지의 정수를 더하는 함수 완성. a=b일 때, range(a, a+1)=a(또는 b)가 되어 제한조건 충족 가능
range sum min max 4가지는 확실하게 알아두어야겠다.
join을 사용하는 예제가 처음으로 나온 것 같다. 일단 테이블 2개의 칼럼을 모두 보고, 고유키값으로 보이는 'ANIMAL_ID'를 기준으로 LEFT JOIN 하였다.
그리고 '입양을 가지 못한 동물'을 추출하려면-
ANIMAL_INS에는 있지만 ANIMAL_OUTS에는 없는, 즉 들어온 기록만 있고 나간 기록은 없는 동물을 찾으면 될 것이다.
1. 추출해야 하는 컬럼: NAME, DATETIME
2. 조건: ANIMAL_INS를 기준으로 JOIN했을 때, ANIMAL_OUTS에는 정보가 없어 NULL로 표시되는 부분을 찾을 것
단, 이 과정에서 코드를 한 번 실행해 본 결과, 이름이 아예 누락되어있는(공백인) 경우가 있었다. 이를 위해 I.NAME에서 공백 제거
공백을 제거하는 방법으로 TRIM을 쓸 수 있다는 것을 저번 기초 EDA 과제를 하며 배웠다.

이때 TRIM을 안 써도 같은 값이 나왔지만, 공백을 제거하는 문법임을 알아두면 좋을 것 같다.
최종 답안은 다음과 같다.
SELECT
I.NAME,
I.DATETIME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.NAME IS NULL
AND TRIM(I.NAME) != ''
ORDER BY I.DATETIME ASC LIMIT 3;