티스토리 뷰
SQL 코드카타
Q51. 없어진 기록 찾기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59042
2. 정답 코드:
SELECT
o.ANIMAL_ID,
o.NAME
FROM ANIMAL_OUTS AS o
LEFT JOIN ANIMAL_INS AS i
ON o.ANIMAL_ID = i.ANIMAL_ID
WHERE i.ANIMAL_ID IS NULL
ORDER BY o.ANIMAL_ID;
Q52. 과일로 만든 아이스크림 고르기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/133025
2. 정답 코드:
SELECT f.FLAVOR
FROM FIRST_HALF AS f
JOIN ICECREAM_INFO AS i
ON f.FLAVOR = i.FLAVOR
WHERE f.TOTAL_ORDER > 3000
AND i.INGREDIENT_TYPE = 'fruit_based'
ORDER BY f.TOTAL_ORDER DESC;
Q53. 재구매가 일어난 상품과 회원 리스트 구하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/131536
2. 정답 코드:
SELECT
USER_ID,
PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC;
# GROUP BY로 정리하고 HAVING으로 중복된(COUNT(*)가 1을 넘는) 행 찾기
SELECT
USER_ID,
PRODUCT_ID
FROM ONLINE_SALE
ORDER BY USER_ID ASC, PRODUCT_ID DESC;
# 막히기 전까지 작성했던 내용
3. 오류 상황: 두가지 조건을 모두 만족하는 중복된 행을 찾는 방법을 잘 모르겠음
4. 시도 방법: Gemini를 활용하여 방법 찾아 봄
5. 최종 문제 해결 방법: GROUP BY 절을 이용해서 우선 USER_ID, PRODUCT_ID 별로 그룹을 만들고, 그 중에서 동일한 내용이 중복되는 = COUNT(*)를 했을 때 > 1 인 조건을 넣어서 중복된 행을 찾음
Q54. 최댓값 구하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59415
2. 정답 코드:
SELECT DATETIME AS TIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
Q55. 조건에 맞는 사용자 정보 조회하기
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/164670
2. 정답 코드:
SELECT
b.WRITER_ID,
u.NICKNAME,
CONCAT(u.CITY, " ", u.STREET_ADDRESS1, " ", u.STREET_ADDRESS2) AS 전체주소,
INSERT(INSERT(u.TLNO, 4, 0, "-"), 9, 0 ,"-") AS 전화번호
FROM USED_GOODS_BOARD AS b
JOIN USED_GOODS_USER AS u
ON b.WRITER_ID = u.USER_ID
GROUP BY b.WRITER_ID, u.NICKNAME
HAVING COUNT(*) >= 3
ORDER BY b.WRITER_ID DESC;
# CONCAT 함수 + INSERT 함수 중복 사용
3. 오류 상황: 텍스트끼리 붙이는 방법과 텍스트 중간에 원하는 구분자를 넣는 방법을 모름
4. 시도 방법: Gemini를 활용하여 방법 찾아 봄
5. 최종 문제 해결 방법: CONCAT 함수를 사용해서 전체주소 컬럼을 생성했고, INSERT 함수를 중복 사용해서 "-"를 2번 넣어 줌
CONCAT(문자열1, 문자열2, 문자열3, ...)
: 여러 개의 문자열을 하나로 합칠 때
INSERT(원본 텍스트, 시작 위치, 바꿀 길이, 삽입할 텍스트)
바꿀 길이를 0으로 설정하면 기존 글자를 삭제하지 않고 그 사이에 끼워넣기만 가능!
라이브 세션) Python 기초 강의 3일차 - 수업날 [조건문, 반복문]
0) 리스트
: 여러 개의 값을 순서대로 담아두는 상자
리스트_이름 = [값1, 값2, 값3]
- 값들은 쉼표(,)로 구분
- 숫자, 문자열 등 여러 종류의 값을 담을 수 있음
1) 조건문
: 만약 어떠한 조건이 참(True)이라면 해당 코드 블록을 실행하고, 그렇지 않으면 실행하지 않는다
if - elif - else 문
예시)
score = 85
if score >= 90:
print("A 학점")
elif score >= 80:
print("B 학점")
elif score >= 70:
print("C 학점")
else:
print("D 학점")
출력 : "B 학점"
복합 조건문
- 조건식에 논리 연산자(and, or, not)를 사용하면 하나 이상의 조건을 조합할 수 있음!
예시)
x = 7
if x > 0 and x < 10:
print("x는 0보다 크고 10보다 작습니다.") # 출력됨
if x < 0 or x > 5:
print("x는 0보다 작거나 5보다 큽니다.") # 출력됨 (x=7 > 5)
is_raining = False
if not is_raining:
print("비가 오지 않습니다.") # 출력: 비가 오지 않습니다.
if 안의 조건이 True이면 출력을 하는데, 애초에 is_raining이 False 이기 때문에 (not is_raining) 자체가 True가 되어 print 명령 수행!
pass 구문
- pass 구문은 그냥 지나가는거!
x = 10
if x > 0:
pass # 조건이 True지만 아무 동작도 하지 않음
else:
print("0 이하입니다.")
if문의 x > 0 조건을 만족하긴 했지만, pass 구문이 사용되었으므로 아무런 일도 일어나지 않는다
in / not in 연산자
- 리스트 안에 있는지 없는지 확인
fruits = ["apple", "banana", "cherry"]
if "apple" in fruits:
print("사과가 있습니다.") # 출력됨
if "orange" not in fruits:
print("오렌지가 없습니다.") # 출력됨
중첩 if문
age = 20
is_student = True
if age >= 18:
if is_student:
print("성인 학생입니다.")
else:
print("성인이지만 학생은 아닙니다.")
실습 문제 1 : 영화관 티켓 요금 계산
다음 규칙을 만족하도록 조건문을 작성하세요.
| 구분 | 나이 조건 | 티켓 요금 |
| 유아 | 0 – 6세 | 0원 (무료) |
| 청소년 | 7 – 18세 | 8 000원 |
| 성인 | 19 – 64세 | 12 000원 |
| 시니어 | 65세 이상 | 6 000원 |
- input()으로 관람객 나이(정수)를 입력받습니다.
- 위 표에 따라 요금을 계산해 "요금은 12000원입니다." 형식으로 출력하세요.
- 나이가 음수이거나 150세를 초과하면 "잘못된 나이입니다."를 출력하고 프로그램을 종료합니다.
#실습 문제 1
age = int(input('나이를 입력해주세요: '))
if age < 0 or age > 150 :
print('잘못된 나이입니다.')
elif age >= 65 :
print('요금은 6000원입니다.')
elif age > 18 :
print('요금은 12000원입니다.')
elif age > 6 :
print('요금은 8000원입니다.')
else :
print('요금은 0원(무료)입니다.')
# 역순으로 구하기
#실습 문제 1
age = int(input('나이를 입력해주세요: '))
if age < 0 or age > 150 :
print('잘못된 나이입니다.')
elif age <= 6 :
print('요금은 0원(무료)입니다.')
elif age <= 18 :
print('요금은 8000원입니다.')
elif age <= 64 :
print('요금은 12000원입니다.')
else :
print('요금은 6000원입니다.')
# 순서대로 구하기


