SELECT activity_date AS day,
Count(DISTINCT user_id) AS active_users
FROM activity
WHERE activity_date BETWEEN '2019-06-28' AND '2019-07-27'
GROUP BY 1
알고리즘 코드카타 30번
문자열에서 가운데 글자를 반환하는 함수를 만드는 문제. 단어의 길이가 짝수일 경우 가운데 두 글자를 반환하면 된다. 예를 들어,
우선 단어의 길이가 홀수냐, 짝수냐를 기준으로 분기를 나누어 처리해야 하므로
def solution(s):
if len(s)%2 == 1:
answer =
else:
answer =
return answer
이렇게 적어주고, 가운데 글자를 어떻게 식별할지만 결정하면 된다.
1) 문자열의 길이가 홀수일 경우
s = abcde라면 출력해야 할 c는 index 기준으로 2번에 해당하고, s = abcdefg라면 출력해야 할 d는 index 기준으로 3번에 해당한다. 따라서, 문자열이 홀수일 때 가운데 글자는 문자열의 길이(5)를 절반으로 나눈(2.5) 후 소수점을 버린 값(2)을 index로 계산하면 구할 수 있다.
2) 문자열의 길이가 짝수일 경우
s = abcd라면 bc는 index 기준으로 1,2이므로 이 때는 문자열의 길이를 반으로 나눈 값과, 그보다 하나 전의 값을 합쳐서 출력하면 된다.
def solution(s):
answer = ''
if len(s)%2 == 1:
answer = s[int(len(s)/2)]
else:
answer = s[int((len(s)/2)-1)]+s[int(len(s)/2)]
return answer
이 때 주의할 점은 문자열의 길이를 계산할 때 round를 쓰면 오류 케이스가 나온다는 것. round는 올림과 내림의 크기가 같을 경우(즉, 0.5를 처리할 경우) 짝수 쪽으로 반올림하기 때문에 round(1.5)와 round(2.5)는 모두 결과가 2로 동일하다.
예컨대 문자열의 길이가 3일 경우, 실제로는 2번째 글자(즉, index기준으로 1번째)가 출력되어야 하지만 round(3/2) = 2이기 때문에 마지막 글자(index[2])가 출력되어서 오류가 나는 셈. 따라서 이런 오류를 방지하려면 round 대신 int로 감싸서 소수점 아래를 버림 처리해야 한다.
그리고 마지막의
answer = s[int((len(s)/2)-1)]+s[int(len(s)/2)]
이 부분은 문자열의 슬라이싱 문법에 따라
answer = s[int((len(s)/2))-1:int(len(s)/2)+1]
이렇게 적어도 당연히 무방하겠다.
오늘은 SQL, 알고리즘 코드카타가 모두 크게 어렵지 않아서 비교적 시간이 덜 걸렸다.