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

코딩테스트 연습 - 9일차

by 코도꼬마 2023. 11. 15.
  JAVA SCRIPT SQL
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)

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 두 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 나머지 한 변이 될 수 있는 정수의 개수를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int[] sides) {
        int answer = 0;
        
        //배열에서 가장 큰 값을 가져오기
        int max = Math.max(sides[0],sides[1]);
        
        //배열에서 가장 작은 값을 가져오기
        int min = Math.min(sides[0],sides[1]);
        
        //(큰값 - 작은값)+1부터 큰값 까지 for문 돌기
        for(int i=max-min+1; i<=max; i++){
            //answer++
            answer++;
        }
        
        //배열의 값의 합을 가져오기
        int sum = sides[0]+sides[1];
        //큰 값+1부터 배열의 합 - 1 값 까지 for문 돌기
        for(int i=max+1; i<sum; i++){
            //answer++
            answer++;            
        }
        
        return answer;
    }
}

 

2. 외계어 사전

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(String[] spell, String[] dic) {
        int answer = 2;
        //일치 여부 확인 변수 선언
        int cnt = 0;
        
        //dic의 크기만큼 for문 돌기
        for(int i=0; i<dic.length; i++){
            //spell의 크기만큼 for문 돌기
            for(int j=0; j<spell.length; j++){
                //dic의 배열 값에 spell[j]의 값이 포함될 경우
                if(dic[i].contains(spell[j])){
                    //cnt++
                    cnt++;
                }
            //for문 끝                
            }
            //cnt와 spell배열의 크기가 일치할 경우 
            if(cnt == spell.length){
                //answer = 1
                answer = 1;
            }
            //cnt 초기화
            cnt = 0;
        //for문 끝            
        }
        
        return answer;
    }
}

 

3. 영어가 싫어요

영어가 싫은 머쓱이는 영어로 표기되어있는 숫자를 수로 바꾸려고 합니다. 문자열 numbers가 매개변수로 주어질 때, numbers를 정수로 바꿔 return 하도록 solution 함수를 완성해 주세요.

class Solution {
    public long solution(String numbers) {
        long answer = 0;
       
		numbers = numbers.replaceAll("zero", "0");
		numbers = numbers.replaceAll("one", "1");
		numbers = numbers.replaceAll("two", "2");
		numbers = numbers.replaceAll("three", "3");
		numbers = numbers.replaceAll("four", "4");
		numbers = numbers.replaceAll("five", "5");
		numbers = numbers.replaceAll("six", "6");
		numbers = numbers.replaceAll("seven", "7");
		numbers = numbers.replaceAll("eight", "8");
		numbers = numbers.replaceAll("nine", "9");
		
		answer = Long.parseLong(numbers);
		
        return answer;
    }
}

 

4. 종이 자르기

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.

정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int M, int N) {
        int answer = 0;
        
        answer = (M-1)+M*(N-1);
        
        return answer;
    }
}

 

5. 캐릭터의 좌표

머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.
class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int[] answer = {0,0};
        
        //keyinput 배열의 크기만큼 for문 돌기
        for(int i=0; i<keyinput.length; i++){
            //배열의 값을 하나씩 가져와서  
            //answer[1]이 board[1]/2보다 작고 up이면
            if(answer[1] < board[1]/2 && "up".equals(keyinput[i])){
                //answer[1] += 1
                answer[1] += 1;
            }
            
            //answer[1]이 -board[1]/2보다 크고 down이면
            if(answer[1] > -board[1]/2 && "down".equals(keyinput[i])){
                //answer[1] -= 1
                answer[1] -= 1;
            }
        
            //answer[0]이 -board[0]/2보다 크고 left이면
            if(answer[0] > -board[0]/2 && "left".equals(keyinput[i])){
                //answer[0] -= 1
                answer[0] -= 1;
            }
            //answer[0]이 board[0]/2보다 작고 right이면
            if(answer[0] < board[0]/2 && "right".equals(keyinput[i])){
                //answer[0] += 1
                answer[0] += 1;
            }
        //for문 끝            
        }
        
        
        return answer;
    }
}

 

 

 

 

SCRIPT

1. 등차수열의 특정한 항만 더하기

두 정수 a, d와 길이가 n인 boolean 배열 included가 주어집니다. 첫째항이 a, 공차가 d인 등차수열에서 included[i]가 i + 1항을 의미할 때, 이 등차수열의 1항부터 n항까지 included가 true인 항들만 더한 값을 return 하는 solution 함수를 작성해 주세요.

