👉 오늘 한 일
- 프로그래머스 문제풀이(level 1)
- 프로그래머스 SQL(level 1, 2)
프로그래머스 문제풀이(lv. 1)
1. 정수 제곱근 판별
- 정답률 86%
- 제곱근을 씌우면 float 형태가 되버림. 따라서, 제곱근을 씌운 뒤 올림해서 다시 제곱근을 씌운 값과 같은지 비교
import math
def solution(n):
return math.pow((n**0.5)+1,2) if math.ceil(n**0.5) == n**0.5 else -1
- 다른 사람 풀이
- 제곱근을 씌운 수를 1로 나누어서 정수인지 판단함..! math 모듈을 불러오지 않아도 이렇게 해결할 수 있었다!
def nextSqure(n):
sqrt = n ** (1/2)
if sqrt % 1 == 0:
return (sqrt + 1) ** 2
return -1
2. x만큼 간격이 있는 n개의 숫자
- 정답률 86%, 2 try
- x가 양수, 0, 음수일 때를 나누어서 생각
def solution(x, n):
if x > 0:
return [i for i in range(x, x*n+1, x)]
elif x == 0:
return [0]*n
else:
return [i for i in range(x, x*n-1, x)]
def number_generator(x, n):
return [i * x + x for i in range(n)]
3. 정수 내림차순으로 배치하기
- 정답률 86%
- 문자열로 만들어 리스트에 담은 후 내림차순 정렬해서 합쳐줌
def solution(n):
lst = [i for i in str(n)]
return int(''.join(sorted(lst, reverse=True)))
def merge(left, right):
result = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] >= right[0]:
result.append(left[0])
left = left[1:]
else:
result.append(right[0])
right = right[1:]
elif len(left) > 0:
result.append(left[0])
left = left[1:]
elif len(right) > 0:
result.append(right[0])
right = right[1:]
return result
def mergeSort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:]
left = mergeSort(left)
right = mergeSort(right)
return merge(left, right)
def solution(n):
arr = list(str(n))
n = int(''.join(mergeSort(arr)))
return n
4. 문자열을 정수로 바꾸기
- 정답률 86%
-
기호가 붙었을 때와 나머지(+
기호가 붙었을 때, 아무것도 붙지 않았을 때)를 나누어서 고려
def solution(s):
if s[0] == "-":
return int(s.replace("-", "")) * -1
else:
return int(s.replace("+", ""))
- 다른 사람 풀이
- 정수형으로 바꿀 때 문자 +, -는 알아서 양,음의 기호로 인식하는 것 같다..!
def strToInt(str):
a = int(str)
return a
5. 하샤드 수
- 정답률 86%
- 자리수 합을 변수로 선언한 후에 나누어 떨어지는지 체크함
def solution(x):
x_sum = sum([int(n) for n in str(x)])
return True if x % x_sum == 0 else False
def Harshad(n):
return n % sum([int(c) for c in str(n)]) == 0
6. 콜라츠 추측
- 정답률 84%
- num이 1이 아니면 반복, 한 번 반복할 때마다 cnt값을 1씩 늘려주며 500회에 도달하면 반복 중지
def solution(num):
cnt = 0
while num != 1:
if num % 2 == 0:
num /= 2
elif num % 2 != 0:
num = num * 3 + 1
cnt += 1
if cnt == 500:
cnt = -1
break
return cnt
7. 서울에서 김서방 찾기
- 정답률 84%
list.index()
로 인덱스 넘버를 변수로 선언한 후에 f-string으로 return
def solution(seoul):
idx = seoul.index("Kim")
return f"김서방은 {idx}에 있다"
def findKim(seoul):
return "김서방은 {}에 있다".format(seoul.index('Kim'))
8. 나누어 떨어지는 숫자 배열
- 정답률 84%
- 빈 리스트 선언, arr를 돌면서 divisor로 나누어 떨어지면 result에 추가, 다 돌고난 후 result가 비었으면 -1을 추가
def solution(arr, divisor):
result = []
for n in sorted(arr):
if n % divisor == 0:
result.append(n)
if len(result) == 0:
result.append(-1)
return result
- 다른 사람 풀이
- or을 사용해 or 앞이 참일경우 해당 값까지만, 거짓일경우 뒤에 것이 호출되도록 함(빈 리스트는 False로 취급)
def solution(arr, divisor):
return sorted([n for n in arr if n%divisor == 0]) or [-1]
9. 핸드폰 번호 가리기
- 정답률 84%
- 마지막 4자리를 제외한 수들을 그들의 길이만큼
*
로 바꿔줌
def solution(phone_number):
return phone_number.replace(phone_number[:-4], len(phone_number[:-4])*"*")
- 다른 사람 풀이
- replace를 사용하지 않고 더 간결하게 풀었다!
def hide_numbers(s):
return "*"*(len(s)-4) + s[-4:]
SQL
1. 12세 이하인 여자 환자 목록 출력하기 💡
- TLNO 컬럼에서 NULL 값은 NONE으로 출력하기
- IF문 사용 체크
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(TLNO IS NULL, 'NONE', TLNO) TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = "W"
ORDER BY AGE DESC, PT_NAME
2. 흉부외과 또는 일반외과 의사 목록 출력하기
- OR을 사용하면 MCDP_CD 컬럼을 두 번 호출해야 하지만 IN을 사용하면 간단하게 불러올 수 있음
SELECT DR_NAME, DR_ID, MCDP_CD, LEFT(HIRE_YMD, 10) HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN('CS', 'GS')
ORDER BY HIRE_YMD DESC, DR_NAME
3. 인기있는 아이스크림
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID
4. 3월에 태어난 여성 회원 목록 출력하기
- level 2
- TLNO가 NULL인 것을 출력하지 않기 위해 WHERE절에 IS NOT NULL 조건 추가
SELECT MEMBER_ID, MEMBER_NAME, GENDER, LEFT(DATE_OF_BIRTH, 10) DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = '3' AND GENDER = 'W' AND TLNO IS NOT NULL
ORDER BY MEMBER_ID
5. 재구매가 일어난 상품과 회원 리스트 구하기 📌
- level 2
- 같은 유저 아이디에서 같은 상품을 재구매한 경우이므로 USER_ID, PRODUCT_ID 두 컬럼 모두를 사용해서 GROUP BY 해야함
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(USER_ID) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC