오늘의 학습에 대하여
- 파이썬은 쉽지 않다.
- 하지만 차근차근 하면 가까워 질 수 있다. 아자잣!!
1. 오늘 학습 한 내용을 나만의 언어로 정리하기
- while
- while을 하면서 내가 응용했던(?) 오답과 정답을 비교해보기
total = 0 while True: num = input("숫자를 입력하세요 (종료하려면 'quit' 입력): ") if num == 'quit': break total += int(num) print("합:", total)total = 0 while True: num = input("숫자를 입력하세요 (종료하려면 'quit' 입력): ") if num == 'quit': break total += num print("합:", total)- 숫자만 넣을거라서 num만 했더니 unsupported operand type(s) for +=: 'int' and 'str’ 라고 떴다.
- 무슨 말인지 해석하니, “+=에 지원되지 않는 피연산자(연산에 사용되는 값 ) : 정수형, 문자)”라고 함
- 다시 말해 파이썬에서 += 연산자를 사용하려고 했는데, 정수형(int) total 변수에 에 문자열(str) num을 더하려고 해서 에러가 난 것임
- 왜 그런가 하면 input 함수는 모두 문자열로 반환된다고 함
- 오답
- def
- 문제
- 주어진 데이터셋의 평균을 계산하는 함수를 작성하고 함수의 결과를 출력해 보세요!
- # 데이터는 이것을 사용하세요 data = [2, 4, 6, 8, 10]
- 작디 작은 지식으로 만들어낸 코드
-
def mean(data): for num in data: total = 0 total += num mean = total/len(data) data = [2, 4, 6, 8, 10] print(mean(data)) #답 NONE
- 왜 틀렸을까?
- 함수는 mean이고 매개변수는 data야
- data에 있는 리스트 요소를 하나씩 돌아가며 num에 받을거야
- total은 0이야 → 반복문 안에 total= 0이라 누적해서 더할 수 없다. 매번 num 하나만 더하고 끝난다. 마지막엔 결국 10이 남는다. 따라서 total=0은 반복문 바깥에 있어야 한다.
- total에 2를 더해
- 그리고 mean을 구해 → data가 인수를 다 돌았을 때 결과값이 무엇인지 나타나게 해야 한다. return = total / len(data) 처럼, return이 없으면 함수가 아무것도 반환하지 않은 것이므로 NONE을 반환한다.
- 다시 반복해 total을 누적해서 더했지만 또 0이야…
-
- 정답
-
def mean(data): total = 0 for num in data: total += num return total/len(data) data = [2, 4, 6, 8, 10] print(mean(data))
-
- 다른풀이
-
def mean(numbers): return sum(numbers) / len(numbers)
-
- 문제
- def을 쓰면서 나의 오답과 정답을 비교해보기
2. 학습하며 겪었던 문제점 & 에러
- 문제1) 코드카타 48번 (SQL)
- 문제 출처
- 내가 겪은 문제점?
- RANK로 풀었는데, 다른 사람의 다른 풀이법(WHERE)이 이해되지 않는다.
- WHERE을 활용한 풀이법 샅샅이 뜯어보기
- 문제) 음식종류별 즐겨찾기가 가장 많은 식당의 음식종류, ID, 식당 이름, 즐겨찾기 수 조회하기
- REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
- 풀이
- 첫번째 관문
- 음식종류별로 즐겨찾기가 가장 많은 식당 → 오 MAX( ) 써야하네를 생각한다.
- 독해를 한다.
- 어디 테이블에서? FROM rest_info
- 무엇을 food_type, max(favorites)
- 조건은?
- 그룹은? food_type
- 정렬은?
- 쿼리문을 작성한다.
- SELECT food_type, MAX(favoriteS) FROM rest_info GROUP BY food_type
- 두번째 관문
- 위에서 구한 쿼리문을 WHERE 절을 활용해 음식종류별 즐겨찾기가 가장 많은 식당 음식 종류 등을 조회한다.
- 구문별 보기
- 어디에서 REST_INFO
- 무엇을 FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
- 조건은
- FOOD_TYPE 과 FOOD_TYPE
- FAVORITES 과 MAX(FAVORITES)이 쌍으로 같은 것을 필터링한다.
- 정렬은? FOOD_TYPE DESC
- 쿼리문 작성하기
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM REST_INFO WHERE (FOOD_TYPE, FAVORITES) IN (SELECT FOOD_TYPE, MAX(FAVORITES) FROM REST_INFO GROUP BY FOOD_TYPE) ORDER BY FOOD_TYPE DESC- WHERE ( A, B) IN ( A-, B-) : A와 A- B와 B-를 쌍으로 비교한다.
- 즉 FOOD_TYPE과 FOOD_TYPE PRICE과 MAX(PRICE)가 쌍으로 비교된다. 따라서 MAX(PRICE)를 포함하는 값만 나오게 된다.
- cf rank () over 풀이방법
- WITH A AS (SELECT ~~ FROM) : SELECT 구문을 묶어 임시로 만든 테이블 A, 연산 과정이 차례대로 보이므로 가독성이 좋다. (그에 비해 서브쿼리는 가독성이 떨어지고, 쿼리문이 한꺼번에 실행되므로 WITH에 비해서 좋지 않다. 실무에선 WITH가 많이 쓰인다고 함.)
-
WITH A AS (SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES, RANK() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC) AS rnt FROM REST_INFO) SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM A WHERE rnt = 1 ORDER BY FOOD_TYPE DESC
- 첫번째 관문
- 문제2) 코드카타 49번 (SQL)
- 문제
- FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
- 풀이1
- 풀이방법 상세
- 카테고리, 가격, 이름, 카테고리 별 가격 높은 순 랭킹을 조회한다.
- 이것을 WITH로 임시테이블을 만든다.
- WITH : 임시 테이블을 만들어 놓는 것 (=서브쿼리(하위쿼리)를 미리 이름 붙여 주는 정의해두는 문법, Common Table Expression이라고 부른다.)
- 복잡한 쿼리를 깔끔하게 만들 때, 같은 서브쿼리를 여러 번 반복하지 않기 위해, 가독성과 유지보수를 쉽게 하기 위해 사용한다.
- 본 쿼리를 통해 카테고리, 가격(max로 별칭), 이름을 조회한다.
- 이때 임시 테이블 A에서 조회한다.
- 필터링 조건은 RANKING = 1 인 것, 그리고 카테고리에 과자, 국, 김치, 식용유를 포함하는 것이다.
- 가격 내림차순으로 정렬한다.
-
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME FROM FOOD_PRODUCT WHERE (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE) FROM FOOD_PRODUCT GROUP BY 1) AND CATEGORY IN ('과자', '국', '김치', '식용유') ORDER BY 2 DESC
- 풀이방법 상세
- 풀이2
-
def num(a, b): return a + b num(3, 5) #8 cf return을 값을 반환하는 예약어이기 때문에 =을 붙일 필요 없음. =을 붙이면 할당해야 되는 변수가 됨
여기서 잠깐, 파이썬 함수에는 무조건 return이 들어가야 하나요?- 함수에서 어떤 값을 반환하고 싶으면 return이 꼭 필요하다.
- 함수가 단순히 동작만 하고, 값을 돌려줄 필요가 없을 때에는 return이 없어도 괜찮다.
def greet(name): print("hellow,",name) greet("HYEJIN") # hellow, HYEJIN
-
3. 내일 학습 할 것은 무엇인지
- [ ] 파이썬 5주차 학습 바로!
- [ ] 그리고 파이썬 3,4,5주차 복습
#내일배움캠프 #사전캠프 #TIL
'SQL' 카테고리의 다른 글
| 250602_ SQL 어려운 문제 반복 풀이 (0) | 2025.06.02 |
|---|---|
| 250530_SQL(JOIN), 파이썬 총 복습 (1) | 2025.05.30 |
| 250523_내일배움캠프_어려운 쿼리문(UNION ALL, LEFT JOIN) (0) | 2025.05.23 |
| 250522_내일배움캠프_FIELD 함수 (0) | 2025.05.22 |
| 250521_내일배움캠프_window function(rank, sum), date_format (0) | 2025.05.21 |