코딩테스트

[26.01.28 코테(Python/MySQL/Oracle)]-K번째 수&오랜 기간 보호한 동물(1)

지니248 2026. 1. 28. 15:39

Lv1. K번째 수 (Python)

링크: https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

내가 작성한 코드

def solution(array, commands):
    answer = []
    
    for i, j, k in commands:
        sub = array[i-1 : j] # i는 1부터 세는 번호이므로 인덱스로 바꾸기 위해 i-1을 사용 (파이썬은 0부터 셈)
        sub_sorted = sorted(sub) # 잘라낸 sub 리스트를 오름차순으로 정렬
        answer.append(sub_sorted[k-1]) # 정렬된 리스트에서 k번째 값을 선택. k는 1부터 세는 번호이므로 인덱스로 바꾸기 위해 k-1 사용
        
    return answer

 

새로 배운 코드

def solution(array, commands):
    return list(
        map( # map의 결과를 list로 변환
            lambda x: 
            # lambda x: x는 commands 안에 들어있는 하나의 명령 [i, j, k]
            
            sorted(array[x[0]-1 : x[1]])[x[2]-1],
            # x[0] = i(i번째), x[1] = j(j번째)
            # i는 1부터 세는 번호이므로 인덱스로 바꾸기 위해 x[0]-1 사용
            # 잘라낸 리스트를 오름차순으로 정렬
            
            
            # x[2] = k(k번째 값)
            # k는 1부터 세는 번호이므로 인덱스로 바꾸기 위해 k-1 사용
            
            commands)) # commands 리스트의 각 원소를 하나씩 lambda 함수에 전달

Lv3. 오랜 기간 보호한 동물(1) (MySQL)

링크: https://school.programmers.co.kr/learn/courses/30/lessons/59044?language=mysql

 

내가 작성한 코드

-- 풀이1 (LEFT JOIN + IS NULL)
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 ASC
LIMIT 3;

-- 풀이2 (NOT EXISTS)
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
WHERE NOT EXISTS(SELECT 1 -- 조건을 만족하는 행이 있으면 그냥 1 이라는 값 반환
                 FROM ANIMAL_OUTS O
                 WHERE O.ANIMAL_ID = I.ANIMAL_ID)
ORDER BY I.DATETIME
LIMIT 3;

 

EXISTS / NOT EXISTS

  • 값이 아닌 행 존재 여부만 파악
  • EXISTS(서브쿼리) : 조건을 만족하는 행이 하나라도 있으면 True
  • NOT EXISTS(서브쿼리) : 조건을 만족하는 행이 하나도 없으면 True

 

Orcale

-- 풀이1 (FETCH)
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 ASC
FETCH FIRST 3 ROWS ONLY

-- 풀이2 (NOT EXISTS + FETCH)
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
WHERE NOT EXISTS(SELECT 1
                 FROM ANIMAL_OUTS O
                 WHERE I.ANIMAL_ID = O.ANIMAL_ID)
ORDER BY I.DATETIME
FETCH FIRST 3 ROWS ONLY

-- 풀이3 (ROWNUM)
SELECT NAME, DATETIME
FROM (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 ASC) T -- 별칭 붙이면 안전함
WHERE ROWNUM <= 3
ORDER BY T.DATETIME