알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/challenges?tab=all_challenges 

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

Oracle Level 문제


Think🤔

상위 n개 레코드

여러 기준으로 정렬하기

동물의 아이디와 이름

어린 동물 찾기

아픈 동물 찾기

이름이 있는 동물의 아이디

역순 정렬하기

이름이 없는 동물의 아이디

최댓값 구하기

모든 레코드 조회하기


Solution✍
모든 동물 아이디와 이름,보호 시작일을 이름 순으로 조회
만약 이름이 같으면 보호를 나중에 시작한 동물

-- 코드를 입력하세요                         보호 시작일
SELECT ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION , NAME , SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY NAME, INTAKE_CONDITION DESC;


-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;

 

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;

MYSQL에서는 LIMIT 1이 있음 하지만 ORACLE에는 존재하지 않음


SELECT NAME
FROM ANIMAL_INS
WHERE ROWNUM = 1
ORDER BY DATETIME ASC;

SELECT A.NAME
FROM (SELECT *
      FROM ANIMAL_INS
      ORDER BY DATETIME) A
WHERE ROWNUM = 1;

인라인뷰 없이 생성되면 ROWNUM이 실행되고 그다음 ORDER BY 가 실행되서 ROWNUM의 값이 이상하게 나오는데 
프럼절에서 먼저 정렬을 해주고 그 NAME값을 ROWNUM 1로 찾으면 정렬 후 찾는거라 가능하다.
그냥 ID순으로 조회하는 문제

-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;

모든 레코드는 SELECT의 별칭에서 ===> *로 바꾸면 그만
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION LIKE 'Sick'
ORDER BY ANIMAL_ID;

아픈 동물 출력은 ID순으로!!
-- 코드를 입력하세요
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
동물 보호소에 있고, 이름이 있음 , ID 오름차순

-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;

이름이 널 이 아닌것
IS NOT NULL
그렇다면 <> NULL 이런건 될까?>

된다

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME <> 'NULL'
ORDER BY ANIMAL_ID;
-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;
-- 코드를 입력하세요
SELECT A.DATETIME AS 시간
FROM (SELECT *
     FROM ANIMAL_INS
     ORDER BY DATETIME DESC) A
WHERE ROWNUM = 1;

서브쿼리에서 ';' 사용하면 안됨

Review🤩

LIMIT 대신 ROWNUM으로 처리하는 부분이 많아서 부족한 점을 배웠다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12926

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr


Think🤔

AB에서 1밀면 BC
ABCDE
AB에서 3밀면
DE가 됨
마지막 z에서 밀면 a가 됨

1밀면 BC
2밀면 CD
3밀면 DE

122
65
57

대문자 A~Z 65~90
소문자 a~z  97~122
공백은 공백 그대로..

각 문자들이 숫자에 영향을 받는다 

6 7 8 10 12


Solution✍
class Solution {
    public String solution(String s, int n) {
        String answer = "";
        
        char[] ch = s.toCharArray();
        
        for(char c : ch){
            if(c == ' '){ // 공백일 시 넘어감
                answer+=" ";
                continue;
            }else{
                char temp = (char)(c+n);
                
                if(temp > 122 && c <= 122){
                    answer += (char)(temp-26);
                }else if(temp > 90 && temp < 97 || temp > 90 && c <= 90 ){
                    answer += (char)(temp-26);
                }else{
                    answer += temp;
                }
            }
        }
        
        return answer;
    }
}

Review🤩

소문자는 소문자 , 대문자는 대문자 if else if문이 중요하다는것을 알게됨.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12921

 

코딩테스트 연습 - 소수 찾기

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요. 소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다. (1은 소수가 아닙니다.) 제한 조건 n은 2이상

programmers.co.kr


Think🤔
class Solution {
    public int solution(int n) {
        int answer = 0;
        
        
        for(int i=2; i<=n; i++){
            int cham = 0;
            for(int j=2; j<=i; j++){
                if(i % j == 0){
                    cham++;
                }
            }
            if(cham == 1){
                answer++;
            }
        }
        
        return answer;
    }
}

계속해서 반복문을 두개 돌아서 숫자가 엄청 커졌을 때, 시간 초과가 뜬다.

 

1. 처음 방법, 전체를 돌리면서 전체 돌리는 숫자가 소수인지 판별하기 위해서 나눠서 1이상이면 소수라고 판별
==== > 해당방법 시간 초과
2. 두번째 방법으로 제곱근 까지만 반복문을 돌린다 어차피 자연수 n이 소수이기 위한 조건은 n의 제곱근 보다
작은 소수로도 나눠지지 않는 방법을 생각한다.
3. 세번째 방법 에라토스테네스의 체 
전체 갯수가 120이면 2의 배수를 다지운다 3의 배수를 다 지운다 5의 배수를 다 지운다 7의 배수를 다 지우면
모든 소수의 배수를 다 지우기 때문에 이러면 남는 수는 소수밖에 없다.


Solution✍
import java.util.*;

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        
        for(int i=2; i<=n; i++){
            int cham = 0;
            for(int j=2; j<=Math.sqrt(i); j++){
                if(i % j == 0){
                    cham++;
                    break;
                }
            }
            if(cham == 0){
                answer++;
            }
        }
        
        return answer;
    }
}
class Solution {
    public int solution(int n) {
        int answer = 0;
        int[] arr = new int[n+1];
        arr[0] = 0; arr[1] = 0;
        
        // 각 자리 수를 배열에다가 저장시킴
        for(int i=2; i<=n; i++){
            arr[i] = i;
        }
        
        for(int i=2; i<=n; i++){
            if(arr[i] == 0){ // 만약 0이면 건너뛴다.
                continue;
            }
            //j는 자기 자신의 값을 더해서 배수를 빼준다
            for(int j=2*i; j<=n; j=j+i){ 
                arr[j] = 0;
            }
        }
        
        // 반복문을 이용해서 0이 아닌 값을 찾는다.
        for(int i=0; i<=n; i++){
            if(arr[i] != 0){
                answer++;
            }
        }
        
        return answer;
    }
}

Review🤩

배열을 이용해서 새롭게 풀 수 있었다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12916

 

코딩테스트 연습 - 문자열 내 p와 y의 개수

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를

programmers.co.kr


Think🤔

파라미터로 받은 s에서 'p'와 'y' 의 개수가 같으면 true 다르면 false
그러면 p를 세는 int와 y를 세는 int를 만들어 준다.


Solution✍
class Solution {
    boolean solution(String s) {
        boolean answer = true;
        int pL = 0;
        int yL = 0;
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) == 'p' || s.charAt(i) == 'P'){
                pL++;
            }else if(s.charAt(i) == 'y' || s.charAt(i) == 'Y'){
                yL++;
            }
        }
        
        return (pL == yL ? true : false);
    }
}

Review🤩

다른 사람 코드를 보니 처음에 바로 소문자로 바꿔버리고 'p'이면 더해주고, 'y'이면 빼주는 방법이 있었다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12930

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr


Think🤔

짝수번째 알파벳은 대문자
홀수번쨰 알파벳은 소문자
공백기준

length()로 해야함 글자수는 length; 로 할려해서 오류
str[i].length; X --> str[i].length();


Solution✍
class Solution {
    public String solution(String s) {
        String answer = "";
        String[] str = s.split(""); 
        int idx = 0;
        
        for(int i=0; i<str.length; i++){ 
            if(str[i].equals(" ")){
                answer+=" ";
                idx = 0;
            }else if(idx % 2 == 0){
                answer+=str[i].toUpperCase();
                idx++;
            }else{
                answer+=str[i].toLowerCase();
                idx++;
            }
        }
        return answer;
    }
}

Review🤩

공백 " "는 equals로 비교해야한다. 


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://programmers.co.kr/learn/courses/30/lessons/12928?language=java 

 

코딩테스트 연습 - 약수의 합

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요. 제한 사항 n은 0 이상 3000이하인 정수입니다. 입출력 예 n return 12 28 5 6 입출력 예 설명 입출력 예 #1 12의 약수

programmers.co.kr


Think🤔

n의 모든 약수를 더해주는 문제
반복문으로 n만큼 돌려주고 이와 약수이면 더해서 결과를 출력한다.


Solution✍
class Solution {
    public int solution(int n) {
        
        int answer = 0;
        for(int i=1; i<=n; i++){
            if(n % i == 0){
                answer+=i;
                continue;
            }
        }
        
        return answer;
    }
}

Review🤩

0으로 나누게 되면 Exception이 발생!


 

+ Recent posts