프로그래머스 level 3 : 오랜 기간 보호한 동물(2)

  • 문제설명

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

 

  • 예시

예를 들어, ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블이 다음과 같다면

 

ANIMAL_INS

ANIMAL_OUTS

SQL문을 실행하면 다음과 같이 나와야 합니다.

※ 입양을 간 동물이 2마리 이상인 경우만 입력으로 주어집니다.

 

문제풀이

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
    JOIN ANIMAL_OUTS O
    ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY O.DATETIME - I.DATETIME DESC   
LIMIT 2

 

풀이설명

우선 ANIMAL_INS테이블과 ANIMAL_OUTS테이블을 INNER JOIN을 한 후 

ANIMAL_OUTS테이블의 DATETIME과 ANIMAL_INS의 ANIMAL_INS을 빼서 내림차순으로 정렬을 한다.

LIMIT을 사용해 2개의 데이터를 뽑아낸다.

 

프로그래머스 level 1 : 하샤드 수 

 

  • 문제설명

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

 

  • 제한사항

x는 1 이상, 10000 이하인 정수입니다.

 

  • 입출력 예

 

문제풀이

class Solution {
    public boolean solution(int x) {
        boolean answer = true;

        String temp = x+"";
        String [] temps = temp.split("");
        int num = 0;
        for(int i = 0; i<temps.length; i++){
            num += Integer.parseInt(temps[i]);
        }

        if(x%num != 0){
            answer = false;
        }

        return answer;
    }
}

 

풀이설명

파라미터로 넘어온 값을 배열에 담기 위해 String으로 변환 후 split을 사용하여 배열에 담는다.

더한 수를 저장하기 위한 변수를 선언한다.

for문을 사용하여 선언한 변수에 배열의 값을 더해준다.

조건을 걸어 나머지가 0이 아닐 경우 answer의 값을 false로 변경한다.

프로그래머스 level 1 : 수박수박수박수박수박수?

 

  • 문제설명

길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

  • 제한조건

n은 길이 10,000이하인 자연수입니다.

 

  • 입출력 예

 

문제풀이

class Solution {
    public String solution(int n) {
        String answer = "";
        for(int i=0; i<n/2; i++) answer += "수박";
        if(n%2 != 0) answer += "수"; 

        return answer;
    }
}

 

풀이설명

for문을 사용(i의 크기는 파라미터의 값/2)하여 "수박"을 넣어준 후 조건문을 사용하여(파라미터의 값이 홀수일 경우) "수"를 더해준다.

프로그래머스 level 1 : 가운데 글자 가져오기

 

  • 문제설명

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

  • 제한조건

s는 길이가 1 이상, 100이하인 스트링입니다.

 

  • 입출력 예

 

문제풀이

class Solution {
    public String solution(String s) {
        String answer = "";
        int num = s.length();
        int num2 = num/2;
        if(num % 2 == 0){
            answer = s.substring(num2-1, num2+1);
        }else{
            answer = s.substring(num2, num2+1);
        }
        return answer;
    }
}

 

풀이설명

파마리터로 넘어온 변수의 길이를 구한 후 2로 나눈다.

조건문을 주어 길이가 짝수일 경우(num % 2 == 0) substring함수를 사용하여 num2-1, num2+1로 문자열을 자른다.

아닐 경우 num2, num2+1로 문자열을 자른다.

프로그래머스 level 1 : 문자열 내림차순으로 배치하기

 

  • 문제설명

문자열 s에 나타나는 문자를 큰것부터 작은 순으로 정렬해 새로운 문자열을 리턴하는 함수, solution을 완성해주세요.
s는 영문 대소문자로만 구성되어 있으며, 대문자는 소문자보다 작은 것으로 간주합니다.

  • 제한조건

str은 길이 1 이상인 문자열입니다.

 

  • 입출력 예

 

문제풀이

class Solution {
    public String solution(String s) {
        String answer = "";
        char [] arr = s.toCharArray();
        char temp;
        for (int i=0; i<arr.length-1; i++){
            for(int j=i+1; j<arr.length; j++){
                if(arr[i] < arr[j]){
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for(int i=0; i<arr.length; i++){
            answer += arr[i];
        }
        
        return answer;
    }
}

 

풀이설명

toCharArray() 메소드를 사용하여 배열에 담는다.

sorting을 위해 char형 변수를 선언 후 이중for문을 사용하여 배열을 정렬한다.

정렬한 배열의 값을 String 변수에 값을 넣어준 후 리턴한다.

프로그래머스 level 1 : 정수 내림차순으로 배치하기

 

  • 문제설명

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다.

  • 제한조건

n은 1이상 8000000000 이하인 자연수입니다.

 

  • 입출력 예

 

문제풀이

class Solution {
    public long solution(long n) {
        long answer = 0;
        String nstr = String.valueOf(n);
        char [] narr = nstr.toCharArray();
        char temp;
    
        for (int i=0; i<narr.length-1; i++){
            for(int j=i+1; j<narr.length; j++){
                if(narr[i] < narr[j]){
                    temp = narr[i];
                    narr[i] = narr[j];
                    narr[j] = temp;
                }
            }
        }
        nstr = "";
        for(int i=0; i<narr.length; i++){
            nstr +=narr[i];
        }
        answer = Long.parseLong(nstr);
        
        return answer;
    }
}

 

풀이설명

String.valueOf() 메소드를 사용하여 파라미터로 넘어온 정수를 String형으로 변환 후 toCharArray() 메소드를 사용하여 배열에 담는다.

sorting을 위해 char형 변수를 선언 후 이중for문을 사용하여 배열을 정렬한다.

정렬한 배열의 값을 String 변수에 값을 넣어준 후 Long.parseLong()함수를 사용하여 long형으로 변환 후 리턴한다.

프로그래머스 level 1 : 제일 작은 수 제거하기

 

  • 문제설명

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

  • 제한조건

arr은 길이 1 이상인 배열입니다.

인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

 

  • 입출력 예

문제풀이

class Solution {
    public int[] solution(int[] arr) {
        int[] answer = {};
        if(arr.length==1){
            answer = new int[1];
            answer[0] = -1;
        }else{
            answer = new int[arr.length-1];
            int min = arr[0];
            
            for(int i=0; i<arr.length; i++){
                min = Math.min(min, arr[i]);
            }
            int index = 0;
            for(int i=0; i<arr.length; i++){
                if(min == arr[i]){
                    continue;
                }
                answer[index] = arr[i];
                index++;
            }
        }
        return answer;
    }
}

 

풀이설명

우선 arr.length==1 조건을 주어 answer에 -1의 값을 넣어주고, 그렇지 않을 경우 최소값을 빼서 저장하기 위해 answer의 길이는 arr.length-1로 지정하여 준다.

Math.min함수를 사용하여 arr배열의 최소값을 구한 후 for문을 사용하여 최소값일 경우 continue를 사용, 아닐경우 answer에 값을 넣어준다.

 

프로그래머스 level 1 : 같은 숫자는 싫어

 

  • 문제설명

배열 arr가 주어집니다. 배열 arr의 각 원소는 숫자 0부터 9까지로 이루어져 있습니다. 이때, 배열 arr에서 연속적으로 나타나는 숫자는 하나만 남기고 전부 제거하려고 합니다. 단, 제거된 후 남은 수들을 반환할 때는 배열 arr의 원소들의 순서를 유지해야 합니다. 예를 들면,

  1. arr = [1, 1, 3, 3, 0, 1, 1] 이면 [1, 3, 0, 1] 을 return 합니다.
  2. arr = [4, 4, 4, 3, 3] 이면 [4, 3] 을 return 합니다.

배열 arr에서 연속적으로 나타나는 숫자는 제거하고 남은 수들을 return 하는 solution 함수를 완성해 주세요.

 

  • 제한사항
  1. 배열 arr의 크기 : 1,000,000 이하의 자연수
  2. 배열 arr의 원소의 크기 : 0보다 크거나 같고 9보다 작거나 같은 정수

 

  • 입출력 예

 

문제풀이

import java.util.*;

public class Solution {
    public int[] solution(int []arr) {
        int count = 1;
        for(int i=1; i<arr.length; i++){
          if(arr[i-1] != arr[i]){
             count++;
          }
        }
        
        int [] answer = new int [count];
        int index = 1;
        answer[0]=arr[0];
        for(int i=1; i<arr.length; i++){
          if(arr[i-1] != arr[i]){
              answer[index]= arr[i];
              index++;
          }
        }

        return answer;
    }
}

 

풀이설명

for문을 사용하여 연속되는 숫자가 아닐 경우의 수를 구하여 answer 배열의 크기로 지정한 후

answer의 첫번째 인덱스에는 arr배열의 첫번째 인덱스의 값을 넣어준 후

동일한 for문을 사용하여 연속되는 숫자가 아닐 경우의 수를 answer배열에 넣어준다.

도서 쇼핑몰에서 사용될 Database의 테이블을 구현하라.
도서테이블, 고객테이블, 주문테이블을 작성한다.
테이블과의 관계를 연결하여 사용시 용이하도록   한다.

 

도서테이블에 도서번호, 도서이름, 출판사이름, 도서단가 컬럼을 추가하도록 한다

 

CREATE TABLE BOOK(
    BOOK_NO INTEGER CONSTRAINT PK_BOOK PRIMARY KEY,
    BOOK_NAME VARCHAR(100) NOT NULL,
    BOOK_PUB VARCHAR(20),
    BOOK_PRICE INTEGER NOT NULL
);

 

 

 

고객테이블에 고객번호(시퀀스사용), 고객이름, 주소, 전화번호 컬럼을 추가하도록 한다

 

CREATE TABLE CONSUMER(
    CONSUMER_NO INTEGER CONSTRAINT PK_CONSUMER PRIMARY KEY,
    CONSUMER_NAME VARCHAR(20) NOT NULL, 
    CONSUMER_EDDRESS VARCHAR(100) NOT NULL,
    CONSUMER_PHONE VARCHAR(20) NOT NULL 
);

 

 

 

고객번호 시퀀스 생성

 

CREATE SEQUENCE CONSUMER_NO
INCREMENT BY 1 
START WITH 1 
MAXVALUE 99999999
MINVALUE 1;

 

 

 

주문테이블에 주문번호(시퀀스사용), 고객번호, 도서번호, 주문일자, 주문금액을 추가한다.

 

CREATE TABLE ORDERS(
    ORDER_NO INTEGER NOT NULL,
    CONSUMER_NO INTEGER,
    BOOK_NO INTEGER,
    ORDER_DAY DATE  NOT NULL,
    ORDER_PRICE INTEGER  NOT NULL,
    CONSTRAINT FK_ORDERS_CONSUMER FOREIGN KEY(CONSUMER_NO)
        REFERENCES CONSUMER(CONSUMER_NO),
    CONSTRAINT FK_ORDERS_BOOK FOREIGN KEY(BOOK_NO)
        REFERENCES BOOK(BOOK_NO)
);

 

 

 

주문번호 시퀀스 생성

 

CREATE SEQUENCE ORDER_NO
INCREMENT BY 1 
START WITH 1 
MAXVALUE 99999999
MINVALUE 1;

 

 

 

도서상품을 3가지 등록한다.

 

INSERT INTO book VALUES(1,'하루10분 SQL', '위키북스', 24000);

INSERT INTO book VALUES(2,'JAVA의 정석', '도우', 31000);

INSERT INTO book VALUES(3,'모던웹을 위한 HTML+CSS 바이블', '한빛', 32000);

 

 

 

고객은 2명 등록한다.

 

INSERT INTO consumer VALUES( CONSUMER_NO.nextval, '일고객', '서울시 강동구', '010-1234-5678');

INSERT INTO consumer VALUES( CONSUMER_NO.nextval, '이고객', '서울시 강서구, '010-5678-1234');

 

 

주문에 2건이상 등록한다.

 

INSERT INTO orders VALUES(ORDER_NO.nextval, 1, 3, SYSDATE, 32000);

INSERT INTO orders VALUES(ORDER_NO.nextval, 2, 1, SYSDATE, 24000);

 

 

문제1) EMPLOYEES 테이블에서 20번 부서의 세부 사항을 포함하는 EMP_20 VIEW를 생성 하라

 

hr 스키마

CREATE OR REPLACE VIEW EMP_20
AS
SELECT *
FROM employees
WHERE department_id = 20;

 

 

문제2) EMPLOYEES 테이블에서 30번 부서만 EMPLOYEE_ID 를 emp_no 로 LAST_NAME을 name으로 SALARY를 sal로 바꾸어 EMP_30 VIEW를 생성하라.

 

CREATE OR REPLACE VIEW EMP_30
AS
SELECT ememployee_id emp_no, last_name name, salary sal
FROM employees
WHERE department_id = 30;

 

 

문제3) 부서별로 부서명,최소 급여,최대 급여,부서의 평균 급여를 포함하는 DEPT_SUM VIEW을 생성하여라.

 

CREATE OR REPLACE VIEW DEPT_SUM(부서명, 최소급여, 최대급여, 평균급여)
as
SELECT department_name, MIN(salary), MAX(salary), ROUND(AVG(salary))
FROM employees e, departments d 
WHERE e.department_id = d.department_id
GROUP BY department_name;

 

 

문제4) 앞에서 생성한 EMP_20,EMP_30 VIEW을 삭제하여라.

 

DROP VIEW EMP_20;
DROP VIEW EMP_30;

 

 

 

+ Recent posts