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

코딩테스트 연습 - 5일차

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

 

JAVA 

1. 숫자 찾기

정수 num k가 매개변수로 주어질 때, num을 이루는 숫자 중에 k가 있으면 num의 그 숫자가 있는 자리 수를 return하고 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int num, int k) {
        int answer = 0;
        
        //num을 String으로 변환
        String strNum = String.valueOf(num);
        
        //k의 값이 있으면
        if(strNum.indexOf(String.valueOf(k)) > -1){
            //k의 index + 1
            answer = strNum.indexOf(String.valueOf(k))+1;
        }else { //없으면
            //-1
            answer = strNum.indexOf(String.valueOf(k));
        }
        
        return answer;
    }
}

 

2. 문자열 정렬하기 (2)

영어 대소문자로 이루어진 문자열 my_string이 매개변수로 주어질 때, my_string을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.

import java.util.*;

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        //my_string을 소문자로 변경
        my_string = my_string.toLowerCase();
        
        //my_string을 배열로 변환
        String[] arr = my_string.split("");
        
        //정렬
        Arrays.sort(arr);
        
        //answer에 저장
        answer = String.join("",arr);
		
        return answer;
    }
}

 

3. 합성수 찾기

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        //n만큼 for문 돌기
        for(int i=1; i<=n; i++){
            
            //약수 cnt 변수
            int cnt = 0;
            
            //i만큼 for문 돌기
            for(int k=1; k<=i; k++){
                
                //i을 k로 나누었을 때 나머지가 0이면
                if(i%k == 0){
                    //cnt++
                    cnt++;
                }        
            //for문 끝
            }
            
            //약수가 3개 이상이면
            if(cnt >= 3){
                //answer++
                answer++;
            }
            
        //for문 끝            
        }
        
        return answer;
    }
}

 

4. 중복된 문자 제거

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        //my_string의 크기만큼 for문 돌기
        for(int i=0; i<my_string.length(); i++){
            //중복값이 없으면 
            if(answer.indexOf(my_string.charAt(i)) == -1){
                //해당 값 추가
                answer += my_string.charAt(i);
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

5. 2차원으로 만들기

정수 배열 num_list와 정수 n이 매개변수로 주어집니다. num_list를 다음 설명과 같이 2차원 배열로 바꿔 return하도록 solution 함수를 완성해주세요.

num_list가 [1, 2, 3, 4, 5, 6, 7, 8] 로 길이가 8이고 n이 2이므로 num_list를 2 * 4 배열로 다음과 같이 변경합니다. 2차원으로 바꿀 때에는 num_list의 원소들을 앞에서부터 n개씩 나눠 2차원 배열로 변경합니다.

class Solution {
    public int[][] solution(int[] num_list, int n) {
        int[][] answer = new int[num_list.length/n][n];
        
        //index값을 저장할 변수 선언
        int index =0;
        
        //num_list/n 만큼 for문 돌기
        for(int i=0; i<num_list.length/n; i++){
            //n 만큼 for문 돌기
            for(int k=0; k<n; k++){
                //answer[i][k]에 num_list[index] 값 담기
                answer[i][k] = num_list[index];
                //index++
                index++;
            //for문 끝                
            }
        //for문 끝            
        }
        
        return answer;
    }
}

 

6. A로 B 만들기

문자열 before after가 매개변수로 주어질 때, before의 순서를 바꾸어 after를 만들 수 있으면 1을, 만들 수 없으면 0을 return 하도록 solution 함수를 완성해보세요.

import java.util.*;

class Solution {
    public int solution(String before, String after) {
        int answer = 0;
		
        //문자열을 배열로 변환
		String[] arrBe = before.split("");
		String[] arrAf = after.split("");
		
        //배열 정렬
		Arrays.sort(arrBe);
		Arrays.sort(arrAf);
		
        //배열을 문자열로 변환
		before = String.join("",arrBe);
		after = String.join("",arrAf);
		
        //두 문자열이 같으면
		if(before.equals(after)) {
            //1
			answer = 1;
		}else { //다르면
            //0
			answer = 0;
		}
		
        return answer;
    }
}

 

7. A로 B 만들기

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

class Solution {
    public String solution(String letter) {
        String answer = "";
        
        //morse의 key값을 배열로 만들기
        String[] morse = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        
        //letter를 공백을 기준으로 배열로 변환
        String[] arr = letter.split(" ");
        
        //arr의 값을 하나씩 꺼내서
        for (String word : arr) {
            //morse 배열과 비교
			for (int i = 0; i < morse.length; i++) {
                //같을 경우
				if(word.equals(morse[i])) {
                    //answer에 i+'a'값 저장
					answer += Character.toString(i+'a');
				}
            //for문 끝
			}
        //for문 끝
		}
        
        return answer;
    }
}

 

 

 

SCRIPT

1. 뒤에서 5등까지

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

function solution(num_list) {
    var answer = [];
    
    //num_list 정렬
    num_list.sort(function(a,b){
        return a-b;
    });
    
    //0~5까지 answer에 복사
    answer = num_list.slice(0,5);
    
    return answer;
}

 

2. 주사위 게임 1

1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.

  • a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
  • a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
  • a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.

두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

function solution(a, b) {
    var answer = 0;
    
    //둘다 홀수이면
    if(a%2 != 0 && b%2 != 0){
        answer = a*a+b*b;
    //하나만 홀수이면
    }else if(a%2 != 0 || b%2 != 0){
        answer = 2*(a+b);
    //둘다 홀수가 아니면
    }else if(a%2 == 0 && b%2 == 0){
        answer = Math.abs(a-b);
    }
    
    return answer;
}

 

3. 글자 이어 붙여 문자열 만들기

문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다. my_string index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_string, index_list) {
    var answer = '';
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<index_list.length; i++){
        //배열의 값과 같은 my_string index의 값 answer에 저장
        answer += my_string.charAt(index_list[i]);
    //for문 끝        
    }
    
    return answer;
}
function solution(my_string, index_list) {
    var answer = '';
    
    //map 사용해보기
    answer = index_list.map(i => my_string[i]).join('');
    
    return answer;
}

 

