코딩 테스트 일기 - 02

윤수빈·2024년 7월 12일
0

1. SQL

오늘 문제

: 입양 시각 구하기

문제 설명

: 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

작성 흐름

  1. 09:00 ~ 19:59 시까지 조회
SELECT DATETIME
from ANIMAL_OUTS
where date_format(DATETIME,'%H%i') between '0900' and '1959'
  1. 시간대별 나누기
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
  1. 시간대별 카운트 하기
group by 된 것을 count() 함수 사용
  1. 시간대 순으로 정렬하기 (오름차)
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 함수를 완성해주세요.

입출력 예

absolutessignsresult
[4, 7, 12][true, false, true]9
[1, 2, 3][false, false, true]0

작성 흐름

  1. 반복 연산이 필요하다
  2. 반복 기준은 하나만 써도 될 것 같다.
  3. 최종 연산은 signs 로 조건을 준다.
  4. absolutes, signs의 길이가 같다.

완성 코드

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;
}

테스트 결과


🤔 다른 풀이

뭔가 코드가 길어 보여서 다른 방식으로 풀이하고 싶었다.

1. 삼항 연산자 풀이

기존 코드에서 삼항 연산자를 사용하였다.

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;
}

테스트 결과는 처음과 동일하게 나왔고 속도도 동일했다.

2. reduce() 풀이

다른 사람 문제 풀이를 보니 reduce() 함수를 사용한것을 보고, 바로 복습해보기 위해 풀이를 보지 않고 직접 코드를 작성해봤다.

function solution(absolutes, signs) {
    var answer = 0;
    answer = absolutes.reduce((number, n, i) => {
        return number + n*(signs[i] ? 1 : -1);
    }, 0)
    return answer;
}
  1. 초깃값 0을 number에 넣는다
  2. absolutes 1번째 값을 n에 넣는다.
  3. signs 배열 1번째가 true 인경우 1, false인 경우 -1 처리한다.
  4. n 과 signs의 값을 곱한다.
  5. number+n 값을 return 하고 number에 넣는다.
  6. absolutes 2번째 값을 n에 넣는다.
  7. ... 이후 3~5 반복

이번 기회를 통해 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() 함수가 더 유용하지 않을까 싶다.
이 부분은 더 공부가 필요하다...

profile
정의로운 사회운동가

0개의 댓글