프로그래머스 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배열에 넣어준다.

+ Recent posts