4. 부분 문자열 이어 붙여 문자열 만들기

길이가 같은 문자열 배열 my_strings와 이차원 정수 배열 parts가 매개변수로 주어집니다. parts[i]는 [s, e] 형태로, my_string[i]의 인덱스 s부터 인덱스 e까지의 부분 문자열을 의미합니다. 각 my_strings의 원소의 parts에 해당하는 부분 문자열을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.

function solution(my_strings, parts) {
    var answer = '';
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<my_strings.length; i++){
        //parts[i]의 값들을 가져와 my_strings[i]의 값을 잘라 answer에 추가
        answer += my_strings[i].slice(parts[i][0],parts[i][1]+1);
    //for문 끝        
    }
    
    return answer;
}
function solution(my_strings, parts) {
    var answer = '';
    
    //map 사용하기
    answer = parts.map(([s,e],i) => {
        return my_strings[i].slice(s,e+1);
    }).join('');
    
    return answer;
}

 

5. 5명씩

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 names가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 완성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다.

function solution(names) {
    var answer = [];
    
    //배열의 크기만큼 5씩 커지는 for문 돌기
    for(let i=0; i<names.length; i+=5){
        //해당 값을 answer에 추가
        answer.push(names[i]);
    //for문 끝        
    }
    
    return answer;
}

 

6. 배열의 길이에 따라 다른 연산하기

정수 배열 arr과 정수 n이 매개변수로 주어집니다. arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을, arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr, n) {
    var answer = [];
    
    if(arr.length%2 == 0){
        for(let i=0; i<arr.length; i++){
            if(i%2 == 0){
                answer.push(arr[i])
            }else{
                answer.push(arr[i]+n);
            }
        }
    }else {
        for(let k=0; k<arr.length; k++){
            if(k%2 == 0){
                answer.push(arr[k]+n);
            }else{
                answer.push(arr[k])
            }
        }
    }
    
    return answer;
}

 

7. l로 만들기

알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.