function solution(a, d, included) {
    var answer = 0;
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<included.length; i++){
        //배열의 값을 가져와서 true이면 
        if(included[i]){
            //answer += a+(d*i);
            answer += a+(d*i);
        }
    //for문 끝        
    }
    
    return answer;
}

 

2. 이차원 배열 대각선 순회하기

2차원 정수 배열 board와 정수 k가 주어집니다.

i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.

function solution(board, k) {
    var answer = 0;
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<board.length; i++){
        //배열 안의 배열의 크기만큼 for문 돌기
        for(let j=0; j<board[i].length; j++){
            //i+j가 k보다 작거나 같으면
            if(i+j <= k){
                //answer에 더하기
                answer += board[i][j];
            }
        //for문 끝
        }
    //for문 끝        
    }
    
    return answer;
}

 

3. 글자 지우기

문자열 my_string과 정수 배열 indices가 주어질 때, my_string에서 indices의 원소에 해당하는 인덱스의 글자를 지우고 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, indices) {
    var answer = '';
    
    //my_string을 배열로 변환
    let arr = my_string.split("");
    
    //my_string 배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //indices에 해당되는 값인지 확인할 변수 선언
        let chk = true;
        //indices 배열의 크기만큼 for문 돌기        
        for(let j=0; j<indices.length; j++){
            //배열의 값 중 i값이 있을 경우 false로 변경
            if(i == indices[j]){
                chk = false;
            }
        }
        //for문 끝
        //확인 값이 true일 경우 해당 값을 answer에 담기
        if(chk == true){
            answer += arr[i];            
        }
    //for문 끝        
    }
    
    return answer;
}

 

4. 날짜 비교하기

    - 무작정 배열을 더해서 비교했더니 월, 일이 한자리 수일 경우 앞선 날짜여도 더 큰 수가 나올 수 있어 틀렸음

정수 배열 date1과 date2가 주어집니다. 두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다. 각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.

만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.

function solution(date1, date2) {
    var answer = 0;
    
    //date1[0] <= date2[0]이고
    if(date1[0] <= date2[0]){
        //date1[1] < date2[1]이면
        if(date1[1] < date2[1]){
            //1
            answer = 1;            
        }
        //date1[1] == date2[1]이고 
        else if(date1[1] == date2[1]){
            //date1[2] < date2[2]이면
            if(date1[2] < date2[2]){
            //1
                answer = 1;   
            }                        
        }
    }
    
    return answer;
}

 

 

 

SQL

1. 보호소에서 중성화한 동물

SELECT
    O.ANIMAL_ID
    ,O.ANIMAL_TYPE
    ,O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE 1=1
AND I.SEX_UPON_INTAKE LIKE 'Intact%'
AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%' OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY O.ANIMAL_ID;

 

2. 식품분류별 가장 비싼 식품의 정보 조회하기

SELECT
    CATEGORY,
    PRICE AS MAX_PRICE,
    PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE 1=1
AND CATEGORY IN ('과자', '국', '김치', '식용유')
AND PRICE = (
        SELECT MAX(PRICE)
        FROM FOOD_PRODUCT F
        WHERE F.CATEGORY = FOOD_PRODUCT.CATEGORY
    )
ORDER BY PRICE DESC;

 

3. 5월 식품들의 총매출 조회하기

SELECT
    P.PRODUCT_ID
    ,P.PRODUCT_NAME
    ,SUM(P.PRICE*O.AMOUNT) AS TOTAL_SALES
FROM FOOD_ORDER O
LEFT JOIN FOOD_PRODUCT P ON O.PRODUCT_ID = P.PRODUCT_ID
WHERE 1=1
AND TO_CHAR(PRODUCE_DATE,'YYYY-MM') = '2022-05'
GROUP BY P.PRODUCT_ID, P.PRODUCT_NAME
ORDER BY 3 DESC, 1 ASC;

 

4. 취소되지 않은 진료 예약 조회하기

SELECT
    A.APNT_NO
    ,P.PT_NAME
    ,P.PT_NO
    ,A.MCDP_CD
    ,D.DR_NAME
    ,A.APNT_YMD
FROM APPOINTMENT A
LEFT JOIN PATIENT P ON A.PT_NO = P.PT_NO
LEFT JOIN DOCTOR D ON A.MDDR_ID = D.DR_ID
WHERE 1=1 
AND TO_CHAR(A.APNT_YMD,'YYYY-MM-DD') = '2022-04-13'
AND A.APNT_CNCL_YN = 'N'
ORDER BY APNT_YMD ASC;