알고리즘
7번
def solution(num1, num2):
answer = (num1 / num2) * 1000
answer = int(answer)
return answer
나눗셈을 묻는 문제였지만,
answer를 정수로 변환시켜야 풀리는 문제였다.
int(answer)를 하면 그냥 정수로 변환되는 걸로 알았는데
다시 answer 변수에다 저장을 해야한다.
이 코드보다 더 효율적인 코드가 있는데,
def solution(num1, num2):
return int(num1 / num2 * 1000)
아름답다고 생각한다.
8번
def solution(angle):
answer = 0
if 0 < angle < 90:
answer = 1
elif angle == 90:
answer = 2
elif 90 < angle < 180:
answer = 3
else:
answer = 4
return answer
아주 기본적으로 푼 게 아닐까 싶다.
그러고나서 좋은 풀이를 보았는데,
def solution(angle):
answer = (angle // 90) * 2 + (angle % 90 > 0) * 1
return answer
!?
...
각 'angle'이 예각인 경우(ex: 60도) 연산자 '+' 앞부분은 0이 되고
뒷부분은 나머지 연산자 '%'를 통해 angle이 0보다 크므로 'True'가 되어 1이 된다.
결과값 : 1
'angle'이 직각인 경우 앞부분은 2가 되고
뒷부분은 나머지가 0이므로 'False'가 되어 0이 된다.
결과값 : 2
'angle'이 둔각인 경우 앞부분은 2가 되고
뒷부분은 angle이 0보다 크므로 'True'가 되어 1이 된다.
결과값 : 3
'angle'이 평각일 경우 앞부분은 4가 되고
뒷부분은 나머지가 0이므로 'False'가 되어 0이 된다.
결과값 : 4
Damn...
def solution(angle):
if angle<=90:
return 1 if angle<90 else 2
else:
return 3 if angle<180 else 4
이것도 굉장히 좋은 코드 같다.
9번
def solution(n):
answer = 0
#50이 주어지면 50 48 46 ...
#49가 주어지면 48 46
if n % 2 == 0:
answer = n*(n+1)//2 - n**2//4
else:
answer = n*(n-1)//2 - (n-1)**2//4
return answer
간단한 문제인데, 종이랑 펜이 없어서 ... 30분이나 걸렸다...
사실 이렇게 풀기보다 range()의 용법을 묻는 문제였을 거 같다.
def solution(n):
return sum([i for i in range(2, n + 1, 2)])
아... 역시나...
def solution(n):
return 2*(n//2)*((n//2)+1)/2
n*(n+1)/2 가우스의 공식을 활용했다.
자세한 설명은 밑에 더보기
- n*(n+1)//2 - n**2//4
- n*(n+1)//2는 n까지의 자연수들의 합을 나타냅니다.
- n**2//4는 n까지의 홀수들의 합을 나타냅니다.
- 따라서 n*(n+1)//2 - n**2//4는 n까지의 짝수들의 합을 나타냅니다.
- 2*(n//2)*((n//2)+1)/2
- n//2는 n을 2로 나눈 몫, 즉 n의 절반을 나타냅니다.
- ((n//2)+1)은 n의 절반에 1을 더한 값입니다.
- 2*(n//2)*((n//2)+1)/2는 n의 절반까지의 자연수들의 합을 2배한 값입니다.
- 이는 n까지의 짝수들의 합과 같습니다.
이를 수식으로 정리하면 다음과 같습니다:
n*(n+1)//2 - n**2//4 = 2*(n//2)*((n//2)+1)/2
즉, 두 공식은 n까지의 짝수들의 합을 나타내는 서로 다른 표현 방식입니다.
첫 번째 공식은 n까지의 자연수들의 합에서 n까지의 홀수들의 합을 빼는 방식이고,
두 번째 공식은 n의 절반까지의 자연수들의 합을 2배하는 방식입니다.
두 공식은 동일한 결과를 도출합니다.
10번
def solution(numbers):
answer = sum(numbers)/len(numbers)
answer = round(answer, 1)
return answer
round 함수는 안써도 되지만
배우는 김에,
round() 함수는 첫 번째 인자로 반올림할 숫자를, 두 번째 인자로 소수점 이하 자릿수를 지정할 수 있다.
def solution(numbers):
return sum(numbers) / len(numbers)
아이고 깔끔해라.
굳이 answer를 도출하라고 할 필요가 없다.
11번
def solution(num):
if num % 2 == 0:
answer = 'Even'
else:
answer = 'Odd'
return answer
def evenOrOdd(num):
#함수를 완성하세요
if num%2:
return "Odd"
return "Even"
def evenOrOdd(num):
return num % 2 and "Odd" or "Even"
아름다운 풀이 과정이다.
파이썬은 () 소괄호를 써서 우선 순위를 지정하는 경우를 빼고는
먼저 쓰여진 대로 우선 순위가 성립한다.
and 연산자는 결과값이 둘다 참이어야 True를 출력하고
or은 둘중하나만 참이어도 True를 출력한다.
A and B or C
구조라고 보자.
num이 짝수여서
num%2(A)가 0이면 0 and B or C 가 된다.
이 때 앞의 B는 and 연산자로 이어져있기에
(and 연산자는 결과값이 둘다 참이어야 True를 출력하기에)
그 값을 처리할 필요도 없이 False로 반환되고
그 다음 or C가 출력되는 것이다.
num이 홀수라면
num%2(A)가 1이면 1 and B or C 가 된다.
이 때 B는 비어져있지 않은 문자열이므로 True로 반환되고
1 and 1 or C에서
or 앞부분이 True 이므로 굳이 C를 보지 않고
"odd"를 반환하는 것이다.
진짜 머리 깨지겠네 아오
암튼
or, and 연산자 심화를 확인하고 싶으면
- or
- A가 Truthy이면 B를 확인하지 않으므로 A가 저장된다.
- A가 Falsy면 B를 확인하므로 B가 저장된다. (B의 Truthy / Falsy 와 무관하다!)
- and
- A가 Truthy면 B를 확인하므로 B가 저장된다. (B의 Truthy / Falsy 와 무관하다!)
- A가 Falsy면 B를 확인하지 않으므로 A가 저장된다.
12번
def solution(arr):
return sum(arr)/len(arr)
배운 건 써먹어야지.
13번
def solution(n):
digits = [int(digit) for digit in str(n)]
return sum(digits)
간만에 뿌듯한 코드 작성.
근데 한 40분 걸렸다.
왜 생각한 대로 안나오냐구.
def sum_digit(number):
if number < 10:
return number
return number%10 + sum_digit(number//10)
이번엔 내가 진짜 똑똑하게 풀었다고 생각했는데
더 직관적인 풀이가 있었다.
재귀함수는 어려운데... 차차 알아가보는 걸로 한다.
출처 : https://ryanking13.github.io/2018/04/05/python-truthy-falsey.html
파이썬에서의 Truthy Falsy
파이썬의 Truthy와 Falsy 개념을 소개하는 글입니다.
ryanking13.github.io
SQL
21번
SELECT animal_id
from animal_ins
where name is null
order by animal_id
22번
SELECT count(user_id) as users
from user_info
where age >= 20 and
age <= 29 and
joined like '%2021%'
;
23번
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
SELECT animal_id,
name,
replace(sex_upon_intake, 'Neutered Male', 'O') as "중성화",
replace(sex_upon_intake, 'Spayed Female', 'O') as "중성화",
replace(sex_upon_intake, 'Intact Male', 'X') as "중성화"
from animal_ins
order by animal_id
이렇게 풀어보았는데, replace 함수를 쓴 부분이 "중성화"열로 한꺼번에 합쳐지지가 않는다.
순차적으로 바뀔 줄 알았는데
열을 새로 생성해버린다.
24번
나 그룹바이 몰라...
25번
SELECT animal_type, count(animal_type) count
from animal_ins
group by animal_type
order by animal_type
;
지금 내가 그룹바이 개념이 제대로 안잡혀있다.
26번
SELECT date_format(datetime, '%H') as hour, count(animal_id) as count
from animal_outs
where hour(datetime) between 9 and 19
group by hour
order by hour
;
저번에 다윤님이 공유했던 '%H'를 사용하는 쿼리