1. SQL
: 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT DATETIME
from ANIMAL_OUTS
where date_format(DATETIME,'%H%i') between '0900' and '1959'
case when date_format(DATETIME,'%H')='09' then 9
when date_format(DATETIME,'%H')='10' then 10
when date_format(DATETIME,'%H')='11' then 11
when date_format(DATETIME,'%H')='12' then 12
when date_format(DATETIME,'%H')='13' then 13
when date_format(DATETIME,'%H')='14' then 14
when date_format(DATETIME,'%H')='15' then 15
when date_format(DATETIME,'%H')='16' then 16
when date_format(DATETIME,'%H')='17' then 17
when date_format(DATETIME,'%H')='18' then 18
when date_format(DATETIME,'%H')='19' then 19 end HOUR
from ...
group by 1
group by 된 것을 count() 함수 사용
order by 사용
-- 코드를 입력하세요
select case when date_format(DATETIME,'%H')='09' then 9
when date_format(DATETIME,'%H')='10' then 10
when date_format(DATETIME,'%H')='11' then 11
when date_format(DATETIME,'%H')='12' then 12
when date_format(DATETIME,'%H')='13' then 13
when date_format(DATETIME,'%H')='14' then 14
when date_format(DATETIME,'%H')='15' then 15
when date_format(DATETIME,'%H')='16' then 16
when date_format(DATETIME,'%H')='17' then 17
when date_format(DATETIME,'%H')='18' then 18
when date_format(DATETIME,'%H')='19' then 19 end HOUR,
count(1)
from
(SELECT DATETIME
from ANIMAL_OUTS
where date_format(DATETIME,'%H%i') between '0900' and '1959') a
group by 1
order by 1
서브쿼리로 09:00 ~ 19:59 까지 시간만 조회하고 메인 쿼리에서 case when문으로 시간대별을 나누어 카운트 하였다.
생각보다 길어서 더 짧은 방법이 있지않을까? 도 생각나긴하는데 잘 모르겠다 ㅋㅋㅋㅋ
2. JavaScript
: 음양 더하기
: 어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.
absolutes | signs | result |
---|---|---|
[4, 7, 12] | [true, false, true] | 9 |
[1, 2, 3] | [false, false, true] | 0 |
function solution(absolutes, signs) {
var answer = 0;
for(let i=0; i<absolutes.length;i++) {
if (signs[i]) {
answer += absolutes[i]
}
else {
answer += (absolutes[i]*-1)
}
}
return answer;
}
뭔가 코드가 길어 보여서 다른 방식으로 풀이하고 싶었다.
기존 코드에서 삼항 연산자를 사용하였다.
function solution(absolutes, signs) {
var answer = 0;
for(let i=0; i<absolutes.length;i++) {
signs[i] ? answer += absolutes[i] : answer += (absolutes[i]*-1);
}
return answer;
}
테스트 결과는 처음과 동일하게 나왔고 속도도 동일했다.
다른 사람 문제 풀이를 보니 reduce() 함수를 사용한것을 보고, 바로 복습해보기 위해 풀이를 보지 않고 직접 코드를 작성해봤다.
function solution(absolutes, signs) {
var answer = 0;
answer = absolutes.reduce((number, n, i) => {
return number + n*(signs[i] ? 1 : -1);
}, 0)
return answer;
}
이번 기회를 통해 reduce() 함수를 맛볼 수 있었다.
결과는??
기존 코드와 속도차이가 꽤 났었다.
3. 마무리
기존 작성한 코드는 absolutes.length
프로퍼티에 계속 접근을 해야하기 때문에 한번만 접근하도록 let length = absolutes.length
변수에 저장하여 변수를 직접 사용하거나 함수 전역 변수가 아닌 for() 내부 변수로 선언하는 방식으로 최적화가 필요하다.
ex)
function solution(absolutes, signs) {
var answer = 0;
for(let i=0, length=absolutes.length; i<length; i++) {
signs[i] ? answer += absolutes[i] : answer += (absolutes[i]*-1);
}
return answer;
}
속도는 차이가 나지만 메모리 사용으로는 reduce() 함수가 더 유용하지 않을까 싶다.
이 부분은 더 공부가 필요하다...