코딩 테스트 일기 - 07

윤수빈·2024년 7월 25일
0

1. SQL

문제

: 성분으로 구분한 아이스크림 총 주문량

문제 설명

: 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

문제 풀이

  1. 상반기 주문 정보와 아이스크림 성분 타입 테이블이 필요 JOIN
  2. 성분 타입별로 구하기 group by
  3. 총 주문량을 구하기 sum
  4. 총 주문량이 작은 순서대로 (오름차) 조회 order by
  5. 총 주문량을 TOTAL_ORDER 로 나타내기

구현 코드

SELECT INGREDIENT_TYPE, sum(TOTAL_ORDER) TOTAL_ORDER
from FIRST_HALF fh inner join ICECREAM_INFO info on fh.FLAVOR=info.FLAVOR
group by 1
order by 2

JavaScript

문제

: 최대공약수와 최소공배수

문제 설명

: 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

문제 풀이

  1. n과 m의 공약수와 약수를 찾는다
  2. 공약수만 담는 변수와 약수만 담는 변수를 분리한다
    • 최대공약수와 최소공배수를 별도로 구하기 위함
  3. 공약수가 담긴 배열을 모두 곱하여 최대공약수를 구한다
  4. 공약수+약수가 담긴 배열을 모두 곱하여 최소공배수를 구한다
  5. answer의 0, 1 번째 인덱스에 최대공약수와 최소공배수를 넣고 반환한다

구현 코드

function solution(n, m) {
    var answer = [1, 1];
    let divided_both = [];
    let divided_other = [];
    let next_num = [n, m];  // [0] = n, [1] = m
    let divide_num=2;
    
    if(next_num[0] !== 1 && next_num[1] !== 1) {
        // n, m 둘 중 1이 아니라면 반복
        while (next_num[0] !== 1 || next_num[1] !== 1){
        
        	// 공약수 찾기
            if(next_num[0]%divide_num == 0 && next_num[1]%divide_num == 0){
                next_num[0] /= divide_num;
                next_num[1] /= divide_num;
                divided_both.push(divide_num);
                divide_num=2;
            }
			
            // n과 m 서로소 찾기
            else if (next_num[0]%divide_num == 0) {
                next_num[0] /= divide_num;
                divided_other.push(divide_num);
                divide_num=2;
            }

            else if (next_num[1]%divide_num == 0) {
                next_num[1] /= divide_num;
                divided_other.push(divide_num);
                divide_num=2;
            }
            
            // 나눌 수 증가
            else divide_num++;
        }
    }
    
    // 최대 공약수 구하기
    divided_both.forEach(e=>{
        answer[0]*=e;
    })
    
    // 최소 공배수 구하기
    divided_both.forEach(e=>{
        answer[1]*=e;
    })
    divided_other.forEach(e=>{
        answer[1]*=e;
    })
    return answer;
}

다른 풀이

# 유클리드 호제법 활용
function gcdlcm(a, b) {
    var r;
    for(var ab= a*b;r = a % b;a = b, b = r){}
    return [b, ab/b];
}

처음 봤을때 이렇게 간결하게 된다는게 어이가 없었다.
사실 그냥 보면 전혀모르겠다..

무지함에 반성을하면서 공부해봐야겠다.
실제 회사에서도 쓰이는 것일지는 몰라도 무슨 뜻인지는 알아야한다고 생각한다.

profile
정의로운 사회운동가

0개의 댓글