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

코딩테스트 연습 - 11일차

by 코도꼬마 2023. 11. 16.
  JAVA SCRIPT SQL
11일차 3개 4개 3개
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. 직사각형 넓이 구하기

     - 간단해보이는데 이상하게 안풀려서 시간이 오래 걸렸음ㅠ

2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

class Solution {
    public int solution(int[][] dots) {
        int answer = 0;
        
        //dots[0][0],dots[0][1]의 값으로 최소, 최대 기본값 세팅
        int maxX = dots[0][0];
        int minX = dots[0][0]; 
        int maxY = dots[0][1];
        int minY = dots[0][1];
                
        //배열의 크기만큼 for문 돌기
        for (int i=0; i < dots.length; i++) {
            //dots[i][0]이 maxX보다 크면
			if(dots[i][0]  >maxX) {
                //maxX에 값 저장
				maxX = dots[i][0];
			}
            //dots[i][0]이 minX보다 작으면
			if(dots[i][0]<minX) {
                //minX에 값 저장
				minX = dots[i][0];
			}
            //dots[i][1]이 maxY보다 크면
			if(dots[i][1] > maxY) {
                //maxY에 값 저장
				maxY = dots[i][1];
			}
            //dots[i][1]이 minY보다 작으면
			if(dots[i][1] < minY) {
                //minY에 값 저장
				minY = dots[i][1];
			}
		}
        
        //가로 * 세로
        answer = (maxX-minX)*(maxY-minY);
        
        return answer;
    }
}

 

2. 로그인 성공?

머쓱이는 프로그래머스에 로그인하려고 합니다. 머쓱이가 입력한 아이디와 패스워드가 담긴 배열 id_pw와 회원들의 정보가 담긴 2차원 배열 db가 주어질 때, 다음과 같이 로그인 성공, 실패에 따른 메시지를 return하도록 solution 함수를 완성해주세요.

  • 아이디와 비밀번호가 모두 일치하는 회원정보가 있으면 "login"을 return합니다.
  • 로그인이 실패했을 때 아이디가 일치하는 회원이 없다면 “fail”를, 아이디는 일치하지만 비밀번호가 일치하는 회원이 없다면 “wrong pw”를 return 합니다.
class Solution {
    public String solution(String[] id_pw, String[][] db) {
        String answer = "";
        
        //db의 크기만큼 배열 돌기
        for (int i = 0; i < db.length; i++) {
            //아이디 값이 db의 정보와 일치하면
			if(id_pw[0].equals(db[i][0])) {
                //비밀번호 값이 db정보와 일치하면
				if(id_pw[1].equals(db[i][1])) {
                    //login
					answer = "login";
                    break;
				}
                //비밀번호가 일치하지 않으면
                else {
                    //wrong pw
					answer = "wrong pw";
                    break;
				}
			}
            //아이디가 일치하지 않으면
            else {
                //fail
				answer = "fail";
			}
		}
        
        return answer;
    }
}

 

3. 저주의 숫자 3

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

10진법3x 마을에서 쓰는 숫자10진법3x 마을에서 쓰는 숫자

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.

class Solution {
    public int solution(int n) {
        int answer = 0;
		
        //n만큼 for문 돌기
		for (int i = 0; i < n; i++) {
			
            //answer++
			answer++;
			
            //answer이 3의 배수이거나 3이 들어가는 숫자일 경우
			while (answer%3 == 0 || String.valueOf(answer).contains("3")) {
                //answer++
				answer++;
			}
			
		}
		
        return answer;
    }
}

 

 

 

 

SCRIPT

1. 문자열이 몇 번 등장하는지 세기

문자열 myString pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

function solution(myString, pat) {
    var answer = 0;
    
    //myString의 길이만큼 for문 돌기
    for(let i=0; i<myString.length; i++){
        //myString을 i부터 끝까지 자른 값 가져오기
        let str = myString.slice(i,myString.length);
        //잘라온 문자열이 pat으로 시작할 경우
        if(str.startsWith(pat)){
            //answer++
            answer++;
        }
    //for문 끝        
    }
    
    return answer;
}

 

