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

코딩테스트 연습 - 2일차

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

 

JAVA 

1. 머쓱이보다 키 큰 사람

머쓱이는 학교에서 키 순으로 줄을 설 때 몇 번째로 서야 하는지 궁금해졌습니다. 머쓱이네 반 친구들의 키가 담긴 정수 배열 array와 머쓱이의 키 height가 매개변수로 주어질 때, 머쓱이보다 키 큰 사람 수를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int[] array, int height) {
        int answer = 0;
                
        //배열의 크기만큼 for문 돌리기
        for(int i=0; i<array.length; i++){
            //배열의 값을 하나씩 가져와 height보다 더 클 경우
            if(array[i] > height){
                //answer up
                answer++;
            }
        //for문 끝            
        }  
        
        return answer;
    }
}

 

2. 아이스 아메리카노

머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int[] solution(int money) {
        int[] answer;
        
        //구입할 수 있는 커피 수
        int coffee = 0;
        
        //money가 5,500이하일 때 까지 while문 돌리기
        while(money >= 5500){
            //coffee++
            coffee++;
            //커피값 차감
            money -= 5500;
        //while문 종료            
        }
        
        //coffee 값, money 값 배열에 담기
        answer = new int[]{coffee, money};
        
        return answer;
    }
}

 

3. 중복된 숫자 개수

정수가 담긴 배열 array와 정수 n이 매개변수로 주어질 때, array에 n이 몇 개 있는 지를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int[] array, int n) {
        int answer = 0;
        
        //배열의 크기만큼 for문 돌리기
        for(int i=0; i<array.length; i++){
            //배열의 값을 하나씩 가져와 n과 일치하는지 확인
            if(array[i] == n){
                //일치할 경우 answer++
                answer++;
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

4. 삼각형의 완성조건 (1)

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.
가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.
삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.

import java.util.*;
class Solution {
    public int solution(int[] sides) {
        int answer = 0;
        
        //배열 정렬
        Arrays.sort(sides);
        
        //작은 값 두개의 합이 가장 큰 값보다 클 경우
        if(sides[0]+sides[1] > sides[2]) {
            //1
        	answer = 1;
        }else { //2
        	answer = 2;
        }
        
        return answer;
    }
}

 

5. 자릿수 더하기

정수 n이 매개변수로 주어질 때 n의 각 자리 숫자의 합을 return하도록 solution 함수를 완성해주세요

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        //n이 0보다 작아질때 까지 while문 돌리기
        while(n>0){
            //n을 10으로 나눈 나머지를 answer에 더하기
            answer += n%10;
            //n을 10으로 나누기
            n = n/10;
        //while문 끝            
        }
        
        return answer;
    }
}

 

6. 배열의 유사도

두 배열이 얼마나 유사한지 확인해보려고 합니다. 문자열 배열 s1과 s2가 주어질 때 같은 원소의 개수를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(String[] s1, String[] s2) {
        int answer = 0;
        
        //s1의 크기만큼 for문 돌리기
        for(int i=0; i<s1.length; i++){
            //s2의 크기만큼 for문 돌리기
            for(int j=0; j<s2.length; j++){
                //s1[i]의 값을 가져와 s2의 배열과 하나씩 비교
                if(s1[i].equals(s2[j])){
                    //같은 값이 있을 경우 answer++
                    answer++;
                }
            //for문 끝
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

7. 배열 자르기

정수 배열 numbers와 정수 num1, num2가 매개변수로 주어질 때, numbers의 num1번 째 인덱스부터 num2번째 인덱스까지 자른 정수 배열을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int[] solution(int[] numbers, int num1, int num2) {
        int[] answer = new int[num2-num1+1];
        
        //index를 저장할 변수 선언
        int index = 0;
        
        //num1부터 num2까지 for문 돌리기
        for(int i=num1; i<=num2; i++){
            //배열의 값을 하나씩 가져와 answer 배열에 넣기
            answer[index] = numbers[i];
            //index++
            index++;
        //for문 끝            
        }
        
        
        
        return answer;
    }
}

 

8. 문자열안에 문자열

문자열 str1, str2가 매개변수로 주어집니다. str1 안에 str2가 있다면 1을 없다면 2를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(String str1, String str2) {
        int answer = 0;
        
        if(str1.contains(str2)){
            answer = 1;
        }else {
            answer = 2;
        }
        
        return answer;
    }
}

9. 옷가게 할인 받기

머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int price) {
        int answer = 0;
        
        answer = (int)(price >= 500000 ? price*0.8 : price >= 300000 ? price*0.9 : price >= 100000 ? price*0.95 : price);
        
        return answer;
    }
}

 

10. 제곱수 판별하기

