본문 바로가기
알고리즘 문제풀이/Programmers

코딩테스트 연습 - 6일차

by 코도꼬마 2023. 11. 11.
  JAVA SCRIPT SQL
6일차 4개 8개 6개
5일차 7개 8개 9개
4일차 9개 10개 9개
3일차 11개 10개 8개
2일차 10개 8개 7개
1일차 9개 7개 14개

 

JAVA 

1. 팩토리얼

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 * 4 * 3 * 2 * 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

class Solution {    
    
    //fac 메서드
    public static int fac(int num){
        //num이 1보다 크면
        if(num > 1){
            //num*fac(num-1) 반환
            return num*fac(num-1);
        }
        //아니면 num 반환
        return num;            
    }
    
    public int solution(int n) {
        int answer = 0;
        
        //n만큼 for문 돌기
        for(int i=1; i<=n; i++){
            //fac(i)가 n보다 작으면
            if(n >= fac(i)){
                //answer = i
                answer = i;
            //아니면                
            }else {
                //break
                break;
            }
        //for문 끝            
        }
                
        return answer;
    }
}

 

2. k의 개수

1부터 13까지의 수에서, 1은 1, 10, 11, 12, 13 이렇게 총 6번 등장합니다. 정수 i, j, k가 매개변수로 주어질 때, i부터 j까지 k가 몇 번 등장하는지 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int i, int j, int k) {
        int answer = 0;
        
        //i~j만큼 for문 돌기
        for(int e=i; e<=j; e++){
            //e를 배열로 변환
            String[] arr = String.valueOf(e).split("");
            
            //e의 크기만큼 for문 돌기
            for(int y=0; y<arr.length; y++){
                //배열의 값을 하나씩 가져와 k와 같으면
                if(arr[y].equals(String.valueOf(k))){
                    //answer++
                    answer++;
                }
            //for문 끝                
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

3. 숨어있는 숫자의 덧셈 (2)

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(String my_string) {
        int answer = 0;

        // 문자열을 배열로 변환
        String[] arr = my_string.split("");

        // 임시값 저장 변수
        int temp = 0;

        // 배열의 크기만큼 for문 돌기
        for (int i = 0; i < arr.length; i++) {
            // i가 숫자이면
            if (arr[i].matches("[0-9]")) {
                // temp에 현재 index i값 저장
                temp = Integer.parseInt(arr[i]);

                // 다음 index가 숫자이면
                while (i + 1 < arr.length && arr[i + 1].matches("[0-9]")) {
                    // temp에 10을 곱하고 다음 index의 값을 더함
                    temp = temp * 10 + Integer.parseInt(arr[i + 1]);
                    i++;
                }

                // answer에 temp값 저장
                answer += temp;
            }
        }

        return answer;
    }
}

 

4. 가까운 수

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

import java.util.*;

class Solution {
    public int solution(int[] array, int n) {     
        
        //answer array[0]으로 초기화 
        int answer = array[0];
        
        //배열 정렬
        Arrays.sort(array);
        
        //최소값 array[0]-n의 절대값으로 초기화
        int min = Math.abs(array[0]-n);
        
        //배열의 크기만큼 for문 돌기
        for (int i=1; i<array.length; i++) {
            //array[i]-n의 절대값 가져오기
            int temp = Math.abs(array[i]-n);
            
            //temp 값이 최소값보다 작으면
            if(min > temp){
                //최소값 변경
                min = temp;
                
                //answer에 array[i] 저장
                answer = array[i];
            }
        }

        return answer;
    }
}

 

 

 

SCRIPT

1. 홀수 vs 짝수

정수 리스트 num_list가 주어집니다. 가장 첫 번째 원소를 1번 원소라고 할 때, 홀수 번째 원소들의 합과 짝수 번째 원소들의 합 중 큰 값을 return 하도록 solution 함수를 완성해주세요. 두 값이 같을 경우 그 값을 return합니다.

function solution(num_list) {
    var answer = 0;
    
    //홀수 합을 담을 변수 선언
    let sum1 = 0;
    //짝수 합을 담을 변수 선언
    let sum2 = 0;
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<num_list.length; i++){
        //짝수일 때 + sum2
        if(i%2 == 0){
            sum2 += num_list[i];
        }else {
            //홀수일 때 + sum1
            sum1 += num_list[i];
        }
    //for문 끝        
    }
    
    //두 값을 비교하여 큰 값을 answer에 저장
    answer = Math.max(sum1, sum2);
    
    
    return answer;
}

 

2. 홀짝 구분하기

자연수 n이 입력으로 주어졌을 때 만약 n이 짝수이면 "n is even"을, 홀수이면 "n is odd"를 출력하는 코드를 작성해 보세요.

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

let input = [];

rl.on('line', function (line) {
    input = line.split(' ');
}).on('close', function () {
    n = Number(input[0]);
    
    if(n%2 == 0){
        console.log(n+' is even')
    }else {
        console.log(n+' is odd')
    }
    
});

 

3. x 사이의 개수

문자열 myString이 주어집니다. myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

function solution(myString) {
    var answer = [];
    
    //myString을 x를 기준으로 배열로 변환
    let arr = myString.split("x");
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //각각의 배열의 길이를 answer에 저장
        answer.push(arr[i].length);
    //for문 끝        
    }
    
    return answer;
}

 

4. 특별한 이차원 배열 2(이해안감)

n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

  • 0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]
function solution(arr) {
    var answer = 0;
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 크기만큼 for문 돌기
        for(let j=0; j<arr.length; j++){
            //arr[i][j] == arr[j][i]이면
            if(arr[i][j] != arr[j][i]){
                //answer = 1 & break
                return 0;
            }
        //for문 끝
        }
    //for문 끝
    }
    
    return 1;
}

 

5. 가까운 1 찾기

정수 배열 arr가 주어집니다. 이때 arr의 원소는 1 또는 0입니다. 정수 idx가 주어졌을 때, idx보다 크면서 배열의 값이 1인 가장 작은 인덱스를 찾아서 반환하는 solution 함수를 완성해 주세요.

단, 만약 그러한 인덱스가 없다면 -1을 반환합니다.

function solution(arr, idx) {
    var answer = -1;
    
    //i=idx부터 배열의 크기만큼 for문 돌기
    for(let i=idx; i<arr.length; i++){
        //배열의 값이 1이면
        if(arr[i] == 1){
            //answer = i
            answer = i;
            break;
        }
    //for문 끝        
    }
    
    return answer;
}

 

6. 두 수의 연산값 비교하기

연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.

  • 12 ⊕ 3 = 123
  • 3 ⊕ 12 = 312

양의 정수 a와 b가 주어졌을 때, a  b와 2 * a * b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요.

단, a  b와 2 * a * b가 같으면 a  b를 return 합니다.

function solution(a, b) {
    var answer = 0;
    
    //a와 b를 합친 값을 담을 변수 선언
    let sum1 = a+''+b;
    //2 * a * b의 값을 담을 변수 선언
    let sum2 = 2*a*b;
    
    //두 값중 큰 값을 answer에 저장
    answer = Math.max(sum1, sum2);
    
    return answer;
}

 

7. 콜라츠 수열 만들기

모든 자연수 x에 대해서 현재 값이 x이면 x가 짝수일 때는 2로 나누고, x가 홀수일 때는 3 * x + 1로 바꾸는 계산을 계속해서 반복하면 언젠가는 반드시 x가 1이 되는지 묻는 문제를 콜라츠 문제라고 부릅니다.

그리고 위 과정에서 거쳐간 모든 수를 기록한 수열을 콜라츠 수열이라고 부릅니다.