2. 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문자열 myString pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

function solution(myString, pat) {
    var answer = '';
    
    //myString의 크기부터 0까지 for문 돌기
    for(let i=myString.length; i>0; i--){
        //myString을 뒤에서 부터 i만큼 잘라낸 문자열 가져오기
        let str = myString.substring(0,i);
        
        //해당 문자열이 pat으로 끝나면
        if(str.endsWith(pat)){
            //answer에 저장 후 break
            return str;
        }
    //for문 끝        
    }
    
    return answer;
}

 

3. 세 개의 구분자

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.

예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.

문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

function solution(myStr) {
    var answer = [];
    
    //myStr을 a 또는 b 또는 c로 나눈 배열의 공백을 제거하고 answer에 저장
    answer = myStr.split(/[abc]/).filter((e) => e != "");
    
    //answer의 길이가 1보다 작으면
    if(answer.length < 1){
        //"EMPTY" 저장
        answer[0] = "EMPTY";
    }
    
    return answer;
}

 

4. 배열의 길이를 2의 거듭제곱으로 만들기

정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

function solution(arr) {
    var answer = arr;
    
    //임의의 수를 담을 변수 선언
    let num = 0

    //배열의 길이보다 제곱근의 값이 커질때 까지 num++
    while(Math.pow(2,num) < arr.length) {
        num++
    }
    
    //해당 num의 2의 제곱근의 값을 저장
    num = Math.pow(2,num)

    //배열의 길이가 num과 같아질 때 까지 while문 돌기
    while(arr.length < num) {
        //answer에 0 추가
        answer.push(0)
    }
    
    return answer;
}

 

 

 

 

SQL

1. 저자 별 카테고리 별 매출액 집계하기

SELECT
    A.AUTHOR_ID
    ,A.AUTHOR_NAME
    ,B.CATEGORY
    ,SUM(B.PRICE * S.SALES) AS SALES
FROM AUTHOR A
LEFT JOIN BOOK B ON A.AUTHOR_ID = B.AUTHOR_ID
LEFT JOIN BOOK_SALES S ON B.BOOK_ID = S.BOOK_ID
WHERE 1=1
AND TO_CHAR(SALES_DATE,'YYYY-MM') = '2022-01'
GROUP BY
    A.AUTHOR_ID
    ,A.AUTHOR_NAME
    ,B.CATEGORY
ORDER BY 1 ASC, 3 DESC;

 

2. 그룹별 조건에 맞는 식당 목록 출력하기

SELECT 
    P.MEMBER_NAME
    ,R.REVIEW_TEXT
    ,TO_CHAR(R.REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
FROM MEMBER_PROFILE P
INNER JOIN REST_REVIEW R
ON P.MEMBER_ID = R.MEMBER_ID
WHERE R.MEMBER_ID = 
    (SELECT MEMBER_ID
    FROM REST_REVIEW
    GROUP BY MEMBER_ID
    ORDER BY COUNT(REVIEW_ID) DESC
    FETCH FIRST 1 ROW ONLY)
ORDER BY 3,2;

 

3. 오프라인/온라인 판매 데이터 통합하기

SELECT 
    TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
    ,PRODUCT_ID
    ,USER_ID
    ,SALES_AMOUNT
FROM(
    (SELECT 
        USER_ID
        ,PRODUCT_ID
        ,SALES_AMOUNT
        ,SALES_DATE
    FROM ONLINE_SALE
    WHERE TO_CHAR(SALES_DATE, 'MM') = '03')
    UNION
    (SELECT 
        NULL AS USER_ID
        ,PRODUCT_ID
        ,SALES_AMOUNT
        ,SALES_DATE
    FROM OFFLINE_SALE
    WHERE TO_CHAR(SALES_DATE, 'MM') = '03')
    )
ORDER BY 1,2,3;