점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한사항
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
입출력 예
nlostreservereturn
5
[2, 4]
[1, 3, 5]
5
5
[2, 4]
[3]
4
3
[3]
[1]
2
입출력 예 설명
예제 #1 1번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
예제 #2 3번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
번호가 작은 (잃어버린) 학생에게 여벌 체육복을 선지급해준다.(일단 잃어버렸으니까 뒤에 사람 생각하지 않고 그냥 빌려주는 개념이다.)
이렇게 풀면 뒤에 사람이 필요한데 못받는 경우가 있을 수도 있지만,
이 문제에서는 가중치 값이 없고 그냥 몇명이 체육활동을 할 수 있는지만 확인하면 되기 때문에
앞 사람이 받든지, 뒷 사람이 받든지 결과값을 항상 동일하다.
def solution(n, lost, reserve):
answer = n - len(lost)
for i in lost:
# 여벌옷 가져온 학생이 도난당했다면
if i in reserve:
answer += 1
reserve.remove(i)
continue
# 앞 친구에게 먼저 빌리기
if i-1 in reserve:
answer += 1
reserve.remove(i-1)
continue
# 도난당하지 '않은' 뒤 친구에게 빌리기
if i+1 in reserve and i+1 not in lost:
answer += 1
reserve.remove(i+1)
return answer
(모든 레코드 조회하기) 1번 문제는 ANIMAL_INS 테이블의 모든 정보를 순차적으로 출력하는 문제이다.
! 역순으로 출력 이란 의미는 내림차순을 의미한다. ORDER BY ANIMAL_ID DESC 에서 DESC 명령어를 통해 적용 가능.
정답
-- 코드를 입력하세요
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
(역순 정렬하기) 2번 문제는 ANIMAL_INS 테이블 정보 중 일부만 출력하는 문제이다. 마찬가지로 ORDER BY 를 사용하였다.
정답
-- 코드를 입력하세요
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
(아픈 동물 찾기) 3번 문제는 ANIMAL_INS 테이블 정보 중 특정 조건을 만족하는 정보만 출력하는 문제이다. WHERE 절을 사용한다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
(어린 동물 찾기) 4번 문제는 ANIMAL_INS 테이블 정보 중 3번과 동일하게 특정 조건을 만족하는 정보만 출력하는 문제이다.
<> 명령어를 사용하였다. <=> 같지않다(!=) 의미
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION <> "Aged"
(동물의 아이디와 이름) 5번 문제는 일부 정보만 조회하는 문제이다. ORDER BY 를 사용하였다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
(여러 기준으로 정렬하기) 6번 문제는 일부 정보만 조회하되, ORDER BY를 여러 Coloumn에 적용하는 문제이다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
(상위 n개 레코드) 7번 문제는 LIMIT 를 사용하여 TOP N 을 출력하는 문제이다.
정답
-- 코드를 입력하세요
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
(최댓값 구하기) 8번 문제는 가장 최근에 들어온 동물의 정보를 조회하는 문제이다.
LIMIT 혹은 MAX를 사용하여 풀 수 있다.
정답
-- 코드를 입력하세요
SELECT MAX(DATETIME)
FROM ANIMAL_INS
ORDER BY DATETIME
or
-- 코드를 입력하세요
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1
(최솟값 구하기) 9번 문제는 가장 빨리 들어온 동물의 정보이므로 8번과 반대되는 문제이다.
LIMIT 혹은 MIN을 사용하여 풀 수 있다.
정답
-- 코드를 입력하세요
SELECT MIN(DATETIME)
FROM ANIMAL_INS
(동물 수 구하기) 10번 문제는 ANIMAL_INS 테이블에 있는 모든 row들의 갯수를 세는 문제이다.
COUNT 함수를 사용하면 된다.
정답
-- 코드를 입력하세요
SELECT count(*)
FROM ANIMAL_INS
(중복 제거하기) 11번 문제는 ANIMAL_INS 테이블의 동물 이름을 중복, NULL 값 제외하여 갯수를 세는 문제이다.
NULL에 대한 조건을 걸어줄 때는 = 연산자가 아니라 IS NOT NULL / IS NULL 이렇게 걸어준다.
정답
-- 코드를 입력하세요
SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
(고양이와 개는 몇 마리 있을까) 12번 문제는 ANIMAL_INS 테이블에서 개와 고양이의 갯수를 세는 문제이다.
IN 연산자는 해당 리스트에 속해있는지 아닌지를 묻는 경우 사용한다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_TYPE, count(*)
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat','Dog')
GROUP BY ANIMAL_TYPE
(동명 동물 수 찾기) 13번 문제는 ANIMAL_INS 테이블에서 GROUP BY 절을 활용하여 공통된 이름의 개수를 세는 문제이다.
서브쿼리를 사용하여 문제를 해결한다.
AS 명령어를 통해 별칭을 주어 사용한다.
정답
-- 코드를 입력하세요
SELECT NAME, CNT as COUNT
FROM(SELECT NAME, COUNT(*) AS CNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME) A
WHERE CNT >= 2
ORDER BY NAME
(입양 시각 구하기 1) 14번 문제는 ANIMAL_OUTS에서 CASE WHEN 문을 통해 조건을 주고 정보를 출력해주는 문제이다.
(CASE WHEN 조건 1 THEN 조건 1 결과 WHEN 조건 2 THEN 조건 2 결과 ELSE 그 외 결과 END)
정답
-- 코드를 입력하세요
SELECT (CASE WHEN SUBSTR(DATETIME,12,2) < 10 THEN SUBSTR(DATETIME,13,1) ELSE SUBSTR(DATETIME,12,2) END) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE SUBSTR(DATETIME,12,2) > 8 AND SUBSTR(DATETIME,12,2) < 20
GROUP BY SUBSTR(DATETIME,12,2)
ORDER BY SUBSTR(DATETIME,12,2)
(입양 시각 구하기 2) 15번 문제는 ANIMAL_OUTS에 있지 않은 시간 데이터를 임의로 만들어서 OUTER JOIN 해주어야 하는 문제이다.
set @a := -1 <=> a에 -1을 대입한다.
SELECT @a:=@a+1 자기 자신에 1을 더해주면 24 가 도달할 때까지 반복한다.
두 테이블을 OUTER JOIN 해준다.
정답
-- 코드를 입력하세요
set @a := -1;
SELECT HOUR, IFNULL(COUNT,0)
FROM(SELECT HOUR(DATETIME) AS HOUR1, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)) real_table RIGHT JOIN (SELECT *
FROM (SELECT @a:=@a+1 as HOUR FROM ANIMAL_OUTS) A
WHERE A.HOUR >= 0 AND A.HOUR < 24) total_table ON real_table.HOUR1 = total_table.HOUR
(이름이 없는 동물의 아이디) 16번 문제는 ANIMAL_INS에서 이름이 없는 정보를 조회하는 WHERE 절을 사용하는 간단한 쿼리이다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
(이름이 있는 동물의 아이디) 17번 문제는 ANIMAL_INS에서 이름이 있는 정보를 조회하는 WHERE 절을 사용하는 간단한 쿼리이다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID
(Null 처리하기) 18번 문제는 ANIMAL_INS에서 이름이 없는 경우 No name이라고 출력해주는 Null 처리에 관한 문제이다.
IFNULL을 사용한다.
IFNULL(컬럼1,컬럼1이 NULL 값이면 보내줄 값)
정답
-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IFNULL(NAME,'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
(없어진 기록 찾기) 19번 문제는 ANIMAL_OUTS에는 있는데 ANIMAL_INS에는 없는 정보를 서브쿼리를 사용하여 푸는 문제이다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID
(있었는데요 없었습니다) 20번 문제는 ANIMAL_OUTS와 ANIMAL_INS 두 테이블에서 모두 조회를 해야하는 문제이다.
FROM 절에 2개의 테이블이 들어간다.
정답
-- 코드를 입력하세요
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS, ANIMAL_INS INS
WHERE OUTS.ANIMAL_ID = INS.ANIMAL_ID AND OUTS.DATETIME < INS.DATETIME
ORDER BY INS.DATETIME
(오랜 기간 보호한 동물 1) 21번 문제는 ANIMAL_INS에 있는 정보 중, ANIMAL_OUTS에는 없는 정보를 추출하는 문제이다.
사용한 명령어: LIMIT, 서브쿼리
정답
-- 코드를 입력하세요
SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3
(보호소에서 중성화한 동물) 22번 문제는 LIKE 명령어를 사용하는 문제이다.
OUTS.SEX_UPON_OUTCOME LIKE '%blabla%'
의 의미는 해당 OUTS.SEX_UPON_OUTCOME이 blabla라는 글자를 가지고 있는지를 물어보는 조건이다.
정답
-- 코드를 입력하세요
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS INS, ANIMAL_OUTS OUTS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID AND (INS.SEX_UPON_INTAKE LIKE '%Intact%' AND (OUTS.SEX_UPON_OUTCOME LIKE '%Spayed%' OR OUTS.SEX_UPON_OUTCOME LIKE '%Neutered%'))
ORDER BY INS.ANIMAL_ID
(루시와 엘라 찾기) 23번 문제는 IN 조건식을 사용하는 문제이다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella','Pickle','Rogan','Sabrina','Mitty')
ORDER BY ANIMAL_ID
(이름에 el이 들어가는 동물 찾기) 24번 문제는 LIKE를 사용하여 문자열 포함여부를 확인하는 문제이다
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%el%'
ORDER BY NAME
(중성화 여부 파악하기) 25번 문제는 SELECT 절에 CASE WHEN 문을 사용해서 조건식에 따른 정보를 추출해주는 문제입니다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, CASE WHEN (SEX_UPON_INTAKE LIKE '%Neutered%' OR SEX_UPON_INTAKE LIKE '%Spayed%') THEN 'O' ELSE 'X' END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
(오랜 기간 보호한 동물 2) 26번 문제는 FROM 절에 2개의 테이블을 가져와서 각 테이블의 데이터를 찾아서 푸는 문제이다.
LIMIT 사용
정답
-- 코드를 입력하세요
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS, ANIMAL_INS INS
WHERE INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY INS.DATETIME - OUTS.DATETIME
LIMIT 2
(DATETIME에서 DATE로 형 변환) 27번 문제는 DATETIME 자료형을 DATE라는 함수를 통해 날짜만 가져와서 푸는 문제이다.
DATETIME 관련 함수로는 HOUR, DAY, MINUTE, DATE 등이 있다.
정답
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, SUBSTR(DATE(DATETIME),1,10) AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
곧 시간을 내서 DB를 직접 설계하고 운영하는 프로젝트도 해봐야겠다.
특히 내가 가고자 하는 직군이 빅데이터 엔지니어 직군인데,
요즘에 빅데이터 엔지니어 채용 직무에 NoSQL을 사용 경험이 많이 보여서 한번 직접 해봐야겠다.
def solution(answers):
supo1 = 0
supo2 = 0
supo3 = 0
# 1번 수포자의 변수
supo1_arr = [1,2,3,4,5]
# 2번 수포자의 변수
supo2_arr = [2,1,2,3,2,4,2,5]
# 3번 수포자의 변수
supo3_arr = [3,3,1,1,2,2,4,4,5,5]
for i in range(len(answers)):
# 1번 수포자의 채점
if answers[i] == supo1_arr[i%5]:
supo1 += 1
# 2번 수포자의 채점
if answers[i] == supo2_arr[i%8]:
supo2 += 1
# 3번 수포자의 채점
if answers[i] == supo3_arr[i%10]:
supo3 += 1
# dict()으로 정렬해서 가장 큰 점수 가져오기
max_value = {}
max_value[1] = supo1
max_value[2] = supo2
max_value[3] = supo3
# 정렬
max_value = sorted(max_value.items(), key=f1, reverse=True)
max_num = max_value[0][1]
# 가장 큰 값과 값이 비슷하면 result 배열에 넣어줌
result = []
for i,v in max_value:
if v == max_num:
result.append(i)
# result 반환
return result
def f1(x):
return x[1]
위의 *동명이인의 경우에는 Counter 자료형을 통해 풀어줄 수 있다고 한다.(Set 대신 Counter 사용)
def solution(participant, completion):
# 미완주자가 동명이인이 아닐 경우, 차집합으로 생각하기
complement = list(set(participant) - set(completion))
if len(complement) != 0:
return complement[0]
# 동명이인일 경우, 정렬하여 다른 시점에서 반환해주기(미완주자 1명이므로)
participant = sorted(participant)
completion = sorted(completion)
for i in range(len(participant)):
if participant[i] != completion[i]:
return participant[i]
answer = ''
return answer
나와 같은 방법으로 푸는 사람들도 많이 있었고,
Counter와, zip 이라는 클래스, 명령어를 사용해서 푸는 사람들도 있었다.(하단의 링크 참조)
-- 코드를 입력하세요
SELECT MAX(DATETIME)
FROM ANIMAL_INS
-- ORDER BY DATETIME
2번 문제
-- 코드를 입력하세요
SELECT MIN(DATETIME)
FROM ANIMAL_INS
3번 문제
-- 코드를 입력하세요
SELECT count(*)
FROM ANIMAL_INS
4번 문제
-- 코드를 입력하세요
SELECT COUNT(DISTINCT(NAME))
FROM ANIMAL_INS
5번 문제
-- 코드를 입력하세요
SELECT ANIMAL_TYPE, count(*)
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat','Dog')
GROUP BY ANIMAL_TYPE
6번 문제
-- 코드를 입력하세요
SELECT *
FROM (
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME) A
WHERE A.COUNT >= 2 AND A.NAME IS NOT NULL
ORDER BY A.NAME
7번 문제
-- 코드를 입력하세요
SELECT hour(DATETIME) HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY hour(DATETIME)
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY hour(DATETIME)
8번 문제
-- 코드를 입력하세요
set @a := -1;
SELECT HOUR, IFNULL(COUNT,0)
FROM(SELECT HOUR(DATETIME) AS HOUR1, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)) real_table RIGHT JOIN (SELECT *
FROM (SELECT @a:=@a+1 as HOUR FROM ANIMAL_OUTS) A
WHERE A.HOUR >= 0 AND A.HOUR < 24) total_table ON real_table.HOUR1 = total_table.HOUR