티스토리 뷰

라이브 세션) Python 기초 강의 6일차 - 문풀날 [리스트, 튜플, 딕셔너리]

필수예제 1

리스트 nums = [10, 20, 30, 40, 50] 가 있습니다.

  1. 마지막 값을 출력하세요.
  2. 마지막 값을 999로 바꾸고, 바뀐 리스트 전체를 출력하세요.
# 문제 1

nums = [10, 20, 30, 40, 50]

print(nums[-1])

nums[-1] = 999
print(nums)

코드 실행 결과

 

필수예제 2

튜플 t = (1, 2, 3, 4, 5)가 있습니다.

  1. t의 길이를 출력하세요.
  2. t의 1번 인덱스부터 3번 인덱스 전까지 슬라이싱한 결과를 출력하세요.
# 문제 2

t = (1, 2, 3, 4, 5)

print(len(t))

print(t[1:3])

코드 실행 결과

 

필수예제 3

딕셔너리 student = {"name": "Kim", "age": 20, "major": "CS"} 가 있습니다.

  1. "name"의 값을 출력하세요.
  2. "age" 값을 21로 변경한 뒤, student 전체를 출력하세요.
# 문제 3

student = {"name": "Kim", "age": 20, "major": "CS"}

print(student["name"])
student["age"] = 21

print(student)

코드 실행 결과

 

필수예제 4

리스트 a = [1, 2, 3], b = [4, 5]가 있습니다.

  1. a에 b의 모든 원소를 이어붙인 새로운 리스트 c를 만들고 출력하세요.
  2. a 자체는 변경되지 않도록 만드세요.
# 문제 4
a = [1, 2, 3]
b = [4, 5]


c = a + b
print(c)

코드 실행 결과

 

필수예제 5

다음 리스트에서 짝수만 골라 새로운 리스트를 만들어 출력하세요.

nums = [3, 10, 7, 8, 2, 9, 12]

# 문제 5

nums = [3, 10, 7, 8, 2, 9, 12]
nums.sort()

even_nums = []

for i in nums:
  if i % 2 == 0 :
    even_nums += [i]
print(even_nums)

코드 실행 결과


필수예제 6

다음 코드의 출력 결과를 예측하세요.

# 문제 6

a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)

코드 실행 결과

 

필수예제 7

다음 코드의 출력 결과를 예측하세요.

# 문제 7

a = [1, 2, 3]
b = a[:]
b.append(4)
print(a)
print(b)

코드 실행 결과

 

필수예제 8번

다음 코드의 출력 결과를 예측하세요.

# 문제 8

t = (1, 2, 3)
t = t + (4,)
print(t)

코드 실행 결과

 

필수예제 9번

다음 코드의 출력 결과를 예측하세요.

# 문제 9

d = {"a": 1, "b": 2}
print(d.get("c"))
print(d.get("c", 0))

코드 실행 결과

 

필수예제 10번

다음 코드의 출력 결과를 예측하세요.

# 문제 10

d = {"x": [1, 2], "y": [3, 4]}
d["x"].append(99)
print(d)

코드 실행 결과


SQL 코드카타

Q66. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/164671

2. 정답 코드:

SELECT
    CONCAT("/home/grep/src/", f.BOARD_ID, "/", f.FILE_ID, FILE_NAME, FILE_EXT)
    AS FILE_PATH
FROM USED_GOODS_BOARD AS b
JOIN USED_GOODS_FILE AS f
  ON b.BOARD_ID = f.BOARD_ID
  AND b.VIEWS = (
                SELECT MAX(VIEWS)
                FROM USED_GOODS_BOARD  
                )
ORDER BY f.FILE_ID DESC;

# 서브쿼리를 조회수 MAX 값 찾을 때 사용

 

Q67. 주문량이 많은 아이스크림들 조회하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/133027

2. 정답 코드:

SELECT f.FLAVOR
FROM FIRST_HALF AS f
JOIN (SELECT
        FLAVOR,
        SUM(TOTAL_ORDER) AS NEW_TOTAL
      FROM JULY
      GROUP BY FLAVOR                  
     ) AS j
  ON f.FLAVOR = j.FLAVOR
GROUP BY f.FLAVOR
ORDER BY f.TOTAL_ORDER + j.NEW_TOTAL DESC
LIMIT 3;

3. 오류 상황: 오류 메시지는 발생하지 않고, 최종 결과와 유사하게 출력되는데 오답인 상황

4. 시도 방법: Gemini를 활용하여 뭐가 틀렸는지 간단한 힌트만 달라고 함

