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

코딩테스트 연습 - 4일차

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

 

JAVA 

1. 직각삼각형 출력하기

"*"의 높이와 너비를 1이라고 했을 때, "*"을 이용해 직각 이등변 삼각형을 그리려고합니다. 정수 n 이 주어지면 높이와 너비가 n 인 직각 이등변 삼각형을 출력하도록 코드를 작성해보세요.

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        //높이 n만큼 for문 돌리기
        for(int i=0; i<n; i++){
            //너비 n만큼 for문 돌리기
            for(int j=0; j<i+1; j++){
                //너비만큼 * 출력
                System.out.print("*");
            //for문 끝
            }
            System.out.println();
        //for문 끝
            
        }
    }
}

 

2. 주사위의 개수

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int[] box, int n) {
        int answer = 0;
        
        answer = (box[0]/n)*(box[1]/n)*(box[2]/n);
        
        return answer;
    }
}

 

3. 가장 큰 수 찾기

정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int[] solution(int[] array) {
        int[] answer = new int[2];
        
        //최대값을 담을 변수 선언
        int max =  0;
        
        //배열의 크기 만큼 for문 돌기
        for(int i=0; i<array.length; i++){
            //배열의 값을 가져와 최대값 비교해서 담기
            if(array[i]>max){
                //최대값 변경
                max = array[i];
                //index 저장
                answer[1] = i;
            }
        //for문 끝            
        }
        
        //결과값 담기
        answer[0] = max;
        
        return answer;
    }
}

 

4. 인덱스 바꾸기

문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public String solution(String my_string, int num1, int num2) {
        String answer = "";
        
        //문자열을 배열로 변환
        String[] arr = my_string.split("");
        //임의의 값을 담을 변수
        String temp = "";    
        
        //num2 index의 값을 임의로 저장
        temp = arr[num2];
        //num2 index에 num1 index값 저장    
        arr[num2] = arr[num1];        
        //저장해놓은 num1 index의 값을 /num2 index에 저장
        arr[num1] = temp;
        
        //배열의 값을 asnwer에 저장
        answer = String.join("",arr);
        
        return answer;
    }
}

 

5. 외계행성의 나이

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

import java.util.*;
import java.util.stream.Stream;

class Solution {
    public String solution(int age) {
        String answer = "";
        
        //나이를 배열로 변환
        int[] arr = Stream.of(String.valueOf(age).split("")).mapToInt(Integer::parseInt).toArray();
        //배열의 크기만큼 for문 돌기
        for(int i=0; i<arr.length; i++){
            //값을 가져와서 char형으로 변환 후 'a' 더해주기
            answer += String.valueOf(Character.valueOf((char) (arr[i]+'a')));
        //for문 끝            
        }
        
        return answer;
    }
}

 

6. 배열 회전시키기

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int[] answer = new int[numbers.length];
		
        //오른쪽일 경우
		if(direction.equals("right")) {
            //배열의 크기만큼 for문 돌기
			for (int i = 0; i < answer.length-1; i++) {
                //index i의 값을 index i+1에 저장
				answer[i+1] = numbers[i];
			}
            //index 0에 마지막 값 저장
			answer[0] = numbers[answer.length - 1];
        //왼쪽일 경우
		}else {
            //배열의 크기만큼 for문 돌기
			for (int i = 0; i < answer.length-1; i++) {
                //index i+1의 값을 index i에 저장
				answer[i] = numbers[i+1];
			}
            //마지막 index에 index 0의 값 저장
			answer[answer.length - 1] = numbers[0];
		}
        
        return answer;
    }
}

 

7. 약수 구하기

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int[] solution(int n) {
        int[] answer = {};
        
        //index 값을 저장할 변수 선언
		int index = 0;
		
        //n만큼 for문 돌기
		for (int i = 1; i <= n; i++) {
            //n을 i로 나눴을 때 나머지가 0이면
			if(n%i==0) {
                //index++
				index++;
			}
		}

        //answer 배열의 값 초기화
		answer = new int[index];
		
        //index값 초기화
		index = 0;
		
        //n만큼 for문 돌기
		for (int i = 1; i <= n; i++) {
            //n을 i로 나눴을 때 나머지가 0이면
			if(n%i==0) {
                //answer에 i값 저장
				answer[index] = i;
                //index++
				index++;
			}
		}
		
        return answer;
    }
}

 