실습 문제 2 : BMI 지수로 건강 상태 판정
- 사용자에게 몸무게(kg)와 키(cm)를 각각 입력받으세요.
- BMI 지수를 몸무게 / (키 m 단위²) 공식으로 계산합니다. ( 제곱 : 단위² → ** 2 )
| BMI | 판정 |
| 0 ≤ BMI < 18.5 | 저체중 |
| 18.5 ≤ BMI < 23 | 정상 |
| 23 ≤ BMI < 25 | 과체중 |
| 25 ≤ BMI | 비만 |
추가 과제 : 키나 체중이 0 이하이면 "잘못된 입력입니다."라고 안내하고 종료하세요.
#실습 문제 2
weight = int(input('몸무게(kg): '))
height = int(input('키(cm): '))
#BMI = 몸무게 / (미터로 바꾼 키)**2
bmi = weight / ((height/100)**2)
if weight <= 0 or height <= 0 :
print('잘못된 입력입니다.')
elif bmi < 18.5 :
print(f'{bmi:.1f} → 저체중')
elif bmi < 23 :
print(f'{bmi:.1f} → 정상')
elif bmi < 25 :
print(f'{bmi:.1f} → 과체중')
else :
print(f'{bmi:.1f} → 비만')


실습 문제 3 : 삼각형이 될 수 없는 경우
세 변 중 하나라도 0 이하이거나, 삼각형 부등식 a + b > c, a + c > b, b + c > a를 만족하지 않으면
"삼각형이 아닙니다."를 출력하고 종료합니다.
| 조건 | 출력 |
| 세 변이 모두 같음 | 정삼각형 |
| 두 변만 같음 | 이등변삼각형 |
| 세 변이 모두 다름 | 일반 삼각형 |
| 직각삼각형(a² + b² = c² 등) | 직각삼각형 (※ 다른 분류보다 우선) |
#실습 문제 3
#세 변의 길이
a = int(input('첫번째 변의 길이를 입력해주세요: '))
b = int(input('두번째 변의 길이를 입력해주세요: '))
c = int(input('세번째 변의 길이를 입력해주세요: '))
# if 세변 중 하나라도 0 이하 or 삼각형 부등식 만족 X
if a <= 0 or b <= 0 or c <= 0 or ((a+b)<=c or (a+c)<=b or (b+c)<=a) :
print('삼각형이 아닙니다.')
# elif 직각삼각형
elif a**2 + b**2 == c**2 or b**2 + c**2 == a**2 or a**2 + c**2 == a**2 :
print('직각삼각형입니다.')
# elif 정삼각형
elif (a==b and b==c) :
print('정삼각형입니다.')
# elif 이등변
elif (a==b or b==c or a==c) :
print('이등변삼각형입니다.')
# else 일반
else :
print('일반삼각형입니다.')


