티스토리 뷰

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원
  1. input()으로 관람객 나이(정수)를 입력받습니다.
  2. 위 표에 따라 요금을 계산해 "요금은 12000원입니다." 형식으로 출력하세요.
  3. 나이가 음수이거나 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 지수로 건강 상태 판정

  1. 사용자에게 몸무게(kg)키(cm)를 각각 입력받으세요.
  2. 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 : 해당 반복문 건너뛰고 다음으로 넘어감

break는 만족하는 순간 뒤에 다 진행 X
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']

오늘은 파이썬의 조건문과 반복문을 학습했다.
아직은 기본적인 수준이지만, 응용 문제가 나오면 막히는 부분이 종종 있었다.
내일은 최대한 파이썬 종합반 강의에서도 조건문과 반복문을 학습할 수 있도록 틈틈이 강의를 수강해야 할 것 같다.
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함