8. 피자 나눠 먹기 (2)

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int n) {
        int answer = 1;
        
        //피자 조각 수
		int slice = 6;
        
        //피자조각 수를 n으로 나누었을 때 나머지가 0이 될때까지 while문 돌기
		while (slice%n != 0) {
            //slice+6
			slice+=6;
            //answer++
			answer++;
		}
        
        return answer;
    }
}

 

9. 369게임

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

import java.util.stream.Stream;

class Solution {
    public int solution(int order) {
        int answer = 0;
		
        //order를 배열로 변환
		int[] list = Stream.of(String.valueOf(order).split("")).mapToInt(Integer::parseInt).toArray();
		
        //배열의 크기만큼 for문 돌기
		for (int i = 0; i < list.length; i++) {
            //배열의 값이 3,6,9이면
			if(list[i] == 3 | list[i] == 6 | list[i] == 9) {
                //answer++
				answer++;
			}
		}
        
        return answer;
    }
}

 

 

 

SCRIPT 

1. 꼬리 문자열

문자열들이 담긴 리스트가 주어졌을 때, 모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다. 꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다. 예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고 문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.

문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때, str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return하도록 solution 함수를 완성해주세요.

function solution(str_list, ex) {
    var answer = '';
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<str_list.length; i++){
        //배열의 값을 가져와 ex를 포함하지 않으면
        if(!str_list[i].includes(ex)){
            //answer에 저장
            answer += str_list[i];
        }
    //for문 끝        
    }
    
    return answer;
}

 

2. 조건에 맞게 수열 변환하기 3

정수 배열 arr와 자연수 k가 주어집니다.

만약 k가 홀수라면 arr의 모든 원소에 k를 곱하고, k가 짝수라면 arr의 모든 원소에 k를 더합니다.

이러한 변환을 마친 후의 arr를 return 하는 solution 함수를 완성해 주세요.

function solution(arr, k) {
    var answer = [arr.length];
    
    //k가 짝수이면
    if(k%2 == 0){
        //배열의 크기만큼 for문 돌기
        for(let i=0; i<arr.length; i++){
            //answer에 arr[i]+k 저장
            answer[i] = arr[i]+k;
        }
    //아니면
    }else {
        //배열의 크기만큼 for문 돌기
        for(let i=0; i<arr.length; i++){
            //answer에 arr[i]*k 저장
            answer[i] = arr[i]*k;
        }        
    }
    
    return answer;
}

 

3. 접미사인지 확인하기

어떤 문자열에 대해서 접미사는 특정 인덱스부터 시작하는 문자열을 의미합니다. 예를 들어, "banana"의 모든 접미사는 "banana", "anana", "nana", "ana", "na", "a"입니다.
문자열 my_string is_suffix가 주어질 때, is_suffix my_string의 접미사라면 1을, 아니면 0을 return 하는 solution 함수를 작성해 주세요.

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

 

4. 부분 문자열

어떤 문자열 A가 다른 문자열 B안에 속하면 A를 B의 부분 문자열이라고 합니다. 예를 들어 문자열 "abc"는 문자열 "aabcc"의 부분 문자열입니다.

문자열 str1과 str2가 주어질 때, str1이 str2의 부분 문자열이라면 1을 부분 문자열이 아니라면 0을 return하도록 solution 함수를 완성해주세요.

function solution(str1, str2) {
    var answer = 0;
    
    if(str2.includes(str1)){
        answer = 1;
    }else {
        answer = 0;        
    }
    
    return answer;
}

 

5. 문자열 바꿔서 찾기

문자 "A"와 "B"로 이루어진 문자열 myString pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.

function solution(myString, pat) {
    var answer = 0;
    
    //myString을 배열로 변환
    let arr = myString.split("");
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 값이 "A"이면
        if(arr[i] === "A"){
            //"B"로 변경
            arr[i] = "B";
        //아니면            
        }else {
            //"A"로 변경
            arr[i] = "A";
        }
    //for문 끝        
    }
    
    //배열을 문자열로 변환
    myString = arr.join("");
    //pat을 포함하면
    if(myString.includes(pat)){
        //1
        answer = 1;
    //아니면        
    }else {
        //0
        answer = 0;
    }
    
    return answer;
}

 

6. 공백으로 구분하기 2

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

function solution(my_string) {
    var answer = [];
    
    //filter : 특정값 제외하고 담기
    answer = my_string.split(" ").filter((element) => element != '');
    
    return answer;
}

 

7. 배열의 원소 삭제하기

정수 배열 arr delete_list가 있습니다. arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr, delete_list) {
    var answer = [];
    
    answer = arr.filter((element) => !delete_list.includes(element));
    
    return answer;
}

 

8. 배열의 원소만큼 추가하기

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 arr가 매개변수로 주어질 때, arr의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.

function solution(arr) {
    var answer = [];
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //배열의 값만큼 for문 돌기
        for(let k=0; k<arr[i]; k++){
            //배열의 값 answer에 담기
            answer.push(arr[i]);
        //for문 끝            
        }
    //for문 끝        
    }
    
    return answer;
}

 

9. 더 크게 합치기

연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다.

  • 12 ⊕ 3 = 123
  • 3 ⊕ 12 = 312

양의 정수 a와 b가 주어졌을 때, a  b와 b  a 중 더 큰 값을 return 하는 solution 함수를 완성해 주세요.

단, a  b와 b  a가 같다면 a  b를 return 합니다.

function solution(a, b) {
    var answer = 0;
    
    //각각의 합을 담은 배열 선언(2개)
    let arr1 = [a,b];
    let arr2 = [b,a];
    
    //배열을 합쳐서 반환
    let sum1 = arr1.join("");
    let sum2 = arr2.join("");
    
    //두 값 중 큰 값을 answer에 저장
    answer = Math.max(sum1,sum2);
    
    return answer;
}

 

10. 0 떼기

정수로 이루어진 문자열 n_str이 주어질 때, n_str의 가장 왼쪽에 처음으로 등장하는 0들을 뗀 문자열을 return하도록 solution 함수를 완성해주세요.

function solution(n_str) {
    var answer = '';
    
    answer = n_str.replace(/^0+/, ''); 
    
    return answer;
}

 

 

 

SQL

1. 재구매가 일어난 상품과 회원 리스트 구하기

ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

SELECT DISTINCT
    A.USER_ID
    ,A.PRODUCT_ID
FROM ONLINE_SALE A
INNER JOIN ONLINE_SALE B ON A.USER_ID = B.USER_ID AND A.PRODUCT_ID = B.PRODUCT_ID AND A.SALES_DATE > B.SALES_DATE
ORDER BY A.USER_ID ASC, A.PRODUCT_ID DESC;

 

2. 상품 별 오프라인 매출 구하기

PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.

-- 코드를 입력하세요
SELECT
    P.PRODUCT_CODE
    ,SUM(P.PRICE * O.SALES_AMOUNT) AS SALES
FROM PRODUCT P
RIGHT JOIN OFFLINE_SALE O ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SUM(P.PRICE * O.SALES_AMOUNT) DESC, PRODUCT_CODE ASC;

 

3. 가격대 별 상품 개수 구하기

-- 코드를 입력하세요
SELECT
    TRUNC(PRICE,-4) AS PRICE_GROUP
    ,COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT 
GROUP BY TRUNC(PRICE,-4)
ORDER BY PRICE_GROUP ASC;

 

4. 카테고리 별 상품 개수 구하기

-- 코드를 입력하세요
SELECT
    SUBSTR(PRODUCT_CODE,1,2) AS CATEGORY
    ,COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT 
GROUP BY SUBSTR(PRODUCT_CODE,1,2)
ORDER BY CATEGORY ASC;

 

5. 동물 수 구하기

-- 코드를 입력하세요
SELECT
    COUNT(ANIMAL_ID) AS count
FROM ANIMAL_INS;

 

6. 최솟값 구하기

-- 코드를 입력하세요
SELECT
    MIN(DATETIME) AS 시간
FROM ANIMAL_INS;

 

7. 동명 동물 수 찾기

-- 코드를 입력하세요
SELECT
    NAME
    ,COUNT(NAME) AS COUNT
FROM ANIMAL_INS 
WHERE 1=1
AND NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME;

 

8. 중복 제거하기

-- 코드를 입력하세요
SELECT
    COUNT(DISTINCT(NAME)) AS count
FROM ANIMAL_INS 
WHERE 1=1
AND NAME IS NOT NULL;

 

9. 이름에 el이 들어가는 동물 찾기

-- 코드를 입력하세요
SELECT
    ANIMAL_ID
    ,NAME
FROM ANIMAL_INS 
WHERE 1=1
AND ANIMAL_TYPE = 'Dog'
AND UPPER(NAME) LIKE '%EL%'
ORDER BY NAME;