티스토리 뷰
라이브 세션) Python 기초 강의 6일차 - 문풀날 [리스트, 튜플, 딕셔너리]
필수예제 1번
리스트 nums = [10, 20, 30, 40, 50] 가 있습니다.
- 마지막 값을 출력하세요.
- 마지막 값을 999로 바꾸고, 바뀐 리스트 전체를 출력하세요.
# 문제 1
nums = [10, 20, 30, 40, 50]
print(nums[-1])
nums[-1] = 999
print(nums)

필수예제 2번
튜플 t = (1, 2, 3, 4, 5)가 있습니다.
- t의 길이를 출력하세요.
- 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"} 가 있습니다.
- "name"의 값을 출력하세요.
- "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]가 있습니다.
- a에 b의 모든 원소를 이어붙인 새로운 리스트 c를 만들고 출력하세요.
- 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문제 이상은 꾸준히 풀어야겠다고 느꼈다.
또 파이썬 심화 문제에도 도전해봤지만, 아직 기본 개념이 완전히 잡히지 않아 많이 어렵게 느껴졌다.
지금 당장 모든 문제를 해결하려 하기보다는, 나만의 속도로 파이썬 기본기를 차근차근 쌓아가고 조금 더 익숙해졌을 때 심화 문제를 다시 돌아보며 정리하는 시간을 가져야겠다.
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 15일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(7) (0) | 2026.01.13 |
|---|---|
| 14일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(6) (1) | 2026.01.12 |
| 13일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(5) (5) | 2026.01.09 |
| 12일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(4) (0) | 2026.01.08 |
| 11일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(3) (1) | 2026.01.07 |
- Total
- Today
- Yesterday
- 중학생코딩
- GoogleColab
- 비전공자코딩
- 머신러닝
- 코딩기초
- 텍스트분석
- 태블로
- 구글코랩
- github
- 코딩처음
- 내일배움캠프
- git
- 데이터시각화
- 판다스
- 코드카타
- SQL
- Til
- 데이터분석입문
- Tableau
- 파이썬입문
- 프로그래밍입문
- 파이썬
- 데이터분석
- Python
- 통계
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