5. 최종 문제 해결 방법: 서브쿼리 쓰는데 위치를 잘못했음 → JOIN 테이블 조건 자체에 서브쿼리를 사용해서 NEW_TOTAL이라는 7월 테이블의 맛별 주문건수를 구하고, 상반기 테이블과 FLAVOR 기준으로 더해줌 (ORDER BY 조건으로!)

근데 여기서 이미 JOIN 할 때 서브쿼리에서 GROUP BY FLAVOR 했기 때문에 본 쿼리에서는 GROUP BY 굳이 안해줘도 알아서 매칭 잘됨! 
그리고 ORDER BY 절에서 +로 컬럼 값 더해줄 때 보기 쉽게 괄호로 표시해주기
(f.TOTAL_ORDER + j.NEW_TOTAL) DESC 이런 식으로 하면 더 좋음

 

Q68. 저자 별 카테고리 별 매출액 집계하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/144856

2. 정답 코드:

SELECT
    b.AUTHOR_ID,
    a.AUTHOR_NAME,
    b.CATEGORY,
    SUM(s.SALES * b.PRICE) AS TOTAL_SALES
FROM BOOK_SALES AS s
JOIN BOOK AS b
  ON s.BOOK_ID = b.BOOK_ID
JOIN AUTHOR AS a
  ON b.AUTHOR_ID = a.AUTHOR_ID
  AND SUBSTR(s.SALES_DATE, 1, 7) = "2022-01" 
GROUP BY b.AUTHOR_ID, b.CATEGORY
ORDER BY b.AUTHOR_ID ASC, b.CATEGORY DESC;
TOTAL_SALES 구할 때 맨 앞에 SUM 사용하는거 잊지 않기!

 

Q69. 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/151139

2. 정답 코드:

SELECT
    MONTH(START_DATE) AS MONTH,
    CAR_ID,
    COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE SUBSTR(START_DATE, 1, 7) >= '2022-08'
  AND SUBSTR(START_DATE, 1, 7) <= '2022-10'
  AND CAR_ID IN (
                SELECT CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                WHERE SUBSTR(START_DATE, 1, 7) >= '2022-08'
                  AND SUBSTR(START_DATE, 1, 7) <= '2022-10'
                GROUP BY CAR_ID
                HAVING COUNT(CAR_ID) >= 5)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC;

# 서브쿼리에도 START_DATE가 2022-08 ~ 2022-10 조건 넣어줌

 

3. 오류 상황: 오류 메시지는 발생하지 않고, 최종 결과와 유사하게 출력되는데 오답인 상황

4. 시도 방법: Gemini를 활용하여 뭐가 틀렸는지 간단한 힌트만 달라고 함

5. 최종 문제 해결 방법: 본 쿼리에 START_DATE 조건을 넣어줘서 알아서 필터링 될거라고 생각했는데, 여기서는 서브쿼리에도 START_DATE 조건을 똑같이 넣어줘야 해당 조건을 만족하는 CAR_ID만 추출됨!

SELECT
    MONTH(START_DATE) AS MONTH,
    CAR_ID,
    COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE SUBSTR(START_DATE, 1, 7) >= '2022-08'
  AND SUBSTR(START_DATE, 1, 7) <= '2022-10'
  AND CAR_ID IN (
                SELECT CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                GROUP BY CAR_ID
                HAVING COUNT(CAR_ID) >= 5)
GROUP BY MONTH(START_DATE), CAR_ID
ORDER BY MONTH ASC, CAR_ID DESC;

# 기존에 작성했던 쿼리


생성형 AI 답변 내용)

1. 서브쿼리에 날짜 조건이 없다면? (잘못된 명단 추출)

서브쿼리는 '누가 단골인가?'라는 명단을 만드는 역할을 합니다.

  • 날짜 조건이 없으면: 1년 전체를 뒤져서 5번 넘게 온 손님 명단을 가져옵니다.
  • 결과: 1월에 10번 오고 8~10월에는 1번만 온 손님도 '단골 명단'에 포함되어 버립니다. (우리는 8~10월에 자주 온 사람이 궁금한데 말이죠!)

2. 본쿼리에 날짜 조건이 없다면? (불필요한 기록 출력)

본쿼리는 '뽑힌 손님들의 기록을 장부에 적는' 역할을 합니다.

  • 날짜 조건이 없으면: 서브쿼리가 제대로 단골을 뽑아왔더라도, 그 단골이 1월, 5월, 12월에 방문한 기록까지 몽땅 장부에 적게 됩니다.
  • 결과: 8~10월 기록만 보고 싶은데 다른 달의 기록까지 섞여서 출력됩니다.

 

Q70. 그룹별 조건에 맞는 식당 목록 출력하기

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131124

2. 정답 코드:

SELECT
    m.MEMBER_NAME,
    r.REVIEW_TEXT,
    SUBSTR(r.REVIEW_DATE, 1, 10) AS REVIEW_DATE