어떤 자연수를 제곱했을 때 나오는 정수를 제곱수라고 합니다. 정수 n이 매개변수로 주어질 때, n이 제곱수라면 1을 아니라면 2를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        //sqrt(n) : 제곱근 반환
        if(n%Math.sqrt(n) == 0){
            answer = 1;
        }else {
            answer = 2;
        }
        
        return answer;
    }
}

 

 

 

SCRIPT

1. 부분 문자열인지 확인하기

문자열 my_string과 target이 매개변수로 주어질 때, target이 문자열 my_string의 부분 문자열이라면 1을, 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, target) {
    var answer = 0;
    
    if(my_string.indexOf(target) > -1){
        answer = 1;
    }
    
    return answer;
}

 

2. 배열 비교하기

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.
두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.
두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.

function solution(arr1, arr2) {
    var answer = 0;
    
    //배열의 크기 비교
    //arr1의 크기가 더 크면 
    if(arr1.length > arr2.length){
        //1
        answer = 1;
    //arr2의 크기가 더 크면 
    }else if(arr1.length < arr2.length){
        //-1
        answer = -1;
    //둘다 아니면
    }else{
        //arr1,arr2 배열의 합 구하기
        //각각의 합을 담을 변수 2개 선언
        let arr1Sum = 0;
        let arr2Sum = 0;
        //배열의 크기만큼 for문 돌리기
        for(i=0; i<arr1.length; i++){
            //배열의 값 더하기
            arr1Sum += arr1[i];
            arr2Sum += arr2[i];            
        //for문 끝            
        }
        //배열의 합 비교해서 arr1이 더 크면
        if(arr1Sum > arr2Sum){
            //1
            answer = 1;
        //arr2의 크기가 더 크면 
        }else if(arr1Sum < arr2Sum){
            //-1
            answer = -1;
        //둘 다 아니면
        }else {
            //0    
            answer = 0;
        }    
    }    
    
    return answer;
}

 

3. 공백으로 구분하기 1

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string) {
    var answer = my_string.split(" ");
    return answer;
}

 

4. 뒤에서 5등 위로

정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = [num_list.length-5];
    
    //index 값을 담을 변수 선언
    let index = 0;
    
    //배열 정렬(오름차순 정렬 방법)(그냥 sort로 하면 문자열 취급)
    num_list.sort(function(a,b){
        return a-b;
    })
    
    //5부터 배열의 길이까지 for문 돌리기
    for(var i=5; i<num_list.length; i++){
        //answer에 담기
        answer[index] = num_list[i];
        //index++
        index++;
    //for문 끝        
    }
    
    return answer;
}

 

5. 이어 붙인 수

정수가 담긴 리스트 num_list가 주어집니다. num_list의 홀수만 순서대로 이어 붙인 수와 짝수만 순서대로 이어 붙인 수의 합을 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = 0;
    
    //홀수, 짝수 값을 담을 변수 선언
    let odd = 0;
    let even = 0;
    
    //배열의 크기 만큼 for문 돌리기
    for(let i=0; i<num_list.length; i++){
        //배열의 값을 가져와 2로 나누었을 때 나머지가 0이면
        if(num_list[i]%2 == 0){
            //짝수값에 10 곱하기
            even *= 10;
            //짝수값에 더하기
            even += num_list[i];
        //0이 아니면                     
        }else {
            //홀수값에 10 곱하기               
            odd *= 10;
            //홀수값에 더하기
            odd += num_list[i];            
        }
    //for문 끝        
    }
    
    //홀수갑 + 짝수값
    answer = odd+even;
    
    return answer;
}

 

7. 특정한 문자를 대문자로 바꾸기

영소문자로 이루어진 문자열 my_string과 영소문자 1글자로 이루어진 문자열 alp가 매개변수로 주어질 때, my_string에서 alp에 해당하는 모든 글자를 대문자로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, alp) {
    var answer = '';
    
    //문자열을 배열로 변경
    let arr = my_string.split("");
    
    //배열의 크기만큼 for문 돌리기
    for(let i=0; i<arr.length; i++){
        //배열의 값을 가져와 alp와 동일하면
        if(arr[i] === alp){
            //대문자로 변경하여 저장
            arr[i] = arr[i].toUpperCase();
        }
    //for문 끝        
    }
    
    answer = arr.join('');
    
    return answer;
}

 

8. 마지막 두 원소

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    
    //배열복사 - 얉은 복사 : var newArr = [...arr]을 통해서 arr배열 복사
    
    //마지막 원소가 이전 원소값 보다 클 경우
    if(num_list[num_list.length-1] > num_list[num_list.length-2]){
        //마지막 원소 - 이전 원소값 마지막 인덱스에 추가
        var answer = [...num_list,(num_list[num_list.length-1]-num_list[num_list.length-2])];
    //아닐 경우         
    }else {        
        //마지막 원소값 두배하여 마지막 인덱스에 추가
        var answer = [...num_list,(num_list[num_list.length-1]*2)];
    }
    
    return answer;
}

 

 

 