2) 반복문
: 특정한 코드 블록을 여러 번 반복 실행하고자 할 때 사용
| 구분 | for문 | while문 |
| 핵심 키워드 | 횟수/범위 | 조건/상태 |
| 언제 써요? | 리스트, 튜플, 정해진 숫자 범위 조회 | 특정 목표 달성 전까지, 무한 반복 |
| 장점 | 구조가 깔끔하고 무한 루프 위험이 적음 | 유연하고 상황에 따른 변화에 강함 |
for 문
: 정해진 만큼만 반복
for 변수 in 반복_가능한_객체:
수행할_코드_블록
- in 다음에는 보통 [리스트], (튜플), "문자열", range() 등이 온다!
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(num)
for i in range(5):
print("현재 i의 값:", i)
⚬ range(시작값, 끝값, 증가폭)
이때, 끝값은 포함하지 않고, 증가폭은 음수(-)도 가능! (range는 인덱싱과 다르게 거꾸로 순서가 갈 수 있다)


for i in range(10, 0, -2): # 10부터 1까지 짝수만
print(i)
# 증가폭을 음수 + 시작값 / 끝값을 반대로 하면 순서가 거꾸로!
+ 문자열 순회
문자열 = 반복 가능 객체 = 문자들로 이루어져 있어서

while 문
: 조건이 맞으면 계속 반복
while 조건:
수행할_코드_블록
조건이 처음부터 False라면 반복문은 한 번도 실행되지 않는다!
예시)
count = 1
while count <= 5:
print(count)
count += 1 # count를 1 증가시켜 조건 eventually False가 되도록 함
count = count + 1 == count += 1 (간략하게 작성한 버전)
반복문 제어문 : break, continue
- break : True여도 반복문 즉시 종료
- continue : 해당 반복문 건너뛰고 다음으로 넘어감


중첩 반복문 (Nested Loops)
★구구단 만들기★
#구구단 만들기
for dan in range(2, 10) :
for num in range(1, 10) :
print(f'{dan} x {num} = {dan * num}')
print()
enumerate( )
: 첫번째에는 인덱스 값(0, 1, 2, ...) / 두번째에는 해당 인덱스의 문자(a, p, p, ...)

zip( )
: 두 개 이상의 리스트의 길이가 모두 같다면 0번째끼리, 1번째끼리 합쳐줄 수 있음!
- fruit의 0번째 "apple" - prices의 0번째 1000 → 한 세트로 만들기
- fruit의 1번째 "banana" - prices의 1번째 2000 → 한 세트로 만들기

실습 문제 1 : 약수 구하기
문제
사용자에게 정수 n을 입력받아, n의 모든 약수를 출력하세요.
(약수의 개념? 1부터 n(자기자신)까지 나눈 나머지가 0인 값이 약수이다! ex. n=6, 6%1=0, 6%2=0, 6%3=0, 6%6=0 —→ n의 약수는 1, 2, 3, 6)
#실습 문제 1
num = int(input('정수를 입력하세요: '))
for i in range(1, num+1) :
if num % i == 0 :
print(f'{i}는 {num}의 약수입니다.')

실습 문제 2 : 문자열 뒤집기
문제
사용자에게 문자열을 입력받아, 뒤집어서 출력하세요.
(reversed 함수 X, 슬라이싱 X → 반복문을 써서 풀어보세요!)
#실습 문제 2
text = input('문자열을 입력하세요: ')
result = ''
for chr in text :
result = chr + result
print(result)
print()
print()
print(result)

실습 문제 3 : 숫자 맞히기 게임
문제
- 1부터 10 사이의 정답 숫자가 있습니다. (정답은 사용자가 고정적인 값으로 정하면 됩니다!)
- 사용자가 정답을 맞힐 때까지 계속 입력을 받으세요. (While True)
- 맞히면 "정답입니다!"를 출력하고 종료하세요.
#실습 문제 3
correct_answer = 7
while True :
guess = int(input('정수를 입력하세요 (1~10): '))
if guess == correct_answer :
print('정답입니다!')
break
else :
print('틀렸습니다. 다시 입력하세요.')