function solution(myString) {
    var answer = '';
    
    //myString을 배열로 변환
    let arr = myString.split('');
    
    //배열의 크기만큼 for문 돌기
    for(let i=0; i<arr.length; i++){
        //해당 값의 아스키코드 가져와서 'l'의 아스키코드보다 작을 경우
        if(arr[i].charCodeAt() < 'l'.charCodeAt()){
            //해당 값을 'l'로 변경
            arr[i] = 'l';
        }
    //for문 끝        
    }
    
    //배열을 answer에 저장
    answer = arr.join('');
    
    return answer;
}

 

8. 순서 바꾸기

정수 리스트 num_list와 정수 n이 주어질 때, num_list n 번째 원소 이후의 원소들과 n 번째까지의 원소들로 나눠 n 번째 원소 이후의 원소들을 n 번째까지의 원소들 앞에 붙인 리스트를 return하도록 solution 함수를 완성해주세요.

function solution(num_list, n) {
    var answer = [num_list.length];
    
    //n번째 까지의 원소를 담은 배열
    let arr1 = num_list.slice(0,n);
    
    //n이후의 원소를 담은 배열
    let arr2 = num_list.slice(n,num_list.length);
    
    //합치기
    answer = arr2.concat(arr1);
    
    return answer;
}

 

 

 

SQL

1. NULL 처리하기

-- 코드를 입력하세요
SELECT
    ANIMAL_TYPE
    ,NVL(NAME,'No name') AS NAME
    ,SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

 

2. DATETIME에서 DATE로 형 변환

-- 코드를 입력하세요
SELECT
    ANIMAL_ID
    ,NAME
    ,(TO_CHAR(DATETIME, 'YYYY-MM-DD')) AS 날짜
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID;

 

3. 가격이 제일 비싼 식품의 정보 출력하기

-- 코드를 입력하세요
SELECT
    PRODUCT_ID
    ,PRODUCT_NAME
    ,PRODUCT_CD
    ,CATEGORY
    ,PRICE
FROM FOOD_PRODUCT 
ORDER BY PRICE DESC
FETCH FIRST 1 ROW ONLY;

 

4. 중성화 여부 파악하기

-- 코드를 입력하세요
SELECT
    ANIMAL_ID
    ,NAME
    ,CASE
        WHEN SEX_UPON_INTAKE LIKE 'Neutered%' THEN 'O'
        WHEN SEX_UPON_INTAKE LIKE 'Spayed%' THEN 'O'
        ELSE 'X'
     END AS 중성화
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID;

 

5. 고양이와 개는 몇 마리 있을까

-- 코드를 입력하세요
SELECT
    ANIMAL_TYPE
    ,COUNT(ANIMAL_ID) AS count
FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE
ORDER BY (CASE WHEN ANIMAL_TYPE = 'Cat' THEN 0 ELSE 1 END);

 

6. 입양 시각 구하기(1)

-- 코드를 입력하세요
SELECT
    TO_NUMBER(TO_CHAR(DATETIME,'HH24')) AS HOUR
    ,COUNT(ANIMAL_ID) COUNT
FROM ANIMAL_OUTS 
WHERE 1=1
AND TO_CHAR(DATETIME,'HH24') BETWEEN 9 AND 19
GROUP BY TO_CHAR(DATETIME,'HH24')
ORDER BY HOUR;

 

7. 루시와 엘라 찾기

-- 코드를 입력하세요
SELECT
    ANIMAL_ID
    ,NAME
    ,SEX_UPON_INTAKE
FROM ANIMAL_INS 
WHERE 1=1
AND NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;

 

8. 3월에 태어난 여성 회원 목록 출력하기

-- 코드를 입력하세요
SELECT
    MEMBER_ID
    ,MEMBER_NAME
    ,GENDER
    ,TO_CHAR(DATE_OF_BIRTH,'YYYY-MM-DD') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE 
WHERE 1=1
AND TO_CHAR(DATE_OF_BIRTH,'MM') = '03'
AND GENDER = 'W'
AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC;

 

9. 오랜 기간 보호한 동물(1)

-- 코드를 입력하세요
SELECT
    I.NAME
    ,I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE 1=1
AND O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
FETCH FIRST 3 ROWS ONLY;