계산 결과 1,000 보다 작거나 같은 수에 대해서는 전부 언젠가 1에 도달한다는 것이 알려져 있습니다.

임의의 1,000 보다 작거나 같은 양의 정수 n이 주어질 때 초기값이 n인 콜라츠 수열을 return 하는 solution 함수를 완성해 주세요.

function solution(n) {
    var answer = [];
    
    answer.push(n);
    
    //n = 1이 될 때까지 while문 반복
    while(n != 1){
        //짝수이면
        if(n%2 == 0){
            //n/2
            n /= 2;
        //홀수이면            
        }else {
            //3*x+1
            n = 3*n+1;
        }
        //n의 값 answer에 추가
        answer.push(n);
    //while문 끝        
    }
    
    return answer;
}

 

8. ad 제거하기

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

function solution(strArr) {
    var answer = [];
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<strArr.length; i++){
        //배열의 값 중 "ad"을 포함하고 있지 않으면
        if(strArr[i].indexOf("ad") == -1){
            //answer에 추가
            answer.push(strArr[i]);
        }
    //for문 끝        
    }
    
    return answer;
}

 

 

SQL

1. 카테고리 별 도서 판매량 집계하기

-- 코드를 입력하세요
SELECT
    CATEGORY
    ,SUM(A.SALES) AS TOTAL_SALES
FROM BOOK_SALES A
LEFT JOIN BOOK B ON A.BOOK_ID = B.BOOK_ID
WHERE 1=1
AND TO_CHAR(A.SALES_DATE, 'YYYY-MM') = '2022-01'
GROUP BY B.CATEGORY
ORDER BY B.CATEGORY ASC;

 

2. 있었는데요 없었습니다

-- 코드를 입력하세요
SELECT
    O.ANIMAL_ID
    ,O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE 1=1 
AND O.DATETIME < I.DATETIME
ORDER BY I.DATETIME ASC;

 

3. 오랜 기간 보호한 동물(2)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

-- 코드를 입력하세요
SELECT
    O.ANIMAL_ID
    ,O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE 1=1
AND (O.DATETIME - I.DATETIME) > 0
ORDER BY (O.DATETIME - I.DATETIME) DESC
FETCH FIRST 2 ROWS ONLY;

 

4. 조건별로 분류하여 주문상태 출력하기

-- 코드를 입력하세요
SELECT
    ORDER_ID
    ,PRODUCT_ID
    ,TO_CHAR(OUT_DATE,'YYYY-MM-DD')
    ,(CASE
        WHEN TO_CHAR(OUT_DATE,'MM-DD') <= '05-01' THEN '출고완료'
        WHEN TO_CHAR(OUT_DATE,'MM-DD') > '05-01' THEN '출고대기'
        ELSE '출고미정' END
     ) AS 출고여부
FROM FOOD_ORDER 
ORDER BY ORDER_ID ASC;

 

5. 조건에 맞는 사용자와 총 거래금액 조회하기

-- 코드를 입력하세요
SELECT
    U.USER_ID
    ,U.NICKNAME
    ,SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD B
LEFT JOIN USED_GOODS_USER U ON B.WRITER_ID = U.USER_ID
WHERE 1=1
AND STATUS = 'DONE'
GROUP BY U.USER_ID, U.NICKNAME
HAVING SUM(B.PRICE) >= 700000
ORDER BY TOTAL_SALES ASC;

 

6. 즐겨찾기가 가장 많은 식당 정보 출력하기

-- 코드를 입력하세요
SELECT
    FOOD_TYPE
    ,REST_ID
    ,REST_NAME
    ,FAVORITES
FROM REST_INFO 
WHERE 1=1
AND (FOOD_TYPE, FAVORITES) IN 
    (SELECT 
        FOOD_TYPE, MAX(FAVORITES) 
    FROM REST_INFO 
    GROUP BY FOOD_TYPE)
ORDER BY FOOD_TYPE DESC;