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

코딩테스트 연습 - 8일차

by 코도꼬마 2023. 11. 14.
  JAVA SCRIPT SQL
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. 문자열 계산하기

    - 예시에는 두수를 연산하는 것 밖에 없어서 두 수 이상일 경우를 생각하지 못해 시간이 오래 걸림

my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 문자열 my_string이 매개변수로 주어질 때, 수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.

class Solution {
    public int solution(String my_string) {
        
        //문자열 공백 기준으로 잘라서 배열로 변환
        String[] arr = my_string.split(" ");
        
        int answer = Integer.parseInt(arr[0]);        
        
        //index 1부터 배열의 크기만큼 for문 돌기
        for(int i=1; i<arr.length; i+=2){
            //i가 "+"이면
            if("+".equals(arr[i])){
                answer += Integer.parseInt(arr[i+1]);
            }
            //index 1의 값이 -일 경우
            else {
                answer -= Integer.parseInt(arr[i+1]);                  
            }
        }
                
        return answer;
    }
}

 

2. 구슬을 나누는 경우의 수

    - 힌트에 나온 공식대로 계산해보았지만 되지 않았음

    - 식을 하나씩 계산하여 공통되는 부분을 제거하고 연산을 하니 통과됨

    - 수학 지식이 부족해서 풀이가 오래 걸리는 것 같음..

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

class Solution {
    
    public long solution(int balls, int share) {
        
        long answer = 1;
        
        
        int index = 1;
       
        //분모의 (n-m)!은 분자의 n!에서 (n-m)!만큼 나눠서 없앴기 때문에 share+1부터 balls까지만 for문 돌기
        for(int i=share+1; i<=balls; i++){
            //분자 n!에서 (n-m)! 만큼 빼고 나머지 값 연산
            answer *= i;
            
            //분모에서 (n-m)!을 제거했기 때문에 m!값만 연산
            answer /= index;
            
            //m!만큼 나눠주기 위해 ++
            index++;            
        }
        
        return answer;
    }
    
}

 

 

 

 

SCRIPT

1. 문자 리스트를 문자열로 변환하기

문자들이 담겨있는 배열 arr가 주어집니다. arr의 원소들을 순서대로 이어 붙인 문자열을 return 하는 solution함수를 작성해 주세요.

function solution(arr) {
    var answer = '';
    
    answer = arr.join("");
    
    return answer;
}

 

2. 문자열 돌리기

문자열 str이 주어집니다.
문자열을 시계방향으로 90도 돌려서 아래 입출력 예와 같이 출력하는 코드를 작성해 보세요.

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

let input = [];

rl.on('line', function (line) {
    input = [line];
}).on('close',function(){
    str = input[0];
    
    //문자열을 배열로 변환
    let arr = str.split("");
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 값 하나씩 출력
        console.log(arr[i]);        
    }
    
});

 

3. 수 조작하기 2

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

  • "w" : 수에 1을 더한다.
  • "s" : 수에 1을 뺀다.
  • "d" : 수에 10을 더한다.
  • "a" : 수에 10을 뺀다.

그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

function solution(numLog) {
    var answer = '';
    
    //배열의 크기 -1 만큼 for문 돌기
    for(let i=0; i<numLog.length; i++){
        //i+1의 값이 i보다 1 클 경우   
        if(numLog[i+1]-numLog[i] == 1){
            //answer += w
            answer += "w";
        }
        //i+1의 값이 i보다 1 작을 경우  
        else if(numLog[i+1]-numLog[i] == -1){
            //answer += s
            answer += "s";
        }
        //i+1의 값이 i보다 10 클 경우    
        else if(numLog[i+1]-numLog[i] == 10){
            //answer += d
            answer += "d";
        }
        //i+1의 값이 i보다 10 작을 경우    
        else if(numLog[i+1]-numLog[i] == -10){
            //answer += a
            answer += "a";
        }        
    }
        
    
    return answer;
}

 

