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

코딩테스트 연습 - 3일차

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

 

JAVA 

1. 문자 반복 출력하기

문자열 my_string과 정수 n이 매개변수로 주어질 때, my_string에 들어있는 각 문자를 n만큼 반복한 문자열을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public String solution(String my_string, int n) {
        String answer = "";
        
        //문자열을 배열로 변환
        String[] arr = my_string.split("");
        //배열의 크기만큼 for문 돌리기
        for(int i=0; i<arr.length; i++){
            //answer에 n만큼 문자열 반복해서 저장
            answer += arr[i].repeat(n);
        //for문 끝            
        }
        
        return answer;
    }
}

 

2. 배열 두배 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        
        //배열의 크기만큼 for문 돌리기
        for(int i=0; i< numbers.length; i++){
            //배열의 값을 2배 곱해 answer 배열에 넣기
            answer[i] = numbers[i]*2;
        //for문 끝            
        }
        
        return answer;
    }
}

 

3. 특정 문자 제거하기

문자열 my_string과 문자 letter이 매개변수로 주어집니다. my_string에서 letter를 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String my_string, String letter) {
        String answer = "";
        
        answer = my_string.replaceAll(letter,"");
        
        return answer;
    }
}

 

4. 피자 나눠 먹기 (3)

머쓱이네 피자가게는 피자를 두 조각에서 열 조각까지 원하는 조각 수로 잘라줍니다. 피자 조각 수 slice와 피자를 먹는 사람의 수 n이 매개변수로 주어질 때, n명의 사람이 최소 한 조각 이상 피자를 먹으려면 최소 몇 판의 피자를 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int slice, int n) {
        int answer = 0;
        
        answer = n/slice + (n%slice == 0 ? 0 : 1);
        
        return answer;
    }
}

 

5. 모음 제거

영어에선 a, e, i, o, u 다섯 가지 알파벳을 모음으로 분류합니다. 문자열 my_string이 매개변수로 주어질 때 모음을 제거한 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        answer = my_string.replaceAll("[aeiou]","");
        
        return answer;
    }
}

 

6. 세균 증식

어떤 세균은 1시간에 두배만큼 증식한다고 합니다. 처음 세균의 마리수 n과 경과한 시간 t가 매개변수로 주어질 때 t시간 후 세균의 수를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int n, int t) {
        int answer = 0;
        
        answer = (int)(n * Math.pow(2,t));
        
        return answer;
    }
}

 

7. 숨어있는 숫자의 덧셈 (1)

문자열 my_string이 매개변수로 주어집니다. my_string안의 모든 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(String my_string) {
        int answer = 0;
        
        //문자열에서 문자 제거
        my_string = my_string.replaceAll("[^0-9]","");
        //숫자만 남은 문자열 배열로 변환
        String[] arr = my_string.split("");
        //배열의 크기만큼 for문 돌리기
        for(int i=0; i<arr.length; i++){
            //answer에 배열의 값 더하기
            answer += Integer.parseInt(arr[i]);
        //for문 끝            
        }
        
        return answer;
    }
}

 

8. 개미 군단

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int hp) {
        int answer = 0;
        
        answer += hp/5 + ((hp%5)/3) + (hp%5%3);
        
        
        return answer;
    }
}

 

9. 암호 해독

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

  • 암호화된 문자열 cipher를 주고받습니다.
  • 그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.

문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String cipher, int code) {
        String answer = "";
        
        //문자열의 길이만큼 for문 돌리기
        for(int i=0; i<cipher.length(); i++){
            //i+1을 code로 나누었을 때 나머지가 0이면 
            if((i+1)%code == 0){
                //answer에 해당 값 저장
                answer += cipher.charAt(i);
            }
        }
        
        return answer;
    }
}

 

10. 가위 바위 보

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