SQL

TABLE1

다음은 종합병원에 등록된 환자정보를 담은 PATIENT 테이블입니다. PATIENT 테이블은 다음과 같으며 PT_NO, PT_NAME, GEND_CD, AGE, TLNO는 각각 환자번호, 환자이름, 성별코드, 나이, 전화번호를 의미합니다.

 

1. PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    PT_NAME
    ,PT_NO
    ,GEND_CD
    ,AGE
    ,NVL(TLNO, 'NONE') AS TLNO
FROM PATIENT 
WHERE 1=1
AND GEND_CD = 'W'
AND AGE <= 12
ORDER BY AGE DESC, PT_NAME ASC;

 

 

TABLE2 

다음은 종합병원에 속한 의사 정보를 담은DOCTOR 테이블입니다. DOCTOR 테이블은 다음과 같으며 DR_NAME, DR_ID, LCNS_NO, HIRE_YMD, MCDP_CD, TLNO는 각각 의사이름, 의사ID, 면허번호, 고용일자, 진료과코드, 전화번호를 나타냅니다.

 

2. DOCTOR 테이블에서 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사의 이름, 의사ID, 진료과, 고용일자를 조회하는 SQL문을 작성해주세요. 이때 결과는 고용일자를 기준으로 내림차순 정렬하고, 고용일자가 같다면 이름을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    DR_NAME
    ,DR_ID
    ,MCDP_CD
    ,TO_CHAR(HIRE_YMD, 'YYYY-MM-DD')
FROM DOCTOR 
WHERE 1=1
AND MCDP_CD IN ('CS','GS')
ORDER BY HIRE_YMD DESC, DR_NAME ASC;

 

TABLE3

FIRST_HALF 테이블은 아이스크림 가게의 상반기 주문 정보를 담은 테이블입니다.FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다.

 

3. 인기있는 아이스크림

상반기에 판매된 아이스크림의 맛을 총주문량을 기준으로 내림차순 정렬하고 총주문량이 같다면 출하 번호를 기준으로 오름차순 정렬하여 조회하는 SQL 문을 작성해주세요.

SELECT
    FLAVOR
FROM FIRST_HALF 
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;

TABLE3-2

ICECREAM_INFO 테이블 구조는 다음과 같으며, FLAVOR, INGREDITENT_TYPE 은 각각 아이스크림 맛, 아이스크림의 성분 타입을 나타냅니다. INGREDIENT_TYPE에는 아이스크림의 주 성분이 설탕이면 sugar_based라고 입력되고, 아이스크림의 주 성분이 과일이면 fruit_based라고 입력됩니다. ICECREAM_INFO의 기본 키는 FLAVOR입니다. ICECREAM_INFO테이블의 FLAVOR FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.

 

4. 과일로 만든 아이스크림 고르기

상반기 아이스크림 총주문량이 3,000보다 높으면서 아이스크림의 주 성분이 과일인 아이스크림의 맛을 총주문량이 큰 순서대로 조회하는 SQL 문을 작성해주세요.

SELECT
    F.FLAVOR
FROM FIRST_HALF F
LEFT JOIN ICECREAM_INFO I ON F.FLAVOR = I.FLAVOR
WHERE 1=1
AND F.TOTAL_ORDER > 3000
AND I.INGREDIENT_TYPE = 'fruit_based'
ORDER BY F.TOTAL_ORDER DESC;

 

 

 

TABLE4

 

5. 조건에 맞는 도서 리스트 출력하기

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    BOOK_ID
    ,TO_CHAR(PUBLISHED_DATE,'YYYY-MM-DD') AS PUBLISHED_DATE
FROM BOOK 
WHERE 1=1
AND TO_CHAR(PUBLISHED_DATE,'YYYY') = '2021'
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE ASC;

 

 

 

TABLE5

6. 평균 일일 대여 요금 구하기

CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.

-- 코드를 입력하세요
SELECT
    ROUND(AVG(DAILY_FEE), 0) AS AVERAGE_FEE 
FROM CAR_RENTAL_COMPANY_CAR 
WHERE 1=1
AND CAR_TYPE = 'SUV';

 

 

7. 자동차 대여 기록에서 장기/단기 대여 구분하기

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    HISTORY_ID
    ,CAR_ID
    ,TO_CHAR(START_DATE,'YYYY-MM-DD') AS START_DATE
    ,TO_CHAR(END_DATE,'YYYY-MM-DD') AS END_DATE
    ,CASE
        WHEN to_number(to_char(end_date-start_date+1)) >= 30 then '장기 대여'
        ELSE '단기 대여'
    END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE 1=1
AND TO_CHAR(START_DATE,'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;