[내일배움캠프] SQL/Python 코드카타

sleekstar·2025년 5월 27일

알고리즘 코드카타

문제 1.

문제: 양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

우선 자연수의 각 자릿수의 합을 구해야 한다. 이건 전에도 해 본 적 있는데, 확실하게 정리하고 넘어갈 필요가 있겠다. 핵심은 리스트 형식으로 바꿔줘야 한다는 것.

idea

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 함수를 사용하여 리스트의 합을 구함.

Q. 꼭 리스트로 바꿔야 할까?

리스트로 바꾸지 않아도 된다.
접근 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

문제 2.

문제: 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

idea

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)가 되어 제한조건 충족 가능

point

range sum min max 4가지는 확실하게 알아두어야겠다.

SQL 코드카타

문제 1.

오랜 기간 보호한 동물(1)

idea

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;
profile
기록용

0개의 댓글