class Solution {
    public String solution(String rsp) {
        String answer = "";
        
        //rsp 배열로 변환
        String[] arr = rsp.split("");
        //배열의 크기만큼 for문 돌림
        for(int i=0; i<arr.length; i++){
            //배열의 값이 2일 때
            if("2".equals(arr[i])){
                //answer += 0
                answer += 0;
            //배열의 값이 0일 때
            }else if("0".equals(arr[i])){            
                //answer += 5
                answer += 5;
            //배열의 값이 5일 때
            }else if("5".equals(arr[i])){  
                //answer += 2
                answer += 2;
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

11. 최댓값 만들기 (2)

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

import java.util.Arrays;

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        
        //배열 정렬
        Arrays.sort(numbers);
        //index 0 * index1의 값 가져오기
        int sum1 = numbers[0]*numbers[1];
        //index-1 * index-2의 값 가져오기
        int sum2 = numbers[numbers.length-1]*numbers[numbers.length-2];
        
        //두 값을 비교해서 큰 값을 answer에 저장
        answer = Math.max(sum1, sum2);
        
        return answer;
    }
}

 

 

 

SCRIPT 

1. 홀짝에 따라 다른 값 반환하기

양의 정수 n이 매개변수로 주어질 때, n이 홀수라면 n 이하의 홀수인 모든 양의 정수의 합을 return 하고 n이 짝수라면 n 이하의 짝수인 모든 양의 정수의 제곱의 합을 return 하는 solution 함수를 작성해 주세요.

function solution(n) {
    var answer = 0;
    
    //n이 홀수이면
    if(n%2 != 0){
        //n이 0보다 클 경우 while문 돌리기
        while(n>0){
            //answer에 n의 값 더하기
            answer += n;
            //n-2
            n -= 2;
        }
        
    }
    //n이 짝수이면
    if(n%2 == 0){
        //n이 0보다 클 경우 while문 돌리기돌리기
        while(n>0){
            //answer에 n의 제곱의 값 더하기
            answer += n*n;
            //n-2
            n -= 2;
        }
    }   
    
    return answer;
}

 

2. 문자열 붙여서 출력하기

두 개의 문자열 str1, str2가 공백으로 구분되어 입력으로 주어집니다.
입출력 예와 같이 str1 str2을 이어서 출력하는 코드를 작성해 보세요.

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 () {
    str1 = input[0];
    str2 = input[1];
    
    console.log(str1+str2)
});

 

3. 배열 만들기 1

정수 n k가 주어졌을 때, 1 이상 n이하의 정수 중에서 k의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

function solution(n, k) {
    var answer = [];
    
    //n만큼 for문 돌리기
    for(let i=1; i<=n; i++){
        //k로 나눴을때 나머지가 0이면
        if(i%k == 0){
            //answer에 저장
            answer.push(i);
        }
    //for문 끝        
    }
    
    return answer;
}

 

4. A 강조하기

문자열 myString이 주어집니다. myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환하여 return 하는 solution 함수를 완성하세요.

function solution(myString) {
    var answer = '';
    
    //myString을 소문자로 변환
    myString = myString.toLowerCase();
    //myString을 배열로 변환
    let arr = myString.split('');
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 값이 "a"이면 
        if(arr[i] === 'a'){
            //대문자로 변경
            answer += arr[i].toUpperCase();
        //아니면             
        }else {
            //바로 저장
            answer += arr[i];
        }
    //for문 끝        
    }
    
    return answer;
}

 

5. 접두사인지 확인하기

어떤 문자열에 대해서 접두사는 특정 인덱스까지의 문자열을 의미합니다. 예를 들어, "banana"의 모든 접두사는 "b", "ba", "ban", "bana", "banan", "banana"입니다.
문자열 my_string is_prefix가 주어질 때, is_prefix my_string의 접두사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, is_prefix) {
    var answer = 0;
    
    if (my_string.startsWith(is_prefix)) {
        answer = 1;
    } else {
        answer = 0;
    }
    
    return answer;
}

 

6. n보다 커질 때까지 더하기

정수 배열 numbers와 정수 n이 매개변수로 주어집니다. numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.

function solution(numbers, n) {
    var answer = 0;
    
    //numbers의 크기만큼 for문 돌기
    for(let i=0; i<numbers.length; i++){
        //answer의 값이 n보다 크면 
        if(answer > n){
            //return answer;
            return answer;
        //아니면
        }else {
            //answer에 배열의 값 더하기
            answer += numbers[i];
        }
    //for문 끝!        
    }
    
    return answer;
}

 

7. n개 간격의 원소들

정수 리스트 num_list와 정수 n이 주어질 때, num_list의 첫 번째 원소부터 마지막 원소까지 n개 간격으로 저장되어있는 원소들을 차례로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(num_list, n) {
    var answer = [];
    
    //num_list의 크기만큼 n간격으로 for문 돌리기
    for(let i=0; i<num_list.length; i+=n){
        //배열의 값을 answer에 담기
        answer.push(num_list[i]);
    //for문 끝        
    }
    
    return answer;
}

 

8. 할 일 목록

오늘 해야 할 일이 담긴 문자열 배열 todo_list와 각각의 일을 지금 마쳤는지를 나타내는 boolean 배열 finished가 매개변수로 주어질 때, todo_list에서 아직 마치지 못한 일들을 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(todo_list, finished) {
    var answer = [];
    
    //배열의 크기만큼 for문 돌리기
    for(let i=0; i<todo_list.length; i++){
        //finished의 값을 가져와 false일 경우
        if(!finished[i]){
            //todo_list의 값을 answer에 저장
            answer.push(todo_list[i])
        }
    //for문 끝        
    }
    
    return answer;
}

 

