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

코딩테스트 연습 - 10일차

by 코도꼬마 2023. 11. 16.
  JAVA SCRIPT SQL
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. 문자열 섞기

길이가 같은 두 문자열 str1과 str2가 주어집니다.

두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.

class Solution {
    public String solution(String str1, String str2) {
        String answer = "";
        
        //str1과 str2를 배열로 변환
        String[] arr1 = str1.split("");
        String[] arr2 = str2.split("");
        
        //배열의 크기만큼 for문 돌기
        for(int i=0; i<arr1.length; i++){
            //각 배열의 i값들을 가져와 answer에 추가
            answer += arr1[i];
            answer += arr2[i];
        //for문 끝
        }
        
        return answer;
    }
}
class Solution {
    public String solution(String str1, String str2) {
        String answer = "";
        
        //str1의 길이만큼 for문 돌기
        for(int i=0; i<str1.length(); i++){
            //각 문자열의 i값들을 가져와 answer에 추가
            answer += str1.charAt(i);
            answer += str2.charAt(i);
        //for문 끝
        }
        
        return answer;
    }
}

 

2. 빈 배열에 추가, 삭제하기

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

import java.util.*;

class Solution {
    public int[] solution(int[] arr, boolean[] flag) {

        //stack 준비
        Stack<Integer> stack = new Stack<Integer>();

        //flag의 크기만큼 for문 돌기
		for(int i=0; i<flag.length; i++) {
            //flag의 값이 true이면
			if(flag[i]) {
                //arr[i]*2만큼 for문 돌기
				for(int j=0; j<arr[i]*2; j++) {
                    //stack에 arr[i]값 추가
					stack.push(arr[i]);					
				}
			}
            //false이면 
            else {
                //arr[i]만큼 for문 돌기
				for(int k=0; k<arr[i]; k++) {
                    //stack값 뒤에서 부터 제거
					stack.pop();
				}
			}
		}
        
        // stack을 배열로 변환
        int[] answer = new int[stack.size()];
        for (int i = stack.size() - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }
        
        return answer;
    }
}

 

3. 배열 만들기 5

문자열 배열 intStrs와 정수 k, s, l가 주어집니다. intStrs의 원소는 숫자로 이루어져 있습니다.

배열 intStrs의 각 원소마다 s번 인덱스에서 시작하는 길이 l짜리 부분 문자열을 잘라내 정수로 변환합니다. 이때 변환한 정수값이 k보다 큰 값들을 담은 배열을 return 하는 solution 함수를 완성해 주세요.

import java.util.*;

class Solution {
    public int[] solution(String[] intStrs, int k, int s, int l) {
        
		//결과값을 담을 list 선언
		List<Integer> list = new ArrayList<Integer>();
		
        //intStrs의 크기만큼 for문 돌기
		for(int i=0; i<intStrs.length; i++) {
            //intStrs[i]를 s~s+l로 자른 값이
			int num = Integer.parseInt(intStrs[i].substring(s, s+l));
            //k보다 크면
			if(num > k) {
                //list에 추가
				list.add(num);
			}
		}

        //list의 값을 배열로 변환
		int[] answer = new int[list.size()];
		for(int j=0; j<list.size(); j++) {
			answer[j] = list.get(j);
		}
        
        return answer;
    }
}
import java.util.*;

class Solution {
    public int[] solution(String[] intStrs, int k, int s, int l) {
        return Arrays.stream(intStrs).mapToInt(e -> Integer.parseInt(e.substring(s,s+l))).filter(e -> e > k).toArray();
    }
}

 

 

 

SCRIPT

1. 문자열 뒤집기

문자열 my_string과 정수 s, e가 매개변수로 주어질 때, my_string에서 인덱스 s부터 인덱스 e까지를 뒤집은 문자열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, s, e) {
    var answer = '';
    
    //my_string을 배열로 변환
    let arr = my_string.split("");
    
    //배열의 index s부터 e까지의 값을 잘라서 순서를 바꾼 배열 준비
    let sliceArr = arr.slice(s,e+1).reverse();
    
    //배열의 s부터 e까지를 뒤집은 배열로 변경
    arr.splice(s,e-s+1,sliceArr.join(""));
    
    //answer에 문자열로 저장
    answer = arr.join("");
    
    
    return answer;
}
function solution(my_string, s, e) {
    var answer = '';
    
    //문자열을 s부터 까지 잘라오기
    var str = my_string.substring(s,e+1);
    
    //잘라온 문자열의 순서를 뒤집은 새로운 문자열 생성
    var newStr = str.split('').reverse().join('');
    
	//기존의 문자열을 새로운 문자열로 변경
    answer = my_string.replace(str,newStr);
    
    return answer;
}

 