데이터 분석 파이썬 종합반) 챕터 2
많은 양의 데이터를 모두 변수에 저장할 수 없으니까, 리스트 / 튜플 / 딕셔너리 를 사용한다!
2-2. 리스트 기본 사용법
리스트의 메서드(Methods)
- append() : 리스트에 항목을 추가
- extend() : 리스트에 다른 리스트의 모든 항목을 추가
- insert() : 리스트의 특정 위치에 항목을 삽입
- remove() : 리스트에서 특정 값을 삭제
- pop() : 리스트에서 특정 위치의 값을 제거하고 반환
- index() : 리스트에서 특정 값의 인덱스를 찾음
- count() : 리스트에서 특정 값의 개수를 셈
- sort() : 리스트의 항목들을 정렬 (기본-오름차순)
- reverse() : 리스트의 항목들을 역순으로 뒤집음
# 리스트 생성
my_list = [1, 2, 3, 4, 5]
#리스트의 다양한 메서드(Methods)
my_list.append(6) # 리스트에 새로운 항목 추가
print(my_list) # 출력: [1, 2, 3, 4, 5, 6]
my_list.extend([7, 8, 9]) # 다른 리스트의 모든 항목을 추가
print(my_list) # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9]
my_list.insert(2, 10) # 두 번째 위치에 값 삽입
print(my_list) # 출력: [1, 2, 10, 3, 4, 5, 6, 7, 8, 9]
my_list.remove(3) # 값 3 삭제
print(my_list) # 출력: [1, 2, 10, 4, 5, 6, 7, 8, 9]
popped_value = my_list.pop(5) # 다섯 번째 위치의 값 제거하고 반환
print(popped_value) # 출력: 6
print(my_list) # 출력: [1, 2, 10, 4, 5, 7, 8, 9]
print(my_list.index(4)) # 출력: 3 (값 4의 인덱스)
print(my_list.count(7)) # 출력: 1 (값 7의 개수)
my_list.sort() # 리스트 정렬
print(my_list) # 출력: [1, 2, 4, 5, 7, 8, 9, 10]
my_list.reverse() # 리스트 역순으로 뒤집기
print(my_list) # 출력: [10, 9, 8, 7, 5, 4, 2, 1]
리스트 값 삭제
# 리스트의 항목 삭제
del my_list[0]
print("첫 번째 항목 삭제 후 리스트:", my_list)
# 리스트 내 값들의 모든 항목 제거
my_list.clear()
print("모든 항목 제거 후 리스트:", my_list)
리스트 값 변경
my_list = ['apple', 'banana', 'cherry', 'date', 'elderberry']
# 리스트 값 변경하기
my_list[3] = 'dragonfruit'
print(my_list) # 출력: ['apple', 'banana', 'cherry', 'dragonfruit', 'elderberry']
중첩된 리스트에서 인덱싱하기
# 중첩된 리스트에서 인덱싱하기
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(nested_list[1][0]) # 출력: 4 (두 번째 리스트의 첫 번째 항목)
2-3. 리스트 고급 사용법
슬라이싱
: 리스트에서 특정 범위의 항목을 선택
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 1. 일부분만 추출하기
print(my_list[2:5]) # 출력: [3, 4, 5]
# 2. 시작 인덱스 생략하기 (처음부터 추출)
print(my_list[:5]) # 출력: [1, 2, 3, 4, 5]
# 3. 끝 인덱스 생략하기 (끝까지 추출)
print(my_list[5:]) # 출력: [6, 7, 8, 9, 10]
# 4. 음수 인덱스 사용하기 (뒤에서부터 추출)
print(my_list[-3:]) # 출력: [8, 9, 10]
# 5. 간격 설정하기 (특정 간격으로 추출)
print(my_list[1:9:2]) # 출력: [2, 4, 6, 8]
# 6. 리스트 전체를 복사하기
copy_of_list = my_list[:]
print(copy_of_list) # 출력: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 7. 리스트를 거꾸로 뒤집기
reversed_list = my_list[::-1]
print(reversed_list) # 출력: [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
정렬 : sort()
- 기본적으로는 오름차순
- 내림차순으로 하고 싶을 때는 reverse = False
my_list.sort(reverse=False)
# 숫자로 이루어진 리스트 정렬 예시
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
numbers.sort()
print("정렬된 리스트:", numbers) # 출력: [1, 1, 2, 3, 4, 5, 5, 6, 9]
# 문자열로 이루어진 리스트 정렬 예시
words = ['apple', 'banana', 'orange', 'grape', 'cherry']
words.sort()
print("정렬된 리스트:", words) # 출력: ['apple', 'banana', 'cherry', 'grape', 'orange']
# 내림차순으로 리스트 정렬 예시
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
numbers.sort(reverse=True)
print("내림차순으로 정렬된 리스트:", numbers) # 출력: [9, 6, 5, 5, 4, 3, 2, 1, 1]
# 리스트의 문자열 길이로 정렬 예시
words = ['apple', 'banana', 'orange', 'grape', 'cherry']
words.sort(key=len)
print("문자열 길이로 정렬된 리스트:", words) # 출력: ['apple', 'grape', 'banana', 'cherry', 'orange']
오늘은 파이썬의 조건문과 반복문을 학습했다.
아직은 기본적인 수준이지만, 응용 문제가 나오면 막히는 부분이 종종 있었다.
내일은 최대한 파이썬 종합반 강의에서도 조건문과 반복문을 학습할 수 있도록 틈틈이 강의를 수강해야 할 것 같다.
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 13일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(5) (5) | 2026.01.09 |
|---|---|
| 12일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(4) (0) | 2026.01.08 |
| 10일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(2) (0) | 2026.01.06 |
| 9일차) 내일배움캠프 데이터 분석 TIL - 파이썬 기초(1) (1) | 2026.01.05 |
| 260104) 주말 SQL 코드카타 (0) | 2026.01.04 |
- Total
- Today
- Yesterday
- 데이터분석입문
- 통계
- 태블로
- 내일배움캠프
- 코드카타
- 파이썬
- Til
- 데이터분석
- 파이썬입문
- 비전공자코딩
- 구글코랩
- 텍스트분석
- github
- git
- 머신러닝
- GoogleColab
- Tableau
- SQL
- 프로그래밍입문
- 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 |