9. 수 조작하기 1

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w" : n이 1 커집니다.
  • "s" : n이 1 작아집니다.
  • "d" : n이 10 커집니다.
  • "a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

function solution(n, control) {
    var answer = n;
    
    //control을 배열로 변환
    let arr = control.split("");
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 값이 w면
        if(arr[i] === "w"){
            //n+1
            answer += 1;
        }
        //배열의 값이 s면
         if(arr[i] === "s"){
            //n-1
            answer -= 1;
        }
        //배열의 값이 d면
         if(arr[i] === "d"){
            //n+10
            answer += 10;
        }
        //배열의 값이 a면
         if(arr[i] === "a"){
            //n-10
            answer -= 10;
        }
    //for문 끝        
    }
    
    
    return answer;
}

 

10. 원하는 문자열 찾기

알파벳으로 이루어진 문자열 myString과 pat이 주어집니다. myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.

단, 알파벳 대문자와 소문자는 구분하지 않습니다.

function solution(myString, pat) {
    var answer = 0;
    
    myString = myString.toLowerCase();
    pat = pat.toLowerCase();
    
    if(myString.indexOf(pat) == -1){
        answer = 0;
    }else {
        answer = 1;
    }
    
    return answer;
}

 

 

 

 

SQL

1. 특정 옵션이 포함된 자동차 리스트 구하기

CAR_RENTAL_COMPANY_CAR 테이블에서 '네비게이션' 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    CAR_ID
    ,CAR_TYPE
    ,DAILY_FEE
    ,OPTIONS
FROM CAR_RENTAL_COMPANY_CAR 
WHERE 1=1
AND OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;

 

2. 조건에 부합하는 중고거래 댓글 조회하기

USED_GOODS_BOARD USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    B.TITLE
    ,B.BOARD_ID
    ,R.REPLY_ID
    ,R.WRITER_ID
    ,R.CONTENTS
    ,TO_CHAR(R.CREATED_DATE,'YYYY-MM-DD')
FROM USED_GOODS_BOARD B
RIGHT JOIN USED_GOODS_REPLY R ON B.BOARD_ID = R.BOARD_ID
WHERE 1=1
AND TO_CHAR(B.CREATED_DATE, 'YYYY-MM') = '2022-10'
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC;

 

3. 조건에 부합하는 중고거래 상태 조회하기

USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    BOARD_ID
    ,WRITER_ID
    ,TITLE
    ,PRICE
    ,CASE
        WHEN STATUS = 'SALE' THEN '판매중' 
        WHEN STATUS = 'RESERVED' THEN '예약중'  
        WHEN STATUS = 'DONE' THEN '거래완료'    
     END
FROM USED_GOODS_BOARD 
WHERE 1=1
AND TO_CHAR(CREATED_DATE,'YYYY-MM-DD') = '2022-10-05'
ORDER BY BOARD_ID DESC;

 

4. 자동차 평균 대여 기간 구하기

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    CAR_ID,
    ROUND(AVG((END_DATE) - (START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG((END_DATE) - (START_DATE)+1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;

 

5. 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기

CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    CAR_TYPE
    ,COUNT(CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR 
WHERE 1=1
AND OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;

 

6. 조건에 맞는 도서와 저자 리스트 출력하기

'경제' 카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    B.BOOK_ID
    ,A.AUTHOR_NAME
    ,TO_CHAR(B.PUBLISHED_DATE,'YYYY-MM-DD')
FROM BOOK B
LEFT JOIN AUTHOR A ON B.AUTHOR_ID = A.AUTHOR_ID
WHERE 1=1
AND CATEGORY = '경제'
ORDER BY PUBLISHED_DATE ASC;

 

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

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

-- 코드를 입력하세요
SELECT
    I.INGREDIENT_TYPE,
    SUM(F.TOTAL_ORDER) AS TOTAL_ORDER
FROM ICECREAM_INFO I
LEFT JOIN FIRST_HALF F ON I.FLAVOR = F.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;

 

8. 진료과별 총 예약 횟수 출력하기

APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요. 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    MCDP_CD AS "진료과코드"
    ,COUNT(APNT_NO) AS "5월예약건수"
FROM APPOINTMENT 
WHERE 1=1
AND TO_CHAR(APNT_YMD,'YYYY-MM') = '2022-05'
GROUP BY MCDP_CD
ORDER BY COUNT(APNT_NO) ASC, MCDP_CD ASC;