2. 1로 만들기

정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다. 예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.

  • 10 / 2 = 5
  • (5 - 1) / 2 = 4
  • 4 / 2 = 2
  • 2 / 2 = 1

위와 같이 4번의 나누기 연산으로 1이 되었습니다.

정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.

function solution(num_list) {
    var answer = 0;
    
    //배열의 값을 하나씩 꺼내서
    num_list.forEach((num)=>{
        //배열의 값이 1보다 클 경우 while문 돌기
        while(num > 1){
            //짝수이면
            if(num%2 == 0){
                //num_list[i]/2
                num = num/2
                //answer++
                answer++
            }
            //num_list[i]가 홀수이면
            else{
                //(num_list[i]-1)/2
                num = (num-1)/2
                //answer++
                answer++
            }
        }
    })
    
    return answer;
}

 

3. 수열과 구간 쿼리 3

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

 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.

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

function solution(arr, queries) {
    var answer = [];
    
    //배열의 값을 하나씩 가져와
    queries.forEach(([a,b]) => {
        //arr[a]의 값을 임시로 담은 변수 선언
        let temp = arr[a];
        
        //arr[a]에 arr[b]의 값 담기
        arr[a] = arr[b];        
        //arr[b]에 temp 값 담기
        arr[b] = temp;
    })
    
    //배열 복사
    answer = [...arr];
    
    return answer;
}

 

 

 

 

SQL

1. 년, 월, 성별 별 상품 구매 회원 수 구하기

SELECT
    TO_CHAR(SALES_DATE,'YYYY') AS YEAR
    ,TO_NUMBER(TO_CHAR(SALES_DATE,'MM')) AS MONTH
    ,GENDER
    ,COUNT(DISTINCT O.USER_ID) AS USERS
FROM ONLINE_SALE O
LEFT JOIN USER_INFO U ON O.USER_ID = U.USER_ID
WHERE 1=1
AND GENDER IS NOT NULL
GROUP BY TO_CHAR(SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(SALES_DATE,'MM')), GENDER
ORDER BY 1,2,3 ASC;

 

2. 서울에 위치한 식당 목록 출력하기

SELECT
    I.REST_ID
    ,I.REST_NAME
    ,I.FOOD_TYPE
    ,I.FAVORITES
    ,I.ADDRESS
    ,ROUND(AVG(R.REVIEW_SCORE),2) AS SCORE
FROM REST_REVIEW R
LEFT JOIN REST_INFO I ON R.REST_ID = I.REST_ID
WHERE 1=1
AND ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
    ,I.REST_NAME
    ,I.FOOD_TYPE
    ,I.FAVORITES
    ,I.ADDRESS
ORDER BY 6 DESC, 4 DESC;

 

3. 우유와 요거트가 담긴 장바구니

WITH MILK AS(
    SELECT
        M.CART_ID
    FROM CART_PRODUCTS M
    WHERE 1=1
    AND M.NAME = ('Milk')
    GROUP BY CART_ID
    )

SELECT
    Y.CART_ID
FROM CART_PRODUCTS Y
INNER JOIN MILK M ON Y.CART_ID = M.CART_ID
WHERE 1=1
AND Y.NAME = ('Yogurt')
GROUP BY Y.CART_ID
ORDER BY Y.CART_ID;

 

4. 주문량이 많은 아이스크림들 조회하기

SELECT
    H.FLAVOR
FROM FIRST_HALF H
LEFT JOIN JULY J ON H.FLAVOR = J.FLAVOR
GROUP BY H.FLAVOR
ORDER BY SUM(H.TOTAL_ORDER) + SUM(J.TOTAL_ORDER) DESC
FETCH FIRST 3 ROWS ONLY;