FROM MEMBER_PROFILE AS m
JOIN REST_REVIEW AS r
  ON m.MEMBER_ID = r.MEMBER_ID
WHERE m.MEMBER_ID = (
                    SELECT MEMBER_ID
                    FROM REST_REVIEW
                    GROUP BY MEMBER_ID
                    ORDER BY COUNT(REVIEW_ID) DESC
                    LIMIT 1
                   )
ORDER BY r.REVIEW_DATE, r.REVIEW_TEXT;

# 정답 쿼리, ON 조건은 연결키에 대해서만 주고, WHERE 절에서 리뷰 최다 작성자 조건을 줌

정답 쿼리 결과

SELECT
    m.MEMBER_NAME,
    r.REVIEW_TEXT,
    SUBSTR(r.REVIEW_DATE, 1, 10) AS REVIEW_DATE
FROM MEMBER_PROFILE AS m
JOIN REST_REVIEW AS r
  ON m.MEMBER_ID = (
                    SELECT MEMBER_ID
                    FROM REST_REVIEW
                    GROUP BY MEMBER_ID
                    ORDER BY COUNT(REVIEW_ID) DESC
                    LIMIT 1
                   )
ORDER BY r.REVIEW_DATE, r.REVIEW_TEXT;

# 기존에 작성했던 쿼리, ON 조건에서 리뷰를 가장 많이 작성한 사람에 대한 조건을 줌

기존 쿼리 결과

 

3. 오류 상황: 오류 메시지는 발생하지 않고, 최종 결과와 유사하게 출력되는데 오답인 상황

4. 시도 방법: Gemini를 활용하여 뭐가 틀렸는지 간단한 힌트만 달라고 함

5. 최종 문제 해결 방법: 정답 쿼리는 기존에 작성했던 쿼리 결과와 비교했을 때 같은 사람이 나왔지만 리뷰 갯수가 훨씬 많았다. 서브쿼리 처리 과정에서 이상한 데이터들이 다 "김민재"라는 MEMBER_NAME에 들어가 있었기 때문이다. 이런 상황을 피하기 위해서는 JOIN 할 때 ON 조건은 연결키만 주고, 나머지는 WHERE 절에서 줘야 한다!


생성형 AI 답변 내용)

1. 첫 번째 쿼리: 표준적인 필터링 (정답 버전)

FROM MEMBER_PROFILE AS m
JOIN REST_REVIEW AS r ON m.MEMBER_ID = r.MEMBER_ID
WHERE m.MEMBER_ID = (서브쿼리)
  • 작동 방식: 먼저 두 테이블을 MEMBER_ID 기준으로 전부 합칩니다(JOIN). 그 결과물(전체 리뷰 명단) 위에서 WHERE 절을 통해 "리뷰 왕의 ID가 아닌 데이터"를 가차 없이 버립니다(Filter).
  • 결과: 정확히 '리뷰 왕' 한 명의 리뷰 데이터만 남게 됩니다.

2. 두 번째 쿼리: 비정상적인 조인 (오답 버전)

FROM MEMBER_PROFILE AS m
JOIN REST_REVIEW AS r ON m.MEMBER_ID = (서브쿼리)
  • 작동 방식: 이 쿼리는 r.MEMBER_ID와 m.MEMBER_ID를 연결하는 고리가 없습니다. 대신 "모든 r.REVIEW_TEXT를 '리뷰 왕' 한 명의 이름 옆에 붙여라"라는 식으로 작동할 위험이 큽니다.
  • 데이터가 늘어났던 이유: r.MEMBER_ID가 누구든 상관없이 m.MEMBER_ID가 '리뷰 왕'이기만 하면 무조건 연결(JOIN)해버렸기 때문입니다. 즉, 다른 사람이 쓴 리뷰까지 전부 '리뷰 왕'이 쓴 것처럼 복사되어 출력된 것입니다.

점점 코드카타 문제가 어려워지고 있다.
한 번에 해결할 수 있는 문제가 많지 않고, 특히 어려움을 느끼는 서브쿼리 활용 문제가 늘어나는 것 같다.

파이썬을 학습하고 있지만, SQL에 대한 감각을 잃지 않기 위해 하루에 최소 3문제 이상은 꾸준히 풀어야겠다고 느꼈다.
또 파이썬 심화 문제에도 도전해봤지만, 아직 기본 개념이 완전히 잡히지 않아 많이 어렵게 느껴졌다.

지금 당장 모든 문제를 해결하려 하기보다는, 나만의 속도로 파이썬 기본기를 차근차근 쌓아가고 조금 더 익숙해졌을 때 심화 문제를 다시 돌아보며 정리하는 시간을 가져야겠다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함