코딩 테스트 일기 - 03

윤수빈·2024년 7월 17일
0
post-custom-banner

1. SQL

오늘 문제

: 오랜 기간 보호한 동물(1)

문제 설명

: 아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

작성 흐름

  1. 2개의 테이블을 다뤄야 하고 입양을 못간 동물까지 조회해야 하므로 left/right join 사용
    from ANIMAL_INS ani left join ANIMAL_OUTS ano on ani.ANIMAL_ID=ano.ANIMAL_ID
  2. join 결과 중에서 입양을 못 간 동물을 필터
    where ano.DATETIME is null key 값은 다른거로 해도 무방
  3. 보호 시작일 순으로 조회
    order by ani.DATETIME
  4. 가장 오래 보호소에 있던 동물 3마리만 조회
    limit 3 order by 마지막에 LIMIT 키워드 사용

완성 코드

SELECT ani.NAME, ani.DATETIME
from ANIMAL_INS ani left join ANIMAL_OUTS ano on ani.ANIMAL_ID=ano.ANIMAL_ID
where ano.DATETIME is null
order by ani.DATETIME 
limit 3

문제 고민 및 해결

상위 3마리만 출력하는 부분이 기억이 안나서 혹시나 별도 키워드가 있는지 찾아보던 와중에 RDBMS 별 문법 차이가 있는 것과 LIMIT 이라는 키워드를 알게되었다.

RDBMSFunction
MS-SQLSELECT Top N, Top N with ties
ORACLEWHERE rownum < N+1
MySQLLIMIT N

이 중에 MySQL이 가장 보기 편해보이고 명확해보였다.
그리고 코테에서 MS-SQL 사용해보니 오류가 발생하기도 했다.

MS-SQL은 SELECT 절에서 사용하는 점,
ORCLE은 WHERE 절에서 사용하는 점이 특징이고,
MySQL은 구문 제일 마지막에 사용하면 되었다.


2. JavaScript

오늘 문제

: 수박수박수박수박수박수?

문제 설명

: 길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

입출력 예

nreturn
3수박수
4수박수박

작성 흐름

  1. 반복 연산이 필요하다.
  2. '수' 부터 시작한다.
  3. 수는 홀수, 박은 짝수로 본다.

완성 코드

function solution(n) {
    var answer = '';
    let count=1;
    while(count<=n) {
        count%2!==0 ? answer += '수' : answer += '박';
        count++;
    }
    return answer;
}

테스트 결과

문제 고민 및 해결

처리 속도가 불안정하고, 느리다고 생각되어서 다른 풀이를 고민해 보았다.

substr(), map(), repeat() 등 다양한 풀이가 있었는데 repeat() 함수가 이름부터 반복적인 것에 최적인 것 같아 사용해보았다.

repeat() 함수는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환한다.

파라미터로 하나를 받을 수 있다.

1. repeat() 예시

"abc".repeat(-1); // RangeError
"abc".repeat(0); // ''
"abc".repeat(1); // 'abc'
"abc".repeat(2); // 'abcabc'
"abc".repeat(3.5); // 'abcabcabc' (count will be converted to integer)
"abc".repeat(1 / 0); // RangeError

({ toString: () => "abc", repeat: String.prototype.repeat }).repeat(2);
// 'abcabc' (repeat() is a generic method)

2. 풀이

n 만큼 반복해야하는데 수->박->수-> ... 형식으로 어떻게 출력할 지 고민이 되었다.

기존 풀이대로 한다면 n을 기준으로 홀수/짝수를 조건을 주면 박으로 시작하는 경우도 생길 것 같았다.
ex) n%2 ? '박' : '수' 조건일 때 n이 짝이면 박부터 시작하는 상황..

그래서 생각해본건 repeat() 예제에서 소수점이 있는 경우였다.
"abc".repeat(3.5); // 'abcabcabc'
내림이 되어 3번 반복 된 것을 확인할 수 있는데 이 경우를 활용해서
'수박'을 하나로 두면 2배길이가 될거니까 반을 나누자고 생각했다.
ex) '수박'.repeat(n/2)

그래서 n/2 반복하는데 만약 n이 1이라면 '수'가 나와야 할텐데 아무것도 나오지 않는 상황 + '수박'만 출력될 것이다.
ex) '수박'.repeat(n/2) -> n=1, '' + n=n, '수박수박...수박'

이럴 경우를 대비해서 마지막에 n이 홀수인지 짝수인지 확인하여 '수' 를 확인하고, 최종적으로 결과를 붙인다면 잘 나오지 않을까 생각했다.
ex '수박'.repeat(n/2) + (n%2!==0 ? '수' : '') 괄호 무조건 필수..

3. 완성 코드 및 결과

function solution(n) {
    let answer = '';
    return answer = '수박'.repeat(n/2) + (n%2!==0 ? '수' : '');
}

결과는 성공!


3. 마무리

SQL에서는 LIMIT 키워드를 통해 상위 n 개 row만 조회하는 방법을 배우고,
JS에서는 repeat() 함수를 배우면서 기존 코드를 최적화했다.

처리 속도도 훨씬 빠르고 안정적이어서 굉장히 뿌듯했다.
repeat() 함수를 처음 활용해보면서 배우는 시간이 되었다.

profile
정의로운 사회운동가
post-custom-banner

0개의 댓글