4. 주사위 게임 2

1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.

  • 세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
  • 세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
  • 세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.

세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

function solution(a, b, c) {
    var answer = 0;
    
    //세 숫자가 모두 다를 경우
    if(a != b && b != c && a != c){
        answer += a+b+c;
    }
    
    //세 숫자 모두 같을 경우
    if(a == b || b == c){
        //세 숫자 중 두 숫자만 같을 경우
        if(a != b || b != c || a != c){            
            answer += (a+b+c) * ((a ** 2) + (b ** 2) + (c ** 2));   
        }
        else{
            answer += (a+b+c) * ((a ** 2) + (b ** 2) + (c ** 2)) * ((a ** 3) + (b ** 3) + (c ** 3));             
        }       
    }
    
    
    return answer;
}

 

5. 9로 나눈 나머지

음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.
이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.

function solution(number) {
    var answer = 0;
    
    let arr = number.split("");
    
    for(let i=0; i<arr.length; i++){
        answer += parseInt(arr[i]);
    }
    
    console.log(answer);
    
    answer %= 9;
    
    return answer;
}

 

6. 세로 읽기

문자열 my_string과 두 정수 m, c가 주어집니다. my_string을 한 줄에 m 글자씩 가로로 적었을 때 왼쪽부터 세로로 c번째 열에 적힌 글자들을 문자열로 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, m, c) {
    var answer = '';
    
    //문자열을 배열로 변환
    let arr = my_string.split("");
    
    //배열의 크기만큼 for문 돌기(c부터 m만큼 커지기)
    for(let i=c-1; i<arr.length; i+=m){
        //배열의 값을 answer에 추가
        answer += arr[i];
    //for문 끝        
    }
    
    return answer;
}

 

7. 수열과 구간 쿼리 1

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

 query마다 순서대로 s  i  e인 모든 i에 대해 arr[i]에 1을 더합니다.

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

function solution(arr, queries) {
    var answer = [];
    
    //queries의 크기 만큼 for문 돌기
    for(let i=0; i<queries.length; i++){
        //queries[i][0]부터 queries[i][1]까지 for문 돌기
        for(let j=queries[i][0]; j<=queries[i][1]; j++){
            //arr[j]++
            arr[j]++;
        //for문 끝            
        }
    //for문 끝        
    }
    
    answer = [...arr];
    
    return answer;
}

 

 

 

SQL

1. 헤비 유저가 소유한 장소

SELECT
    A.ID
    ,A.NAME
    ,A.HOST_ID
FROM PLACES A
LEFT JOIN PLACES B ON A.HOST_ID = B.HOST_ID
GROUP BY A.ID
HAVING COUNT(A.ID) >= 2
ORDER BY ID;

 

 

2. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

SELECT
    CONCAT('/home/grep/src/',F.BOARD_ID,'/',F.FILE_ID,F.FILE_NAME,F.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD B
LEFT JOIN USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID
WHERE 1=1
AND B.VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
ORDER BY F.FILE_ID DESC;

 

3. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(문제 잘못 이해해서 오래걸림ㅠㅠ)

    - 해당 기간 안에 대여 횟수가 5회 이상인 월별 대여 횟수!

WITH SUB AS(
    SELECT
        CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    WHERE 1=1
    AND TO_CHAR(START_DATE,'YYYY-MM') BETWEEN '2022-08' AND '2022-10'
    GROUP BY CAR_ID
    HAVING COUNT(CAR_ID) >= 5
    )

SELECT
    EXTRACT(MONTH FROM START_DATE) AS MONTH
    ,CAR_ID
    ,COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE 1=1
AND CAR_ID IN (SELECT CAR_ID FROM SUB)
AND TO_CHAR(START_DATE,'YYYY-MM') BETWEEN '2022-08' AND '2022-10'
GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID
HAVING COUNT(CAR_ID) >= 0
ORDER BY MONTH ASC, CAR_ID DESC;