문제:

풀이방법:

나갈 때 정보, 들어올 때의 정보가 둘 다 있는 테이블이 필요하므로 둘을 INNER JOIN을 하도록 한다. 그 뒤에 WHERE 절로 IN일 때는 Intact라는 단어를 포함하도록 하고, OUTS일 때는 Intact라는 단어가 없는 경우에 대해서만 출력하도록 했다.

1
2
SELECT I.ANIMAL_ID,I.ANIMAL_TYPE,I.NAME FROM ANIMAL_INS I, ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID
AND I.SEX_UPON_INTAKE LIKE '%Intact%' AND O.SEX_UPON_OUTCOME NOT LIKE '%Intact%' ORDER BY i.ANIMAL_ID;
cs

문제링크:

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

문제:

풀이방법:

NULL이 필요한 문제가 아니므로 기본 조인인 INNER JOIN을 사용해도 상관이 없다. 따라서 두 테이블을 INNER JOIN 했다. 그 다음에 보호 기간이 가장 길었다는 것은 O.DATETIME과 I.DATETIME의 차이가 크다는 것이다. 따라서 이 연산을 ORDER BY에다가 DESC 조건을 넣어서 찾도록 한다.

1
2
SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I, ANIMAL_OUTS O WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY (O.DATETIME -I.DATETIME) DESC LIMIT 2;
cs

문제링크:

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

문제:

풀이방법:

조인을 통해서 NULL 값을 만들어야 한다면 LEFT JOIN이나 RIGHT JOIN을 써야 하는 것 같다. 따라서 '입양을 못 갔다' 라는 것은 INS에는 있지만 OUTS에는 없어야 하는 값들이다. 따라서 INS에 OUTS에 붙임으로써 입양을 못 간 동물들을 만들어 낸다. 이는 WHERE절로 O.ANIMAL_ID가 NULL인 값으로 찾을 수 있다. 그리고 3마리만 출력을 해야 하므로 LIMIT 3을 사용한다.

1
2
3
SELECT I.NAME,I.DATETIME FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE O.ANIMAL_ID is NULL
ORDER BY I.DATETIME LIMIT 3;
cs

문제링크:

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

문제:

풀이방법:

OUTS에 있는 값의 DATETIME과 INS의 DATETIME의 값 차이를 비교해야 하는 문제이다. 두 테이블에 공통된 값인 ANIMAL_ID으로 INNER JOIN을 한다. 조인을 한 뒤에 IN의 DATETIME이 OUTS의 DATETIME보다 큰 값을 찾아주도록 한다. 

1
2
SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_OUTS O, ANIMAL_INS I WHERE O.ANIMAL_ID=I.ANIMAL_ID AND
I.DATETIME > O.DATETIME ORDER BY I.DATETIME;
cs

문제링크:

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

문제:

풀이방법:

ANIMAL_OUTS에는 있지만 ANIMAL_INS에는 없는 값을 찾아야 하는 문제이다. 두 테이블이 있으므로 JOIN을 사용해서 풀어야 함을 알 수 있다. OUTS에만 있는 값을 찾아야 하므로 OUT을 기준으로 INS의 값을 합쳐주면 된다. 따라서 ANIMAL_OUTS O LEFT JOINT ANIMAL_INS I 를 사용해서 OUTS에 INS의 값이 붙게 된다. (ANIMAL_ID를 기준으로)

따라서 입양을 간 기록이 있지만 들어온 기록이 없는 동물들은 ANIMAL_INS의 ANIMAL_ID의 값이 NULL이 될 것이다. 따라서 WHERE절로 이 조건에 해당하는 O.ANIMAL_ID와 O.NAME을 출력하도록 한다.

1
2
SELECT O.ANIMAL_ID, O.NAME FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I  ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.ANIMAL_ID is NULL ORDER BY O.ANIMAL_ID;
cs

문제링크:

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

문제:

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

풀이 방법:

처음엔 title 함수를 사용하고자 했다. title은 문자열에서 각 단어의 첫단어를 대문자로 만드는 내장함수이다. 하지만 첫번째 입출력 예시와 같이 첫 문자가 숫자라면 그 다음 문자를 소문자로 유지해야 하지만 title은 대문자로 리턴을 해버린다.
그 이후로는 split 공백을 지우고 첫 단어만 대문자로 만든 뒤(숫자에도 upper 연산이 가능하다) 이를 배열에 담아 join으로 담으려고 했으나, 공백이 하나가 아닌 2개이상일 수도 있었다.
따라서 최종적으론 upper라는 bool 변수를 만들어서 공백을 만나면 True로 켜지고 upper연산을 하고 난 뒤에는 False로 꺼지게 하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def solution(s):
    s=s.lower()
    a=''
    upper=True
    for i in s:
        if upper:
            if i==" ":
                a+=i
                continue
            a+=i.upper()
            upper=False
        else:
            if i==" ":
                a+=i
                upper=True
            else:
                a+=i
    return a
cs


+ Recent posts