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

코딩테스트 연습 - 12일차

by 코도꼬마 2023. 11. 20.
  JAVA SCRIPT SQL
12일차 1개 5개 2개
11일차 3개 4개 3개
10일차 3개 3개 4개
9일차 5개 4개 4개
8일차 2개 7개 3개
7일차 3개 6개 4개
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. 등수 매기기

영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.

import java.util.*;
import java.util.stream.IntStream;

class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        
        //평균값을 담을 배열 선언(평균값이기 때문에 double로!!)
        double[] avg = new double[score.length];
        
        //배열의 크기만큼 for문 돌기
        for(int i=0; i<score.length; i++){
            //배열 i의 값을 가져와 평균 값을 새로운 배열에 저장
            avg[i] = (score[i][0]+score[i][1])/2;     
        //for문 끝            
        }
        
        //평균값을 저장한 배열을 복사한 배열 선언 후 역순정렬
        Double[] cpArr = Arrays.stream(avg).boxed().toArray(Double[]::new);
        Arrays.sort(cpArr, Collections.reverseOrder());
        
        //avg 배열의 크기만큼 for문 돌기
        for(int j=0; j<avg.length; j++){
            //배열의 값을 하나씩 가져와 cpArr배열의 index를 구해 +1하여 answer에 저장  
            double num = avg[j];
            int index = IntStream.range(0, cpArr.length)
                        .filter(i -> cpArr[i] == num)
                        .findFirst()
                        .orElse(-1);
            
            answer[j] = index + 1;
        }
        
        return answer;
    }
}
import java.util.*;
class Solution {
    public int[] solution(int[][] score) {
        int[] answer = new int[score.length];
        
    	//각 배열의 값의 합을 담을 list 선언
        List<Integer> scoreList = new ArrayList<>();
        
        //배열의 크기만큼 for문 돌기
        for(int[] s : score){
        	//list에 배열의 값들의 합을 저장
            scoreList.add(s[0] + s[1]);
        }
        
        //list 역순 정렬
        scoreList.sort(Comparator.reverseOrder());
        
        //배열의 크기만큼 for문 돌기
        for(int i=0; i<score.length; i++){
        	//배열의 각 값의 합과 같은 값을 가지고 있는 list의 index에 1을 더해 answer에 저장
            answer[i] = scoreList.indexOf(score[i][0] + score[i][1])+1;
        }
        
        return answer;
    }
}

 

 

 

 

SCRIPT

1. 간단한 논리 연산

boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.

  • (x1  x2) ∧ (x3  x4)
function solution(x1, x2, x3, x4) {
    var answer = true;
    
    //두 값의 연산의 결과를 담을 변수 선언
    let sum1 = true;
    let sum2 = true;
    
    //x1 or x2가 true이면
    if(x1||x2){
        //sum1 = true
        sum1 = true;
    }
    //하나라도 false 이면
    else {
        //sum1 = false
        sum1 = false;
    }
    
    //x3 or x4 true이면
    if(x3||x4){
        //sum2 = true
        sum2 = true;
    }
    //하나라도 false 이면
    else {
        //sum2 = false
        sum2 = false;
    }
    
    //두 연산값 중 하나라도 false이면
    if(!sum1||!sum2){
        //answer = false
        answer = false;
    }
    
    return answer;
}

 

2. 문자열 반복해서 출력하기

문자열 str과 정수 n이 주어집니다.
str n번 반복된 문자열을 만들어 출력하는 코드를 작성해 보세요.

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 () {
    str = input[0];
    n = Number(input[1]);
    
    console.log(str.repeat(n));
});

 

3. 수열과 구간 쿼리 4

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

 query마다 순서대로 s  i  e인 모든 i에 대해 i가 k의 배수이면 arr[i]에 1을 더합니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

function solution(arr, queries) {
    var answer = [];
    
    //queries의 1차원 크기만큼 for문 돌기 
    for(let i=0; i<queries.length; i++){
        //s부터 e까지 for문 돌기
        for(let j=queries[i][0]; j<=queries[i][1]; j++){
            //i가 k의 배수이면 arr[i]에 1 더하기
            let num = queries[i][2];
            if(j%num == 0){                
                arr[j] += 1;
            }
        //for문 끝            
        }
    //for문 끝        
    }
    
    answer = [...arr];
    
    return answer;
}
const solution=(a,q)=>q.length?solution(a.map((v,i)=>i>=q[0][0]&&i<=q[0][1]&&!(i%q[0][2])?v+1:v),q.slice(1)):a;

 

4. 2의 영역

정수 배열 arr가 주어집니다. 배열 안의 2가 모두 포함된 가장 작은 연속된 부분 배열을 return 하는 solution 함수를 완성해 주세요.

단, arr에 2가 없는 경우 [-1]을 return 합니다.

function solution(arr) {
    var answer = [];
    
    //앞에서부터 2의 index의 값을 찾아 저장
    const index1 = arr.indexOf(2);
    //뒤에서 부터 2의 index의 값을 찾아 저장
    const index2 = arr.lastIndexOf(2);
    
    //1부터 2까지의 배열 반환
    answer = [...arr.slice(index1,index2+1)];
    
    //2가 없으면 -1 저장
    if(index1 == -1){
        answer.push(-1);
    }
    
    return answer;
}

 

5. 문자열 묶기

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

function solution(strArr) {
    var answer = 0;
    
    //배열의 길이의 개수를 저장할 배열 선언
    let arr = [];
    //배열의 길이를 문자열의 최대 길이인 30 + 1로 초기화
    arr.length = 31;
    //각 배열의 값에 0 저장
    arr.fill(0);
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<strArr.length; i++){
        //배열의 길이를 가져와서
        let num = strArr[i].length;
        //arr의 해당 길이의 index의 값 ++
        arr[num]++;
    //for문 끝        
    }
    
    //배열의 최대값 저장
    answer = Math.max.apply(null,arr);
    
    return answer;
}
const solution = strArr => Math.max(...Array(31).fill(0).map((_, i) => strArr.map(v => v.length).filter(v => v == i).length))

 

 

 

SQL

1. 입양 시각 구하기(2)

<!-- LEVEL : 계층형 쿼리로 연속적으로 증가하는 값이 필요한 경우 CONNNECT BY와 함께 사용 -->
WITH SETTIME AS (
    SELECT
        LEVEL -1 AS HOUR
    FROM dual
    CONNECT BY LEVEL <= 24    
)

SELECT
    T.HOUR
    ,COUNT(A.ANIMAL_ID) AS COUNT
FROM SETTIME T
LEFT JOIN ANIMAL_OUTS A ON TO_CHAR(T.HOUR, 'FM00') = TO_CHAR(A.DATETIME, 'HH24')
GROUP BY T.HOUR
ORDER BY 1;

 

2. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

SELECT 
    CAR_ID
    ,CAR_TYPE
    ,FEE
FROM (
    SELECT
        C.CAR_ID
        ,C.CAR_TYPE
        ,(C.DAILY_FEE*30)*(100-P.DISCOUNT_RATE)/100 AS FEE
    FROM CAR_RENTAL_COMPANY_CAR C
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P 
    ON P.CAR_TYPE = C.CAR_TYPE AND P.DURATION_TYPE = '30일 이상'
    WHERE 1=1
    AND C.CAR_TYPE IN ('SUV', '세단')
    AND C.CAR_ID NOT IN(
        SELECT 
            H.CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
        WHERE 1=1
        AND TO_DATE('20221101', 'YYYYMMDD') <= H.END_DATE
    )
)
WHERE 1=1
AND FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC;