인사말

오늘 과제 제출을 하고!

내일부터 새로운 강의를 받은 후 공부하기 때문에

이전에 받았던 파이썬 라이브러리 강의를 완강하려 합니다!

그러고 저녁(20 : 00 ~ 21 : 00)엔 Zoom으로 회의가 있고

새로운 과제를 받는다고 하네요 😅

파이팅,,,,


오전 ( 09 : 00 ~ 13 : 00 )

Git Hub에 폴더 생성 완료해주고! ( ~10 : 00)

파이썬 라이브러리 강의를 시청하였습니다.


<10 : 00 ~ 20 : 00>

요약

  1. Pandas 개념
  2. 시리즈(Series)
  3. 데이터프레임(DataFrame)
  4. 시리즈(Series) vs 데이터프레임(DataFrame)
  5. Numpy(Numerical Python)
    1. 연산
    2. 기타 메서드
    3. 배열의 인덱싱, 슬라이싱

<Pandas>_데이터 처리가 필요한 모든 분야에서 사용됨

  1. 개념 
    1. 파이썬에서 데이터를 쉽게 다룰 수 있게 해주는 데이터 분석 라이브러리
    2. 데이터를 표(테이블) 형식으로 다루기 쉽게 만들어 줌
    3. 다양한 데이터 조각 기능을 제공함
    4. 데이터를 정리하고 분석하는 데 아주 강력한 도구임.
      1. 데이터 프레임(DataFrame)
        1. 판다스의 핵심 자료 구조임
        2. 엑셀의 스프레드 시트처럼 행(row)과 열(column)로 구성된 2차원 데이터 구조
      2. 시리즈(Series)
        1. 단일 열을 나타내는 1차원 데이터 구조
        2. 데이터 프레임의 구성 요소 중 하나
  2. 특징 : 판다스를 이용하면 데이터의 필터링, 정렬, 집계 등 다양한 작업을 간단한 코드로 수행 가능함

 

<시리즈 (Series) >

시리즈(Series)

  1. 개념 : 인덱스(Index)와 데이터 값(Value)이 쌍으로 구성됨
  2. 특징
    1. 인덱스를 통해 데이터에 빠르게 접근할 수 있음
    2. 데이터 타입은 자동으로 설정되지만, 원하는 타입으로 변경 가능함
  3. 예시
import pandas as pd

# 시리즈 생성
s = pd.Series([10, 20, 30, 40], index = ['a', 'b', 'c', 'd'])
print(s)
a    10
b    20
c    30
d    40
dtype: int64

pd.Series()를 쓸 때 시리즈는 꼭 대문자로 작성해주셔야 오류가 안 나요!!

 

<데이터프레임(DateFrame)>

데이터프레임(DateFrame)

  1. 개념
    1. 2차원의 표 형태 데이터 구조
    2. 엑셀의 전체 시트(Sheet)처럼 생김
    3. 여러 개의 시리즈(Series)가 모여서 만들어짐.
  2. 특징
    1. 행(row)과 열(column)로 구성된 2차원
    2. 다양한 데이터 타입을 각 열에 담을 수 있음
    3. 인덱스와 컬럼명을 사용해 특정 데이터에 접근할 수 있음
  3. 예시
# 예시: 데이터 프레임 생성
data = {
    '이름': ['철수', '영희', '민수'],
    '나이': [25, 30, 35],
    '직업': ['학생', '회사원', '프리랜서']
}

df = pd.DataFrame(data)
print(df)
   이름  나이     직업
0  철수  25     학생
1  영희  30    회사원
2  민수  35  프리랜서
# data의 컬럼만 뽑아보기

data["이름"]

결괏값
['철수', '영희', '민수']
# 인덱스와 칼럼명을 사용해 특정 데이터에 접근하기

파일명["이름"][0]

결괏값
'철수'

 

<시리즈(Series) vs 데이터프레임(DataFrame)>

차이점 공통점
시리즈는 1차원, 데이터프레임은 2차원 둘 다 인덱스를 가지고 있어서 데이터에 쉽게 접근 가능
시리즈는 하나의 데이터 타입,
데이터 프레임은 다양한 데이터 타입 기입 가능 (리스트, 튜플, 딕셔너리 등등)
판다스에서 가장 기본적인 구조

 

<Numpy(Numerical Python)>

  1. 개념
    1. 과학 계산에 강력한 성능을 제공하는 파이썬 라이브러리
    2. 다차원 배열 객체인 ndarray와 배열을 효율적으로 처리할 수 있는 다양한 함수들을 제공함.
    3. 데이터 분석, 머신러닝, 딥러닝에서 기초가 되는 라이브러리
    4. 판다스와 함께 자주 사용됨
  2. 특징
    1. 고속 배열 연산 : C언어로 작성돼 있어, 파이썬 기본 리스트 보다 훨씬 빠른 연산 가능
    2. 다양한 수학 함수 : 배열 간의 덧셈, 뺄셈, 곱셈 등의 연산을 효율적으로 수행
    3. 선형대수, 통계함수 : 복잡한 수학 계산도 간단히 처리 가능
  3. 예시
  • 배열(ndarray) 생성하기
import numpy as np

# 리스트로 생성하기
## 1차원 배열 생성

arr = np.array([1, 2, 3, 4, 5])
print(arr)
[1 2 3 4 5]

 

  •  배열의 연산
arr = np.array([1, 2, 3, 4, 5])

# 각 원소에 2를 더하기
arr_add = arr + 2
print(arr_add)

# 각 원소에 2를 곱하기
arr_mul = arr * 2
print(arr_mul)
[3 4 5 6 7]
[ 2  4  6  8 10]

 

  • 배열간의 연산
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])

# 배열 간 덧셈
arr_sum = arr1 + arr2
print(arr_sum)

# 배열 간 곱셈
arr_mul = arr1 * arr2
print(arr_mul)
[5 7 9]
[ 4 10 18]

 

  • 배열의 기타 메서드
메서드 설명 메서드 코드 결괏값
0으로 채워진 배열 np.zeros() zero_arr = np.zeros((2, 3)) # 2x3 크기의 배열
print(zero_arr)
[[0. 0. 0.]
 [0. 0. 0.]]
1로 채워진 배열  np.ones() ones_arr = np.ones((3, 2))  # 3x2 크기의 배열
print(ones_arr)
[[1. 1.]
 [1. 1.]
 [1. 1.]]
특정 값으로 채워진 배열  np.full() # 2x2 크기의 7로 채워진 배열
full_arr = np.full((2, 2), 7)
print(full_arr)
[[7 7]
 [7 7]]
연속적인 값으로 채워진 배열 np.arange() # 0부터 9까지의 연속된 값
range_arr = np.arange(10)
print(range_arr)
[0 1 2 3 4 5 6 7 8 9]
메소드 설명 메소드
array 속 개수 확인 arr.size()
array의 데이터 타입 확인 arr.dtype()
array의 용량 차지 확인 arr.nbytes()
array의 차원 확인 arr.ndim()
array를 1차원으로 입력하기 arr.ravel()
array의 차원은 바꾸지 않고 평탄화 arr.flatten()
array의 sum arr.sum(), arr.sum(axis = 1), arr.sum(axisi = 0)
*axis = 1는 열, axis = 0은 행

 

  • 배열의 인덱싱과 슬라이딩

인덱싱(Indexing)

: 배열의 특정 위치의 값을 가져옴

arr = np.array([10, 20, 30, 40, 50])

# 첫 번째 원소
print(arr[0])

# 마지막 원소
print(arr[-1])
10
50

 

슬라이싱(Slicing)

: 배열의 일부분을 잘라내는 방법

arr = np.array([10, 20, 30, 40, 50])

# 두 번째부터 네 번째 원소까지
sliced_arr = arr[1:4]
print(sliced_arr)
[20 30 40]

 

다차원 배열의 인덱싱과 슬라이싱

: 콤마(,)로 구분해서 함

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 특정 원소 접근 (2행 3열)
print(arr2d[1, 2])

# 슬라이싱 (2행까지, 2열까지)
sliced_arr2d = arr2d[:2, :2]
print(sliced_arr2d)
6
[[1 2]
 [4 5]]

저녁 ( 20 : 00 ~ 21 : 00)

오늘까지 과제였던 걸 리뷰도 하면서,

새로운 과제를 설명 듣는 Zoom 수업에 참여하였습니다


마무리

벌써 내일이면 새로운 강의를 받게 되고

새로운 과제도 시작하고

새로운 팀에서 새로운 팀원과 공부하게 되네요 😢

시간 너무 빠른 거 같아서 서운할 정도입니다

그래도

모든 분들을 한 번씩은 뵈어야

나중에 팀 프로젝트를 진행할 때 유리할 거 같아요

좋게 생각하려구요,, 아쉽지만 🥲

 

공부할 게 많이 쌓여있어서

스트레스도 쌓이고 있지만

그래도 해야 하는 걸 어떡합니까!

오늘도 수고 많으셨어요 ㅎㅎ

감사합니다.

인사말

오늘은 1시간 일찍 와서 시작했답니당!

그리고

어제부터 Pandas를 통해서 문제를 풀어보았어요!

갈수록 많은 것들을 머리에 집어넣고

복잡한 코드를 짜게 되니까 머리가 아프네요 😖

그래도 해야죠 어떡하겠어요 🤪

오늘도 파이팅입니다!

감기 조심하세요 ㅠㅠ


오전 ( 08 : 00 ~ 13 : 00)

<pivot_table 생성 후 Index 변경하기>

import pandas as pd

# 데이터프레임 예시
data = {
    '날짜': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
    '제품': ['A', 'B', 'A', 'B'],
    '판매': [10, 20, 30, 40]
}

df = pd.DataFrame(data)

# 피벗 테이블 생성
pivot = df.pivot_table(
    values='판매',         # 집계할 값
    index='날짜',          # 행으로 사용할 컬럼
    columns='제품',        # 열로 사용할 컬럼
    aggfunc='sum',         # 집계 함수 (기본값: 'mean' 또는 'sum' 가능)
    fill_value=0           # 결측값을 채울 값
)

print(pivot)

pivot_table을 gpt한테 물어보았어요

피벗 테이블이 저렇게 구성되었군요..!

집계할 때 쓰나봐요!

3번 문제 내용

드래그를 옆으로 하면

소계(검거), 소계(발생)을 하라고 돼 있더라구요

그래서

pivot_table = df.pivot_table(
    values = '' # 집계할 값
    index = '구 별' # 행으로 사용할 컬럼
    columns = '' # 열로 사용할 컬럼
    aggfunc = 'sum' # 집계 함수
    fill_value = '집계할 값 없음'
)

여기까지는 작성하였으나,,

values에 넣을 값이랑 columns에 넣을 값을 모르겠더라구요

pvt = pd.pivot_table(
    dataframe,
    index = '구 별', # 행으로 사용할 컬럼
    aggfunc = 'sum', # 집계 함수
    fill_value = 0, # 결측 값
    #margins = True # 총 계가 생김
)
print(pvt)

그래서

넣지 않았습니다! 🤣

어차피 다 할 건데 굳이 계산하려는 값이랑

열을 정할 필요가 없더라구요

그래서 깔끔하게 없애버리고!

불러올 값들이 있는 파일명인 "dataframe"을 기입해주었습니다

그리고!

굳이 해보았는데 margins = True으로 기입해주면 총 계가 생기게 됩니다

margins는 기본값이 False기 때문에 True로 바꿔줘야 합니다!

 

<Quiz 4_drop 써서 삭제하기>

데이터프레임명.drop([row])

퀴즈 자체에서 코드를 주셨길래

그대로 따라써보았습니다

근데 "구 없음"만 지워야 하잖아요? 🧐

KeyError: "['구 없음'] not found in axis"

엥??

dataframe에는 "구 없음"이 존재한단 말이죠? 🤨

그래서 dataframe 파일 말고,

pivot_table을 끌고 와보았습니다

pvt2 = pvt2.drop(['구 없음'])

원래의 pvt 파일에는 "광진구"와 "구로구" 사이에 "구 없음"이 존재했거든요!

짜잔 - ✨

없애버렸습니다 😎

pivot_table을 기준으로 해야 하는 이유가

저희가 강남서 -> 강남구 이런 식으로 바꾸었잖아요

그 파일을 기준으로 pivot_table을 만들었구요

그래서 데이터의 이 되는 게 "pivot_table"이 된다고 생각합니다!

그래서 pivot_table로 drop 해주니까 변경되네요! 🤪

 

<Quiz 5_각 범죄별 검거율 구하기 및 Columns 추가>

일단은 컬럼을 먼저 추가 해주었어요

검거율은 평균값을 구하고 나눠야 한다 생각을 해서

간단한 컬럼부터 추가해주었습니다

# 컬럼 추가하기
파일명['추가할 컬럼명'] = 시리즈 객체
ex) data['강도 검거율'] = data['강도(발생)'] / dataf['강도(검거)'] * 100
# Quiz 5_컬럼 추가하기 및 검거율 계산
## 리스트로 시도해보려 했으나, 실패

add_value_name = ['강간 검거율','강도 검거율','살인 검거율', '절도 검거율','폭력 검거율', '검거율']
add_value_happen = []
pvt2['강도 검거율'] = pvt2['강도(발생)'] / pvt2['강도(검거)'] * 100
print(pvt2['강도 검거율'])

생성해야 할 컬럼들이 많이 때문에

한 번에 처리하고 싶어서 이리저리 머리를 굴려봤습니다

처음에는 리스트로 시도해보았는데

생각해보니까,, 데이터 파일 자체가 큰 애였다면

리스트로 하기엔 무리라고 생각이 들더라구요 🫠

다른 방법을 생각해보았습니다,,

data['강도 검거율'] = data['강도(발생)'] / data['강도(검거)'] * 100

어쨌거나 이 문장이 반복되어야 한단 말이죠? 🧐

반복..?

반복..!?!?

for문을 가져와보았습니다

for crime in ['강간', '강도', '살인', '절도', '폭력']:

일단 이렇게 만들고 밑에는

for crime in ['강간', '강도', '살인', '절도', '폭력']:
        pvt2[f'{crime} 검거율'] = pvt2[f'{crime}(발생)'] / pvt2[f'{crime}(검거)'] * 100

이렇게 해서 넣어주었어요 (파일 이름 : pvt2)

crime이라는 이름의 리스트를 만들어주었구요

f{} 이렇게 써서 편하게 쓸 수 있어요!

이걸 포매팅이라고 하거든요! 종류가 다양한데,

포매팅은 내일 공부할 겁니다 😎

결과물 아 ~ 주 예뻐서 맘에 들어용 ㅎㅎㅎ


오후 ( 14 : 00 ~ 18 : 00 )

정신없이 찾아보고 물어보고

팀원 분들이랑 소통도 하니까 점심 시간이더라구요

그래서 후다닥 밥 챙겨 먹고,

매니저 님께 git hub 꿀팁 얘기도 듣고 난 후에

남은 문제들 풀어보았습니다!

 

<Quiz 6_필요없는 column을 del을 써서 삭제하기>

삭제 해봅시다 😎

# Quiz 6_del 사용해서 필요없는 컬럼 삭제하기

for delete_columns in ['강간(검거)','강도(검거)','살인(검거)','절도(검거)','폭력(검거)','소계(발생)','소계(검거)']:
    if delete_columns in pvt2:
        del pvt2[f'{delete_columns}']
print(pvt2)

앞서 컬럼을 한 번에 생성했듯이

삭제도 같은 방식으로 해보았어요

되네요..?

됐다고 나오니까 오히려 불안했어요,, 👀

그래서 확인 받으러 튜터 님께 갔죠?

# Quiz 6_del 사용해서 필요없는 컬럼 삭제하기

for delete_columns in ['강간(검거)','강도(검거)','살인(검거)','절도(검거)','폭력(검거)','소계(발생)','소계(검거)']:
    if delete_columns in pvt2:
        del pvt2[delete_columns]
print(pvt2)

수정된 코드입니다

뭐가 달라졌냐구요?

포매팅 중에서 f{}가 있잖아요

그게 print할 때만 쓰는 거라고 하셨어요

그래서 포매팅에 대해서 공부하였습니다..

(내일 제대로 각 잡고 하려고 했는데,, 쩝 👀)

 

< f{}(f-string) 쓰는 방식>

When :  Python에서 문자열을 조작할 때

How : print(f"{}")

Ways :

1. 기본형

  • f를 문자열 앞에 추가
  • {} 안에 변수를 넣으면, 해당 변수의 값이 문자열 안에 삽입됨
# 예시
name = "민경"
score = 95
print(f"이름: {name}, 점수: {score}")
이름: 민경, 점수: 95

 

2. 표현식

x = 5
y = 10
print(f"두 수의 합은 {x + y}입니다.")
두 수의 합은 15입니다.

 

3. 숫자 포매팅 (소수점)

pi = 3.141592653589793
print(f"원주율은 {pi:.2f}입니다.")  # 소수점 2자리로 출력
원주율은 3.14입니다.

.2f는 f는 실수를 의미, 2는 소수점 2자리까지를 의미

 

4. 중첩 변수

name = "Alice"
greeting = f"Hello, {name}!"
message = f"Message: {greeting}"
print(message)

greeting에서 {name}에 들어가는 값을 쓸 거고

message에서 {greeting}의 문장을 쓸 구조로 돼 있어요

Message: Hello, Alice!

 

5. 함수 호출

word = "Python"
print(f"단어 '{word}'의 길이는 {len(word)}입니다.")

함수 len()이 들어가서도 작동이 가능해요!

대신 {len()} 구조로 들어가야 하네요!

단어 'Python'의 길이는 6입니다.

 

6. 할당하기 (=)

x = "배"
y = "민경"
print(f"{x=}, {y=}")  # 변수명과 값 출력

오,, ㅋㅋㅋㅋㅋㅋㅋㅋ

재밌네요! 되게 유용하네요

다양하게 많이 쓰이니까, 신기한 거 같아요

한 번 더 파일명을 언급하지 않아도 된다는 것도 너무 좋구요!

 

<Quiz 7_ rename>

드디어 마지막 문제입니다!!

rename을 해볼게요!

이번에도 for문으로 해결할 겁니다!

# Quiz 7. rename하기

# 1트
for rename_columns in {'강간(발생)':'강간','강도(발생)':'강도','살인(발생)':'살인','절도(발생)':'절도','폭력(발생)':'폭력'}:
     if rename_columns in pvt2:
         pvt2.rename(rename_columns)

될 줄 알았는데 안 되더라구요

# 오류 내용
TypeError: Index(...) must be called with a collection of some kind, '강간(발생)' was passed

타입이 다르대요,,

고칠 줄 아는 정도였으면 좋았을 텐데

도저히 뭐라는지 모르겠어서 그냥 .rename()으로 했습니다.

# 2트
rename_columns_on = pvt2.rename(columns = {'강간(발생)':'강간','강도(발생)':'강도','살인(발생)':'살인','절도(발생)':'절도','폭력(발생)':'폭력'})

print(rename_columns_on)

이게 의문점이 들었던게요

중괄호{}면 딕셔너리란 말이죠?

근데 왜 key가 먼저 들어가지 않고, value가 먼저 들어갔는지

그게 너무 궁금했습니다

일단 결과는 잘 나왔어요 👀

제가 생각하기에는 이미 기존 파일에

key 문자 그대로 잘 들어가 있어서 바로 value로 들어간 거 같아요 🧐

그리고 문제의 문장을 보면 "컬럼명을 rename으로 변경하세요" 잖아요

그래서 앞전에 피벗 테이블을 작성했듯이

'columns도 그대로 집어넣으면 "열로 사용한 컬럼"의 뜻이니까 그대로 되겠지 뭐'

라는 생각으로 그대로 rename 뒤에 집어넣었거든요

근데,, 되네요? 🙄

알다가도 모르겠어요

일단 저렇게도 넣을 수 있구나를 깨달았습니당!


저녁 ( 18 : 00 ~ 19 : 00)

숙제도 이제 다 끝냈기 때문에!

git에 대해서 공부 좀 하고, 생성 하려구요!

git을 어떻게 해야 하는지 전혀 몰라서

팀원 분들이랑 얘기 나눴습니다!

homework라는 공간 속에

숙제한 파일을 넣을 거라서, 팀원 분께 물어봤어요

이렇게 파일을 업로드 하였는데,

폴더를 생성해서 하는 게 어떻냐고 하시더라구요

저기 파란색 칸 보이시나용?

저기에서 슬래시(/)를 쓰면 폴더로 생성되고, 그 뒤로는 파일명으로 되나봐요!

이렇게 생성하면 됩니다!

제출은 내일 하려구요 ㅎㅎ


마무리

오늘 뭔가 휘익 휘익 지나간 거 같아요

이리 치이고 저리 치여서 체력 소모가 컸지만

팀원 분들과 막힐 때마다 소통하고,

튜터 님께 가서 힌트 얻고, 다시 해보고

이걸 반복하니까 너무 재밌었습니당 ㅎㅎㅎ

 

아직 안개가 사라지지 않아서 앞이 잘 보이진 않지만

희미하게라도 앞이 보이는 느낌이에요!

적극적으로 배움을 이어 나가려 해서 제가 너무 좋아요 🥰

주변 분들도 너무 좋구요 히히 🥰

 

한 번 할 거면 제대로 해야죠 히히

내일도 파이팅!!

감사합니당

인사말

안녕하세요~

벌써 교육 2주차가 됐네요!

12월 4일까지 과제 제출이 있기 때문에

그 날까지는 과제 중심으로 공부를 하게 될 것 같습니다!

그래도 프로그래머스의 0단계 문제를 꼬박 꼬박 3개씩 풀어보려구요!


오전 ( 09 : ~ 13 : 00)

오늘은 과제 2를 공부했답니다!

class를 써서 인적사항을 정리하는 내용인데요

과제의 조건을 저렇습니다.

그래서 class에 대해 제대로 강의 영상을 보지 않고,

알고 있는 내용만으로 작성을 해보았어요

 

<11월 29일 금요일_1트>

11월 29일 금요일에 새벽까지 남아서 해봤거든요?

해야 할 일은 빨리빨리 끝내고 싶어해서, 해보았는데

감이 전혀 잡히지 않아서,, 그냥 자러 갔습니다

 

<12월 1일 일요일_2트>

될리가 없죠 🧐

다시 보고, 계속 뭐가 문제인지 생각해보니까

"객체"를 설정하지 않았더라구요

그리고 첫 번째의 def __init__(): 에서

한 번에 다 적어내려도 됐던 거였어요..!

유튜브 강의를 보고 깨달았답니다 ㅠㅠ

 

<12월 1일 일요일_3트>

객체를 이런식으로 설정하는 게 아닌가봐요? 🧐

영상을 좀 더 찾아보고 해봐야겠어요

 

<12월 2일 월요일_4트>

# 4트
class person:
    def __init__(self):
        self.name = input("이름을 입력해주세요 -> ")
        self.gender = input("성별을 입력해주세요 -> ")
        self.age = int(input("나이를 입력해주세요 -> "))
        
    def display(self):
        print("이름 : {}, 성별 : {}, 나이 : {}".format(self.name, self.gender, self.age))
        
# 객체 생성(=person_info)
person_info = person()
person_info.display()

display() = show()랑 같더라구요

처음엔 show()로 입력하였는데, 과제 내용을 보니까

display()로 하라고 해서 수정하였습니다!

그리고

이해하지 못 했던 "객체 생성"도 영상을 여러개 보다 보니,

이해하게 되었습니다. 😝

# 4트
    def display(self):
        print("이름 : {}, 성별 : {}, 나이 : {}".format(self.name, self.gender, self.age))
print("이름 : ", self.name, "성별 : ", self.gender, "나이 : ", self.age)

그리고 .format() 함수를 이렇게도 표현할 수 있다는 걸

튜터 님한테 상담했을 시, 알게 되었습니다

근데 .format()을 쓰는 게 더 편한 거 같아요 😋

추가 정보를 알려주셔서 감사합니다 히히 😉

 

11 : 00 ~ 13 : 00

이제 마지막 과제인 "Python 라이브러리로 데이터 분석하기" 만 남았는데요

아직 라이브러리에 대한 개념이 없어서,

스파르타 내일배움캠프에서 지급해준

파이썬 라이브러리 강의를 시청해주었습니다 😋

그래서 pandas라는 것도 깔아보았습니다

Terminal에서 설치를 설정하면 되더라구요..

강의로 설치를 따라가려 했는데

강의 보면서 하니까 전혀 모르겠어서 튜터 님께 찾아가서 해결했습니다 😢

이제 import pandas 해서 쓰면 된다고 하셨어요!

 

과제 3번은 시작부터 어렵네요 ㅠㅠ

 

<가상환경 활성화 하기>

1. conda 공식 사이트에 들어가서 설치를 합니다.

2. 가상환경 이름을 만들어주고 생성 해줄게요

<VSCode> Terminal에서 써주시면 됩니다!

 conda create -n <환경이름> python=3.10
Ex) conda create -n myenv python=3.10

3. 가상환경을 활성화 해줄 겁니다

conda activate <환경이름>
conda activate myenv

4. 주피터도 설치해주고요

conda install jupyter

5. ipykernel도 설치해줍니다.

conda install ipykernel

6. 가상환경을 jupyter 커널로 추가해줍니다.

python -m ipykernel install --user --name=myenv --display-name "Python (myenv)"

7. 주피터 노트북을 실행해서 브라우저에서 잘 되고 있는지 확인 해줄게요

jupyter notebook

8. 버전 확인 및 파일이 잘 열어지는지 확인해볼게요

import numpy as np
import pandas as pd

print("NumPy version:", np.__version__)
print("Pandas version:", pd.__version__)
df = pd.read_excel('crime.xlsx')
df

9. 다시 VSCode로 돌아가서 ipynb 파일을 찾아갑니다.

그러면 오른쪽에 Select Kernel이 떠요 그걸 누르시면

이렇게 이전까지 생성 중이었던 가상환경이 보이실 겁니다.

그걸 눌러주세요.

최종 화면이 이렇게 된다면

준비 끝입니다 😭

팀원 언니의 도움이 없었더라면 여기까지 절대 못 왔어요 ㅠㅠ

설정을 끝내고 나니까, 꼬질꼬질한 시골 강아지가 된 기분이네요

하필 오늘 입은 옷도 누렁이 옷이었구요 🤣


오후 ( 14 : 00 ~ 18 : 00)

15시까지가 되어서야 가상환경 설정을 끝냈습니다 ⛳️

이제  과제 3번을 해보아야겠지요,,

과제 3번에는 총 7가지의 Quiz가 있습니다

첫 번째 퀴즈

import pandas as pd
df = pd.DataFrame('crime.xlsx')
print(df)

왜 안 되는지 모르겠어요

뭐가 문제였을까요 🧐

 

그래서 다시 인강으로 돌아가보았습니다

데이터 프레임이라는 내용이 있거든요

import pandas as pd

# 예시: 시리즈 생성
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)

약간 딕셔너리와 비슷한 구조더라구요

Series는 리스트 느낌이었고, index는 딕셔너리 느낌이었습니다.

 

15 : 30 ~ 16 : 30

<Data Frame 생성하기>

import pandas as pd
dataframe = pd.read_excel('crime.xlsx')
dataframe

일단 첫 번째 퀴즈는 완수를 해냈어요!

강의를 듣다가도 첫 번째 퀴즈를 풀어낼 수 있을 거 같아서

계속 고민을 해봤더니 처음에 테스트겸 파일 불러왔잖아요?

그거를 그냥 data frame으로 적었습니다

여기서 추출이 돠냐 안 되냐는 다음 문제를 풀어보면서 확인하려구요 😤

 

16: 35 ~ 18 : 00

<유튜브에 있는 파이썬 판다스 강의 시청>

기본 개념이 있어야 할 수 있겠다 싶어서

기초부터 차근차근 쌓아가려구요,,

오늘의 문제 풀이는 여기까지만 하고

개념 정리 후에 저녁 시간엔 프로그래머스 문제 풀 겁니다 😉


저녁 ( 19 : 00 ~ 21 : 00)

벌써 오늘의 저녁 시간이 됐네요

과제 3번의 2번 문제를 풀어보았습니다!

문제에서 힌트를 얻어서 만들어보았어요

dataframe['구 별'] = dataframe['관서명'].map(df).fillna('구 없음')

dataframe

새롭게 만들 열을 dataframe['컬럼 명']으로 추가해주고

그와 참조할 열 이름을 dataframe['관서명'].map(df)으로 해준 뒤!!

여기서!! 처음 알은 함수!! .fillna()는 fill in처럼 ~을 채우다 라는 의미라고 하더라구요

그래서 .fillna()만 적으면 NaN으로 출력되는 걸 확인했습니다!

그래서 원하는 값으로 .fillna('구 없음')을 적어주어 문제 해결했습니다!


마무리

하,, 머리 너무 아픕니다

판다스가 확실히 데이터가 없고, 배운 적도 없어서 감이 안 잡혀요

하나 푸니까 다음 문제에 또 막히고

하나 푸니까 다음 문제에 또 막혀요

알아낼 때 재밌긴 한데!

과정이,, ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

과정 덕분에 해결이 되었을 때만큼 짜릿한 게 없는 거 같아요 😁

내일은 더 파이팅 해야겠어요

4일에 제출해야 하기 때문에 담은 4문제 풀어야 해요!!

파이팅!! 🔥

인사말

안녕하세요~!

제가 또 돌아왔습니다!

오늘은 14시에 팀별로 발표가 있기 때문에

오전 시간에는 발표 준비로 시간을 보냈구요,

오후 19시부터 저녁까지 본격적으로 공부를 시작하였습니다!

14시부터 17시 30분까지 1조부터 12조까지 ZOOM으로 발표가 있어서

오늘은 많은 공부를 하진 못 했답니다 😓


 

오전(09 : 00 ~ 13 : 00)

오전 시간에는

발표 스크립트를 재검토하고, 어떻게 해야 막힘없이 전달하고

집중하게 만들 수 있을지 고민을 하며 시간을 보냈습니다.

저희팀은 딕셔너리에 대해서 발표를 하기 때문에

질리도록 발표 자료를 확인하였더니

딕셔너리에 대한 이해도가 단단해진 기분이었어요 😙

무엇보다, 50명의 교육생들 앞에서 발표를 할 생각에

잘하고 싶다는 욕심이 생겨서 "굳이?"라는 말이 나올 정도로

긴장하며 발표 준비를 하였습니다 😋

이왕에 할 거면 확실하고 깔끔하게 하는 것이 좋잖아요 ㅎㅎ

 

11 : 00 ~ 11 : 50 프로그래머스 3문제 풀이

<첫 번째 문제_각도 합치기>

이 상태에서 버그를 찾아서 수정하면 되거든요!

한 줄만 수정하면 됩니다!

280 + 485 = 45도로 표시가 되어야 하기 때문에

sum_angle = (angle1 + angle2) %360

%360으로 전환하여서 정답을 맞추었습니다! 😘

 

<두 번째 문제_피타고라스>

제곱을 해주기 위해서 **을 해주시고

**뒤에 얼만큼 제곱을 할 건지 숫자를 넣어주시면

제곱으로 값이 출력이 됩니다! 😘

 

<마지막 문제_두 수의 차>

코드를 보고 num1과 num2의 할당된 값이 없길래

 

num1과 num2 값을 리스트[]로 할당해주고

print(solutiion) 해주어서 문제를 해결하였습니다! 😎

 

12 : 00 ~ 13 : 00

점심 시간이 되기 전에,

팀원분들과 예상 질문에 관해서 논의를 하고

식사를 하러 갔습니다.

점심 시간 끝나자마자 발표가 있다고 하니,

굉장히 설레고 떨리네요 😖


오후(14 : 00 ~ 17: 20)

3시간 20분 동안의 발표가 끝난 후

개인 과제를 받았기 때문에 팀원 분들과 과제 관련 논의를 18시까지 진행하였습니다


저녁(19 : 00 ~ 21 : 00) - 과제 첫 번째 문제 풀기

이게 12월 4일까지의 제출해야 할 과제 3가지 중 첫 번째 과제 내용입니다

문장 하나하나 읽어보면서 어떻게 코드를 짜야할지 생각해보았고,

시작의 접근성이 맞는지 튜터 님께 검토 받은 후 코드를 싸보았습니다.

import random

일단은 파이썬에서 import random이 뭐가 있는지를 파이썬 홈페이지에서 찾아보았습니다.

https://docs.python.org/3/library/random.html#random.randint

그 안에 Return a random integer N such that a <= N <= b. Alias for randrange(a, b+1).가 있길래

적용해서 코드를 짜보았습니다.

우선

# 출력 예시
1과 10 사이의 숫자를 하나 정했습니다.
이 숫자는 무엇일까요?
예상 숫자: 5
너무 큽니다. 다시 입력하세요.
예상 숫자: 4
너무 큽니다. 다시 입력하세요.
예상 숫자: 3
정답입니다!

이렇게 출력이 되도록 해야 하거든요?

input_random_numbers = random.randint(1, 10)
start_sentence = int(input("숫자를 입력해주세요: "))

그래서 여기까지 코드를 짜주었습니다

while input_random_numbers == start_sentence:
    print("정답입니다!")
    break
else:
    print("땡! 다시 입력해주세요")

그리고 정답이 나올 때까지 반복을 해주어야 하기 때문에

반복문 while을 써주고 정답일 시 멈추도록 break도 입력해주었습니다

정답이 아닐 때에 출력될 값도 입력을 해주었구요

잘 작동하는구나 싶었는데

2를 입력하였을 때 왜 저런 문장이 발생하는지 모르겠더라구요

그리고 왜 멈춰버렸는지 왜인지 모르겠어요,, 😩

그래서 튜터 님께 찾아가 여쭈었습니다.

<수정 전>

while input_random_numbers == start_sentence:
    print("정답입니다!")
    break
else:
    print("땡! 다시 입력해주세요")

<수정 후>

while True:
    start_sentence = int(input("숫자를 입력해주세요: "))
    if input_random_numbers == start_sentence:
        print("정답입니다!")
        break
    else:
        print("땡! 다시 입력해주세요")

while문에 True:를 입력하면 무한 동력이라고 알려주셨습니다!

기존에 while문에다가 input_random_numbers == start_sentence: 이렇게 적었잖아요 😅

그래서 무한 동력이 되진 않았더라구요

그래서 if문으로 내려보냈습니다 ㅎㅎ

꺄아아아악 실행 되었습니다!

8트만에 정답 맞춘 게.. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

import random

input_random_numbers = random.randint(1, 10)
print(input_random_numbers)

while True:
    start_sentence = int(input("숫자를 입력해주세요: "))
    if input_random_numbers == start_sentence:
        print("정답입니다!")
        break
    elif start_sentence < input_random_numbers:
        print("보다 큽니다, 다시 입력해주세요!")
    elif start_sentence > input_random_numbers:
        print("보다 작습니다, 다시 입력해주세요!")
    else:
        print("땡! 다시 입력해주세요")

elif를 써서 좀 더 조건을 붙여주었습니다

순차적으로 검사하면서 입력값이 출력되도록 만들었습니다! ㅎㅎ

"보다 작습니다, 다시 입력해주세요!"

"보다 큽니다, 다시 입력해주세요!"

을 추가하였던 것도 잘 출력되었습니다 ㅎㅎ


마무리

오늘은 while을 무한 동력으로 돌릴 때 True: 을 써야한다는 것을 배웠습니다!

이건 이제 까먹진 않을 거 같아요!

그리고 강의로만 배웠던 elif를 직접 써보면서 게임을 만들 수 있어서

너무 재밌었습니다 🤪

얼른 아는 게 많아져서 이런 저런 게임을 만들어 보고 싶어요 ㅎㅎ

배울수록 너무 매력적으로 느껴지고 재미를 느끼고 있습니다 히히

이제 주말이네요!

평일 동안 고생 많으셨습니다, 푹 쉬세요!

감사합니다!

인사말

안녕하세요~!

오늘도 문제 푼 걸 리뷰하도록 하겠습니다

어제처럼 오전 ~ 저녁으로 나눠서

무엇을 했는지 시간 흐름대로 기록하도록 하겠습니다!

 

내일이 딕셔너리 개념 발표가 있기 때문에

오늘도 딕셔너리 문제를 풀어보려 합니다!

그 뒤로는 파이썬 문제를 풀어볼 거구요 😜

 

TMI(To0 Much Imformation)

비염과 감기 때문에 너무 힘드네요 ㅠㅠ

그래도 한 건 해야죠 😎


오전 (09 : 00 ~ 13 : 00)

오늘은 딕셔너리 중급 수준 문제 5번부터 고급 수준 문제 10번까지

총 6문제를 풀어볼 겁니다!

 

<문제 5. 딕셔너리 여러 개 합치기>

#딕셔너리 여러 개 합치기
# 문제 5: 두 개의 딕셔너리가 주어졌을 때, 두 딕셔너리를 합친 새로운 딕셔너리를 만들어 출력하세요. (중급)
# 출력 예시 : {'name': '최준호', 'score': 75, 'age': 24, 'major': '영문학'}
student1 = {
    'name': '최준호',
    'score': 75
}

student2 = {
    'age': 24,
    'major': '영문학'
}

두 딕셔너리를 합쳐서 새로운 딕셔너리를 만들어야 하는데,

두 딕셔너리를 합치는 함수가 뭔지 모르거든요,,

그래서

팀원분들께 물어본 결과, | 이걸 쓰면 합쳐진다고 하더라구요

print(student1 | student2)

역 슬레쉬 위에 있는 일자 모양을 적어주시면

{'name': '최준호', 'score': 75, 'age': 24, 'major': '영문학'}

이렇게 합쳐집니다!

알아야 할 함수랑 수식이 정말 많은 거 같아요 😣

무작정 외울 생각은 안 할 거구요,

계속 문제를 많이 풀어보면서 익숙해질 생각입니다

문제 풀면서 공부하는 게, 차라리 더 재밌거든요 😝

 

<문제 6. 딕셔너리에서 특정 키가 존재하는지 확인>

#딕셔너리에서 특정 키가 존재하는지 확인 
# 문제 6: 주어진 딕셔너리에서 name 키가 존재하는지 확인하고, 존재하면 "키가 존재합니다"를 출력하고,
# 존재하지 않으면 "키가 없습니다"를 출력하세요. (중급)
# 출력 예시 : 키가 존재합니다
student = {'name': '이하늘','age': 28}
#1트
for i in student6:
    if student6 == 'name':
        print("키가 있습니다")
    else:
        print("키가 없습니다")
키가 없습니다
키가 없습니다

??????

왜 print()가 두 번이 되는지도 궁금하고

print(type(student6) 했을 때

dict로 나와서 그런 걸까요? 적용이 안 되네요..? 🧐

 

이 고민을 하면서 30분이나 걸린 문제입니다..

물론 튜터 님과 매니저 님께 자문을 구하였지만,

돌아와서 다시 혼자 생각을 해보니까

비슷한 문제가 생겼을 때,

스스로 해내진 못 할 거 같더라구요 🥲

그래서 

혼자 다시 생각해보았습니다

 

제가 간과했던 개념이, for은 순차적으로 순회 검사를 한다는 거였어요

그래서 결과값이 두 번이나 나왔던 거고, 

#2트
if i == 'name':
    print("키가 있습니다")
else:
    print("키가 없습니다")

if문 뒤에 적었던 student6는 dict의 타입이기 때문에

== 뒤에 오는 'name'과는 타입이 안 맞아서 오류가 났더라구요

그래서 if 뒤에 i를 적어주고 다시 돌려보았습니다.

Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 63, in <module>
    if i == 'name':
       ^
NameError: name 'i' is not defined. Did you mean: 'id'?

오류를 돌려받았습니다 ㅎ

생각해보니까 ㅋㅋㅋㅋㅋ i라는 거는 for을 위해서 만든 애기 때문에

지워주거나 student6로 바꿔줘야 했는데 말이죠 ㅋㅋㅋㅋ,,

# 3트
if student6 :
    print("키가 존재합니다")
else:
    print("키가 없습니다")

그래서 for문 지워주고, dict student6를 넣어줬는데

생각해보니까,, 딕셔너리의 'name'만 가져 오고 싶은 거잖아요,,

어떻게 해야 할지 고민 많이 했습니다,,

 

튜터 님께 어제 받은 사이트를 뒤적거리면서 알게 됐는데요

딕셔너리에 속한 Method가 되게 많더라구요

영어로 되어있긴 하지만 해석은 가능하니까 읽어보았습니다

get() : Returns the value of the specified key

https://www.w3schools.com/python/python_dictionaries_methods.asp

"구체적인 key의 value 값을 다시 보여준다"고 이해했거든요

그래서 .get()을 써서 활용해 보았습니다.

if student6.get('name'):
    print("키가 존재합니다")
else:
    print("키가 없습니다")
키가 존재합니다

전 저 자신에게 무궁무진한 박수와 칭찬을 해주고 싶어요

문제 풀다가 막혀서 혼자 처음엔 낑낑거리다가

자문을 구하러 여기저기 돌아다니고,

힌트를 받아서 혼자 생각하고 해낸 게 짜릿했습니다

어쨌든 해냈다는 거고? 도파민도 팡팡 터지네요 🤪

 

<문제 7 . 중첩된 딕셔너리>

#중첩된 딕셔너리
# 문제 7: 다음과 같은 중첩된 딕셔너리에서 address 값을 출력하는 프로그램을 작성하세요. (고급)
# 출력 예시 : 서울시 강남구
person = {
    'name': '김하나',
    'contact': {
        'email': 'hana@naver.com',
        'phone': '010-1234-5678'
    },
    'address': '서울시 강남구'
}

어찌하여 이런 시련을 주셨을까요..

머리 터질 것 같습니다..

아침을 잘 챙겨먹지 않는 편인데, 요즘 들어서 머리를 많이 썼더니

배가 너무 고프더라구요 😂

그리고 나중에 체력 때문에 지장이 생길까 봐,

교육 끝난 후 운동까지 했더니 배가 금방 고파져요

아주 바람직한 흐름인 거 같아요 😉

print(person.get('address'))
서울시 강남구

??????? 🧐????

뭐죠

일단 값을 불러오고 싶은 거니까 .get()을 써서 불러왔는데

바로 불러와지네요? 왜죠? 뭐죠?

어쨌든 문제를 풀었으니 된 거지만

만약 'adress'가 아니라 'email'이었으면 어떻게 가져와야 할지

잘 모르겠더라구요

궁금하고 찝찝한 건 못 참죠.

# email 꺼내기 1트
email = print(person.get('email'))
None

거참.. 단호하고 확실해서 좋네요 😤

# email 꺼내기 2트
email = print(person.get('contatct'), person.get('email'))
None None

이 접근 방식이 아닌가,,

그나저나 .get() 개념을 다시 확인 해봐야겠어요

dictionary.get(keyname, value)
Parameter : Description
keyname : Required. The keyname of the item you want to return the value from
value : Optional. A value to return if the specified key does not exist. Default value None

value가 옵션이군요? key가 있어야 있고, 없으면 없어지는 그런,,

호오 🧐

개념 설명은 알게 되었지만 활용 방법을 모르겠어서

튜터 님께 가져가보았습니다 ㅋㅋㅋㅋ..

# email 꺼내기 1트 (email에 할당하는 정의가 없음)
email = print(person.get('email'))

# email 꺼내기 2트 (email에 할당하는 정의가 없음)
email = print(person.get('contatct'), person.get('email'))

# email 꺼내기 3트 (튜터 님과 함께))
contact = person.get('contact')
email = contact.get('email')
print(email)
person.get('contact').get('email')
person['contact']['email']

전체적으로 제 흐름들을 설명드리며 자문을 구했는데요

기본 개념부터 차근차근 알려주시더라구요

접근법은 좋았다고 말씀 해주셨습니다 😳

그리고 코드를 완성시키는데 도움도 주시고 피드백도 해주셨어요!

email = print(person.get('email'))
email = print(person.get('contatct'), person.get('email'))

제가 다짜고짜 print()를 냅다 적었잖아요?

이렇게만 두면 값이 바뀌더라도 할당할수가 없어서 아쉽다고 하시더라구요

그래서 다음부턴 할당을 하고, print()해야겠다는 걸 깨달았습니다!

생각해보니, 변수값이라서 바뀔수도 있는데

변수에 대해서 할당하는 문장을 입력 안 했네요 🥵

# email 꺼내기 3트 (튜터 님과 함께))
contact = person.get('contact')
email = contact.get('email')
print(email)
person.get('contact').get('email')
person['contact']['email']

 

딕셔너리 내용이 뭐였죠?

person = {
    'name': '김하나',
    'contact': {
        'email': 'hana@naver.com',
        'phone': '010-1234-5678'
    },
    'address': '서울시 강남구'
}

첫 번째로

"person"의 딕셔너리 -> 'name', 'contact', 'address'가 있고

"contact"의 딕셔너리 -> 'email', 'phone'가 있습니다

총 두 개의 딕셔너리로 구성되어 있는 구조인 거죠!

contact = person.get('contact')
email = contact.get('email')

print(email)

그렇기에 할당값을 적어내리자면

'contact'는 'person' 딕셔너리 안에 있으니까 'person'에 있다고 해주구요

'email'은 'contact' 딕셔너리 안에 있으니까 'contact'에서 가져오겠다고 해주면 됩니다!

hana@naver.com

이렇게 값에 대한 할당을 해주고,

print()를 해준다면! 원하는 키 값 'email'에 대한 value 값 'hana@naver.com'이 나오는 거죠 😋

도파민 쩌는 깨달음이었습니다 😏

person.get('contact').get('email')
person['contact']['email']

그리고 이렇게도 표현이 가능하다고 알려주시더라구요!

person['contact']['email']

이때는 ['키 값']이 없을 경우 오류가 발생할 수 있습니다.

person.get('contact',{}).get('email',{})

그래서 이렇게 쓴다고 하시는데, 왜인지는 아직 이해 못 했어요

튜터 님께 숙제로 받은 ".get('키 값', {})에서 중괄호를 넣는 이유"는

오후에 고민해보려구요 🧐 (14시까지 오라고 하셧움,,)

 

<문제 8. 딕셔너리 값에 리스트 포함하기  >

#딕셔너리 값에 리스트 포함하기
# 문제 8: 주어진 student_scores 딕셔너리에서 각 학생의 점수를 평균을 구하여 출력하세요. (고급)
# 출력 예시
#홍길동의 평균 점수: 87.67
#이영희의 평균 점수: 85.00
#김철수의 평균 점수: 92.33
student_scores = {
    '홍길동': [85, 90, 88],
    '이영희': [78, 82, 95],
    '김철수': [92, 94, 91]
}
홍 = student_scores.get('홍길동')
이 = student_scores.get('이영희')
김 = student_scores.get('김철수')

# 1트
print(avg("홍길동의 평균 점수:" "홍","이영희의 평균 점수:" "이",
          "김철수의 평균 점수:" "김"))
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 118, in <module>
    print(avg("홍길동의 평균 점수:" "홍","이영희의 평균 점수:" "이",
          ^^^
NameError: name 'avg' is not defined

?????? 아니 Python에 avg()가 없어요?????

SQL에만 있는 거예요??????

 

# 2트
평균 = sum(student_scores) / len(student_scores)
print("평균")
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/딕셔너리 문제.py", line 122, in <module>
    평균 = sum(student_scores) / len(student_scores)
           ~~~^^^^^^^^^^^^^^^^
TypeError: unsupported operand type(s) for +: 'int' and 'str'
baeminkyung@baemingyeong-ui-MacBookAir Desktop %

'타입이 달라서 안 되는구나,,'

미치겠어요

와,, 머리가 안 굴러 가요 ㅠㅠㅠ

 

계속 머리를 굴리다가 점심 시간이 되어서 잠시 멈추었습니다..


오후 (14 : 00 ~ 18 : 00)

점심시간이 지난 후,

내일은 팀별로 발표가 있기 때문에 팀 회의가 조금 길어졌어요

16시부터 18시까지 회의를 하게 되어서

16시 전까지 발표장표를 각자 만들어 오기로 했거든요!

딕셔너리 (Dictionary).pdf
0.26MB

제일 마음에 드는 부분입니다

내일 제가 발표하기 때문에 파일을 계속 돌아보면서

모의 발표 연습도 해보았습니다

시간 정말 금방 가네요 😭


저녁 (19 : 15 ~ 21 : 00)

#딕셔너리 값에 리스트 포함하기
# 문제 8: 주어진 student_scores 딕셔너리에서 각 학생의 점수를 평균을 구하여 출력하세요. (고급)
# 출력 예시
#홍길동의 평균 점수: 87.67
#이영희의 평균 점수: 85.00
#김철수의 평균 점수: 92.33
student_scores = {
    '홍길동': [85, 90, 88],
    '이영희': [78, 82, 95],
    '김철수': [92, 94, 91]
}

저녁이 되어서는

오전에 풀다가 멈춘 8번 문제를 다시 보았습니다.

# 3트 - 튜터 님과 함께
for k in student_scores.keys():
    print(k)
total = 0

for v in student_scores.values():
    # print(v)
    total += v
    print(total)
    print(len(v))
    
# print(sum(v)) / len(v) -> for문 안이 아니라 밖에서 print() 돌려서 타입이 다름

튜터 님께서 딕셔너리에서 for문을 쓸 때는 달라진다고 하시더라구요

처음에는 무슨 말씀이신지 이해를 못 했는데

설명을 들으면 들을수록 느낌적으로 알 듯 말 듯 하더라구요 🤨

1시간 혼자 고민 하고

1시간 동안 튜터 님과 함께 교류하며

문제 해결 접근 방식을 논의해보았습니다

그래도 결론이 나지 않았지만요 😢

그래서

내일 마져 얘기 나누기로 했습니다!

저도 내일 발표 끝난 후 좀 더 생각해보고

내일 다시 얘기 해보려구요 ㅎㅎㅎㅎ

 

알듯 말듯한 이 기분이 간질거리고 흥미로워서

너무 재밌습니다 ㅎㅎ

배우면 배울수록 더 잘하고 싶어요 💪🏻


마무리

오늘이 제일 시간 빨리 갔던 거 같아요

튜터 님과 배움을 이어가던 중

오랜만에 list 얘기가 나왔는데, 뇌정지 왔어요 ㅋㅋㅋㅋㅋ

요즘 딕셔너리랑 for문만 보니까 기억이 안 나더라구요

튜터 님께서 당연히 지금은 익숙치 않아서 떠오르지 않다고 해주셔서 감사했습니다

갈고 닦아서 보석 같은 사람이 될게요 🤪

많이 혼내주시고 많이 가르쳐 주세요 😘

꾸준한 제가 되겠습니다!

감사합니다!

인사말

안녕하세요!
오늘은 문제를 더 많이 풀어보면서
제 코딩 실력을 확인하고, 증진하려고 해요!

하루종일 문제를 풀어댈 거랍니다 😋


오전(09 : 00 ~ 13 : 00)

오늘은 튜터 님께 어제 받은 6가지 문제를 풀어보았어요!

개념 강의는 많이 들었지만,

막상 문제를 풀려고 하니까 막막하더라구요..??

코드를 전혀 짜내질 못 했습니다 👀

 

그래서

이전에 공부하면서 손으로 적어두었던

노트와 python 자료들을 하나하나 다시 읽으면서 해보았어요

#1 숙제
Hello World를 5번 출력
#1 Hello World를 5번 출력
a = 5
print(type(a))
while a > 0:
    print("Hello World")
    a -= 1
    
#결과값
<class 'int'>
Hello World
Hello World
Hello World
Hello World
Hello World

 

a = 5라고 입력한 이유가

총 5번을 반복하려고 했기 때문에 넣었구요

혹시 타입이 뭘로 나오는지도 궁금해서 해봤습니다

정수로 표시되는 Int()로 나오더라구요!

그리고

조건식이 거짓이 되면 계산이 종료되는  while을 작성 후

범위값이 없으면 무한동력으로 돌아가기 때문에

a > 0:으로 범위값 설정해주고

제가 원하는 print("Hello World")를 입력해주었습니다

마지막으로

a 값이 점점 줄어들기 위하여

a -= 1이라는 조건을 넣어서 완성하였습니다!


#4 숙제
Hello World 4번 출력
b = [1,2,3,4]
print(type(b))
for i in b:
    print("Hello World")
    if b != [1,2,3,4]:
        break
        
#결괏값
<class 'list'>
Hello World
Hello World
Hello World
Hello World

앞서 동일안 문제이지만 이번엔 다르게 풀어보았습니다

for을 사용하여 풀어보았는데요!

for은 리스트, 튜플, 문자열을 받아서 하기 때문에

b = [1,2,3,4]로 설정하였습니다! 총 4개를 출력할 거니까요

b가 list로 잘 들어갔는지 type()으로 확인해주고

for i in b:

출력하려는 print("Hello World")을 입력 후

for은 순차적으로 계속 순회하기 때문에 break를 써서 멈춰주었습니다.

멈추기 위하여 조건식을 붙여줬구요

if b != [1,2,3,4]:

break으로요!

list에 4개의 값이 있기 때문에 결괏값에도 Hello World가 4개 출력되었습니다!

너무 재밌네요!


#5 숙제
numbers = [1, 2, 3, 4, 5]
순회를 돌아 numbers 요소 출력
#5 순회를 돌아 numbers 요소 출력
numbers = [1,2,3,4,5]
for i in numbers:
    print(i)
    
#결괏값
1
2
3
4
5

"순회"라는 단어에 힌트를 얻어서 for문으로 완성하였습니다

for문은 리스트, 튜플, 문자열 타입을 순차적으로 순회하죠?

그래서 for문 양식대로 입력하여 원하는 결괏값을 도출하였습니다.


#6 숙제
1부터 4까지 합 계산
e = [1,2,3,4]
print(sum(e))

#결괏값
10

[]이 괄호를 사용하면 그 값은 리스트가 되잖아요?

튜플()로 입력하려다가 값이 바뀔수도 있기 때문에

[]괄호를 써서 입력하였습니다

그 뒤로는 print(sum(e))를 작성하여 결괏값을 도출하였습니다.


#2 숙제
1부터 44까지 짝수만 출력
#2 1부터 44까지 짝수만 출력
c = 1
while c <45:
    if c %2 == 0:
        print(c)
    c += 1

#결괏값
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44

c로 시작 숫자를 알려주고

While c > 45:라는 범위값을 설정한 후

if c%2 ==0: 이면 짝수죠? 그래서 조건식을 붙였습니다

print(c)를 해준 뒤

c 값이 +=1 씩 증가할 거라고 조건식도 넣어주었습니다

그리하여 1 ~ 44까지의 범위 중 짝수들만 도출하였습니다!


#3 숙제
1부터 44까지 짝수는 *4, 홀수는 그냥 출력
#3 1부터 44까지 짝수는 * 4, 홀수는 그냥 출력 (모르겠음)
f = 1
while f <45:
    if f %2 == 0:
        if f %2 != 0:

여기서 뇌정지 왔습니다.. 모르겠더라구요

그래서 점심시간(13:00 ~ 14:00) 되기 전까지

계속 컨펌 받으면서 문제를 풀어 보았습니다.

 

[추가 숙제_1]
for문, range 함수를 사용해서 2부터 44까지 출력
g = range(2,45,1)
for i in g:
    print(i)
    
#결괏값
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
32
33
34
35
36
37
38
39
40
41
42
43
44

range()함수를 마침 어제 배웠어서

아직은 따끈따끈하게 머리에 남아있었어요

그래서

g = range(2,45,1)로 하였고

for i in g:

print(i)를 하여 2부터 44까지 결괏값을 도출했습니다.

range()를 직접 써보니까 편하더라구요!

금방 숫자들이 우다다 나와서 편했습니다

 

[추가 숙제_2]
for문, range 함수를 사용해서 
2부터 44까지 짝수 출력
#3번을 풀기 위한 절차_2_짝수만
h = range(2,45,2)
for i in h:
    print(i)
    
#결괏값
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44

짝수만 출력할 거기 때문에

range(시작, 끝, 스탭) 중 스탭의 값을 2로 해주었습니다

h = range(2, 45, 2)

for i in h:

print(i)를 하니까 짝수만 도출되었습니다!

 

[추가 숙제_3]
1부터 44까지 짝수만 출력_for, range, if문으로
#2 1부터 44까지 짝수만 출력_for, range, if문으로
j = range(1,45,1)
for i in j:
    if i % 2 == 0:
        print(i)
        
#결괏값
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44

이번에는 if문이 추가 되었습니다

range()로 범위값 설정해주고 for i in j:로 완성 후

if 조건문

if i %2==0:일 때 print(i)가 되도록 하였습니다

원하는 값도 그대로 도출되었구요!

이렇게 추가 숙제를 받으니까 숙제3 번도 풀 수 있겠지! 하고 다시 풀어봤습니다.

계속 문제로 던져주시면서 스스로 깨닫게 도와주셔서 튜터 님께 넘 감사하더라구요 ㅠㅠ

감사합니다 튜터 님 ㅠㅠㅠ ❤️

 

#숙제3
#1부터 44까지 짝수는 * 4, 홀수 그냥 출력
#3 1부터 44까지 짝수는 *4, 홀수는 그냥 출력_Retry
k = range(1,45,1)
for i in k:
    if i %2 == 0:
        print(i*4)
    if i %2 != 0:
        print(i)
        
#결괏값
1
8
3
16
5
24
7
32
9
40
11
48
13
56
15
64
17
72
19
80
21
88
23
96
25
104
27
112
29
120
31
128
33
136
35
144
37
152
39
160
41
168
43
176

해낸 제 자신한테도 너무 신기했어요!!! 진짜 재밌더라구요!!

역시 하다보면 재미를 붙일 거 같았습니다!

너무 짜릿하고 너무 행복했어요!! 😖

여기까지 올 수 있게끔 도와주신

팀원 분들, 9기 동기 분들, 튜터 님께 압도적 감사 인사를 드립니다 ㅠㅠ ❤️


오후 (14 : 00 ~ 16 : 00)

오후 시간이 되자마자 코드를 왜 이렇게 짰는지 설명 드렸어요!

컨펌 받은 문제는 이거였습니다!

#4 Hello World를 4번 출력
b = [1,2,3,4]
print(type(b))
for i in b:
    print("Hello World")
    if b != [1,2,3,4]:
        break

제가 여기서 for문을 썼죠?

for문에는 리스트 안에 있는 개수가 곧 횟수이기 때문에

굳이 break를 넣지 않아도 된다고 하시더라구요!

그러시면서 화면 공유로 예시를 들어서 설명 해주시는데 🥹

이해가 쏘옥 쏙쏙 잘 돼서 감격스러웠습니다 😖

역시! 매번 느끼지만,

모르겠을 땐 이해 될 때까지 질문하는 게 짱이에요!

 

컨펌의 결론은!

for문과 while문의 차이점을 알면 좋겠다고 하셨어요

그리고

for문과 range()함수를 같이 쓰면 편한데,

이 이유를 몸소 문제를 풀면서 깨달으면 좋을 거 같다는 말씀과 함께

숙제 4개를 더 받았습니다 ㅎㅎ;

그리고

for문을 쓸 때 in 뒤에 바로 range() 넣으면 편하다고 해주셨습니다!

다음엔 in 뒤에 바로 적용 해보려구요!

 

챙겨주시고, 마음 써주시는 튜터 님께 감사의 말씀 전하옵니다 🫶

 

저!

많이 틀릴 거구요!

많이 배워가겠습니다!

냠미~😋


오후2 (16 : 00 ~18 : 00) ~ 저녁 (19 : 00 ~ 21 : 00)

오늘은 Chat GPT가 만들어준 딕셔너리 문제들을 팀원분들과 풀어보고 해설하기로 해서

튜터 님께서 주신 문제는 내일 풀 예정이구요!

이제부터는 딕셔너리 문제를 풀어볼 겁니다!

 

문제는 Chat GPT한테 내달라고 해서 얻어냈구요

초급 ~ 고급까지 총 10문제 받았습니다

오늘은 초급 2문제 중급 2문제만 풀어보았습니다!

 

<문제 1_초급>

# 문제1 : 주어진 `student` 딕셔너리에서 학생의 이름과 점수를 출력하는 프로그램을 작성하세요.
# student = {'name': '홍길동','age': 20,'score': 85}
# 출력 예시
# 이름: 홍길동, 점수: 85

student = {
    'name': '홍길동',
    'age': 20,
    'score': 85}

print("이름:", student['name'],"점수:", student['score'])
#결괏값
이름: 홍길동 점수: 85

출력값에 "이름: 홍길동 점수: 85" 이렇게 출력해야 하잖아요

print("홍길동") 이렇게는 익숙한데 클론이 들어간 문장 만들기는 낯설더라구요

그래서

print("이름:", student['name'],"점수:", student['score'])

이렇게까지 시행착오가 많이 일어났습니다..

print("이름": student['name'],"점수": student['score'])
print("이름":, student['name'],"점수":, student['score'])
print("이름:", student['name'],"점수:", student['score'])

변천사입니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

헷갈려 하는 모습이 눈에 잘 보여서 너무 웃기네요

어쨌든 해냈고! 알아내서 오히려 좋았습니다 😋

더 많이 틀려볼 예정입니다.

 

<문제 2_초급>

# 문제2 주어진 딕셔너리에서 score 값을 90으로 수정하고, 전체 딕셔너리를 출력하세요.
# student = {'name': '김철수','age': 22,'score': 78}
# 출력 예시 : {'name': '김철수', 'age': 22, 'score': 90}

student_2 = {'name': '김철수','age': 22,'score': 78}
student_2['score'] = 90
print(student_2)
#결괏값
{'name': '김철수', 'age': 22, 'score': 90}

우연찮게 유튜브로 "1분 파이썬 (22) 딕셔너리"를 보게 되어서

https://www.youtube.com/playlist?list=PLMsa_0kAjjrcxiSJnHNfzBN71D3zpYtkX

자주 쓰이는 메쏘드들을 막 배웠거든요!

그게 생각이 나서 바로 적용하였습니다

student_2['score'] = 90

추가하거나 수정할 때

student_2['key'] = 'value' 를 쓰면 됩니다!

 

<문제 3_중급>

# 문제 3: student 딕셔너리에 새로운 항목 major (전공)을 추가하고 출력하는 프로그램을 작성하세요. (중급)
# student = {'name': '이영희','age': 21,'score': 92}
# 출력 예시 : {'name': '이영희', 'age': 21, 'score': 92, 'major': '컴퓨터공학'}

student_3 = {'name': '이영희','age': 21,'score': 92}
student_3['major'] = '컴퓨터공학'
print(student_3)
student_3['major'] = '컴퓨터공학'

앞서  추가 및 수정 할 때 student_2['key'] = 'value' 를 쓰면 됩니다!

 

<문제 4_중급>

# 문제 4: 주어진 딕셔너리에서 age 키를 삭제하고, 삭제된 후의 딕셔너리를 출력하세요. (중급)
# student = {'name': '박민수','age': 23,'score': 88}
# 출력 예시 : {'name': '박민수', 'score': 88}

student_4 = {'name': '박민수','age': 23,'score': 88}
del student_4['age']
print(student_4)
del student_4['age']
student_4.pop('age')

삭제하기는 del 및 .pop()를 쓰면 삭제가 가능합니다!


마무리

오늘은 12시간 중 10시간 동안 문제를 풀어보았습니다

문제를 풀어보는 게 확실히 더 많이 배우게 되는 거 같아요

내일도 튜터 님께서 주시는 4문제랑 남은 딕셔너리 6문제 풀어볼 겁니다!

 

틀림으로써 배우는 과정이 너무 재밌습니다!

내일은 더 힘내볼게요 ㅎㅎㅎ

감사합니다~!

 

인사말

안녕하세요!

오늘은 아침부터 비가 보슬보슬 내려서 어두컴컴하네요

비 온 뒤, 기온도 떨어지고 급작스런 겨울이 시작될 거 같네요 🥲

모두 감기 조심하시고, 연말이니만큼 파이팅입니다!

 

오늘도 12시간 동안 공부한 내용을 포스팅해보겠습니다!

12시간이기 때문에 본문 내용이 아주 아주 깁니다!

 


요약

1. 제어문과 반복문

  1. 제어문이란?
  2. 반복문이란?
  3. 명령문과 반복문의 결합
  4. 프로그래밍에서의 중요성

2. Python 조건문

  1. If문 (True일 때)
  2. else문 (False일 때)
  3. elif문 (여러 개의 조건을 순차적으로 검사할 때)
  4. 중첩 구조문(조건문 안에 또 다른 조건문 사용)

3. Python 반복문

  1. for문 (리스트, 튜플, 문자열을 기반으로)
  2. while문 (조건문이 참인 동안 반복, 조건식이 거짓이면 종료)
  3. break문 (반복문 내에서 특정 조건이 만족되면 더 이상 반복할 필요가 없을 때 사용)
  4. continue문 (현재 반복을 건너뛰고, 다음 반복을 이어감)
  5. range() 함수 (특정 범위의 숫자 시퀀스를 생성)
  6. 중첩 반복문 (대표적 예시 : 구구단)

4. 들여 쓰기

5. 함수의 개념

6. 프로그래머스 문제 풀이


1. 제어문과 반복문

1.1 제어문이란?

  • 개념 : 프로그램의 실행 흐름을 제어하는 것
  • 특징
    1. 코드의 특정 부분을 조건에 따라 실행하거나, 실행하지 않게 할 수 있음
    2. 제어문은 프로그램을 더욱 유연하고, 다양한 상황에 대처할 수 있도록 만듦

 

1.2 반복문이란?

  • 개념 : 반복되는 작업을 자동화하는 것
    • 예시
      1. 리스트의 모든 요소를 출력 (age가 30개 이상일 때)
      2. 1부터 10까지의 합을 구할 때
    • 반복문이 없다면, 같은 코드를 여러 번 작성해야 하는 비효율적인 상황이 발생함
    • 사용처
      1. 데이터 처리 : 리스트나 배열의 모든 요소에 대해 동일한 작업을 수행할 때
      2. 자동화 작업 : 일정한 패턴의 작업을 반복해야 할 때. (100번의 반복 작업을 수행해야 하는 경우)
      3. 조건에 따른 반복 : 특정 조건이 만족될 때까지 작업을 반복하는 경우 (사용자가 올바른 값을 입력할 때까지 계속 입력을 요구하는 경우)

 

1.3 제어문과 반복문의 결합

  • 특징
    1. 더욱 복잡한 논리 흐름을 만들 수 있음
      • 반복문 앞에서 조건문을 사용하여 특정 조건을 만족할 때만 반복을 계속하거나, 반복을 중단할 수 있음
  • 사용처
    1. 조건부 반복 : 특정 조건이 만족될 때까지 반복을 실행
    2. 반복 중 조건 처리 : 반복 과정 중 조건을 체크하여 특정 작업을 수행하거나, 반복을 중단하는 기능을 추가.

 

1.4 프로그래밍에서의 중요성

  1. 유연성 : 제어문과 반복문을 사용하면 프로그램이 다양한 상황에 대처할 수 있음
  2. 코드 재사용 : 반복문을 통해 동일한 작업을 여러 번 반복할 수 있으므로, 코드의 길이를 줄이고 유지보수를 쉽게 할 수 있음
  3. 자동화 : 반복문을 활용하여 대량의 데이터 처리나 반복 작업을 자동화할 수 있음

2. Python 조건문

  • 개념 
    • 프로그램에서 주어진 조건에 따라 특정 코드 블록을 실행하거나 건너뛰는 기능을 함
    • 조건문을 통해 프로그램은 단순한 순차적 실행을 넘어서 결정을 할 수 있게 됨

2.1 If문

  • if 뒤에는 조건이 오고, 조건이 참(True)이면 해당 코드 블록이 실행됨.
if 조건식:
	실행할 코드
#If문
age = 20
if age > 19:
     print("성인입니다")
#결괏값 = 성인입니다

여기서 포인트가 되는 것은

하나의 코드를 입력 후 들여 쓰기를 해서 Print()를 하게 된다면

해당 코드에 관한 Print()가 됩니다!

들여 쓰기를 유용히 쓰면 될 거 같네요!

 

  • if문 예시
#If문 실습
## 사용자로부터 나이를 입력받아 성인인지 아닌지 판단하는 프로그램
age = int(input("나이를 입력하세요: "))

반드시 Int()를 입력하여야 문자열을 정수로 변환해 주기 때문에 꼭!! 입력하셔야 합니다!

 

  • 실습
#If문 실습
age = 20
if age >= 18:
     print("성인입니다")
#결괏값 = 성인입니다

 

2.2 else문

  • 개념 : else문은 if문의 조건이 거짓(False) 일 때 실행되는 코드 블록
  • else문 예시
if 조건식 :
 실행할 코드 (조건이 참일 때)
 else :
  실행할 코드 (조건이 거짓일 때)

 

  • 실습
#If + else문 실습
age = 17
if age >= 18:
     print("성인입니다")
else:
     print("미성년자입니다.")
#결괏값 = 미성년자입니다.

 

2.3 elif문

  • 특징
    1. 여러 개의 조건을 순차적으로 검사할 때 사용함
    2. if문 다음에 여러 개의 elif문을 사용하여 각 조건을 순서대로 검사함
    3. 처음으로 참인 조건이 발견되면 해당 코드 블록이 실행됨
  • 주의점
    • 큰 값이 위로 올라와야 하며 밑으로 내려갈수록 작은 값이어야 함!
  • elif문 예시
if 조건식1:
	실행할 코드1
elif 조건식2:
	실행할 코드2
elif 조건식3:
	실행할 코드3
else:
	실행할 코드4 (모든 조건이 거짓일 때)

 

  • 실습
#If + elif + else문 실습
age = 31
if age > 19:
    print("성인입니다.")
elif age > 30:
    print("확실한 성인입니다.")
else:
    print("미성년자입니다.")
#결괏값 = 성인입니다.

age가 31인데 결괏값이 "확실한 성인입니다."가 나오지 않았죠?

왜냐하면

elif문은 순차적으로 검사하기 때문에 그렇습니다.

 

그렇기 때문에 이렇게 수정해 준다면

#If + elif + else문 실습2 
age = 31
if age > 30:
    print("확실한 성인입니다.")
elif age > 19:
    print("성인입니다.")
else:
    print("미성년자입니다.")
#결괏값 = 확실한 성인입니다.

원하는 "확실한 성인입니다"가 도출됩니다!

 

2.4 중첩 구조문

  • 개념 : 조건문 안에 또 다른 조건문을 사용할 경우
  • 중첩 구조문 예시
#중첩 구조문
if 조건식1:
	if 조건식2:
    	실행할 코드1
    else:
    	실행할 코드2
else:
	실행할 코드3

 

  • 실습
#중첩 구조문1
age = 25
name = "배민경"

if age > 20:
    if name == "배민경":
        print("그래요, 저예요!")
#결괏값 = 그래요, 저예요!
#중첩 구조문2
age = 25
name = "김민경"

if age > 20:
    if name == "배민경":
        print("그래요, 저예요!")
    else:
        print("없어요")
#결괏값 = 없어요

중첩 구조문을 개념으로만 들었을 땐 짜증 났는데

직접 해보니까 재밌네요 😋

 

  • 중첩 구조문 심화 실습
#사용자로부터 나이와 학생 여부를 입력받아 상태를 출력하는 프로그램
age = int(input("나이를 입력하세요: "))
is_student = input("학생입니까? (yes/no): ")

if age >= 18:
	if is_student.lower() == "yes";
    	print("성인이며, 학생입니다.")
    else:
    	print("성인이며, 학생이 아닙니다.")
else:
	if is_student.lower() == "yes"
    	print("미성년자이며, 학생입니다.")
    else:
    	print("미성년자이며, 학생이 아닙니다.")

이 프로그램은 나이와 학생 여부에 따라 다양한 메시지를 출력하고, 소문자로 출력합니다.

 

  • 추가 개념
#and를 써서 똑같은 결괏값 도출하기
age = 25
name = "배민경"
if age > 20 and name == "배민경":
    print("그래요, 저예요!")
#결괏값 = 그래요, 저예요!

이렇게 and를 써서도 도출해 낼 수 있다는 것도 배웠습니다!


3. Python 반복문

  • 개념 : 프로그램 내에서 동일한 코드 블록을 여러 번 실행할 수 있도록 하는 구조
  • 특징
    1. 코드의 중복을 줄이고, 효율적인 프로그램을 작성할 수 있음
    2. 가장 기본적인 반복문은 for문과 while문임

 

3.1 for문

  • 개념 : 컬렉션(리스트, 튜플, 문자열)을 순차적으로 순회하여 코드 블록을 실행
#반복문
## for문 (컬렉션 기반)
for 변수 in 컬렉션:
	실행할 코드

 

  • for문 예시
#반복문
## for문 (컬렉션 기반)
list_sample = [2,4,6,8,10]

for element in list_sample:
    print(element)
#결괏값 = #2 4 6 8 10
## for문 (문자열)
list_sample_2 = "안녕"

for a in list_sample_2:
    print(a)
#결괏값 = 안 녕

그리고!

컬렉션 명 이름이 아니라 컬렉션 그 자체가 들어가도 결괏값이 도출됩니다!

또한 결괏값이 각각 낱개로 도출되더라구요

신기했습니다 🤨

 

  • for문 실습
## for문 (제곱 실습)
numbers = [5,6,7]

for number in numbers:
    square = number ** 2
    print(f"{number}의 제곱은 {square}입니다.")
#결괏값
5의 제곱은 25입니다.
6의 제곱은 36입니다.
7의 제곱은 49입니다.

 

3.2 while문

  • 개념 : 조건식이 인 동안 반복해서 코드 블록을 실행
  • 특징 : 조건식이 거짓이 되면 반복문이 종료됨.
## while문 (조건식이 참일 때 실행, 거짓이면 종료)
while 조건식:
	실행할 코드

 

  • while문 예시
## while문 (조건식이 참인 동안 실행됨, 거짓이 되면 종료됨)
age = 15

while age < 20:
    print("나이를 먹었습니다")

이 상태에서 실행을 한다면 무한 동력으로 실행된다고 하더라구요

이런 걸 활용할 때는 게임 서버를 운영할 때 쓰이는 구조라는 걸 배웠습니다!

 

하지만, 저희는 서버를 운영하는 것이 아니라

공부하기 위함이기 때문에 좀 더 붙여주었습니다.

## while문 (조건식이 참인 동안 실행됨, 거짓이 되면 종료됨)
age = 15

while age < 20:
    print("나이를 먹었습니다", age)
    age = age + 1
#결괏값
나이를 먹었습니다 15
나이를 먹었습니다 16
나이를 먹었습니다 17
나이를 먹었습니다 18
나이를 먹었습니다 19

언젠가 멈추어야 하기 때문에 거짓된 값을  만들어주어야 합니다!

재밌어요!

정말 코드를 자세히 쓸 때마다 결괏값이 달라진다는 게

너무 재밌습니다 😁

 

  • while문 실습
## while문 실습1
age = 15
while age <= 20:
    print(age)
    age += 1
15
16
17
18
19
20
## while문 실습2
age = 15
while age <= 20:
    age += 1
    print(age)
16
17
18
19
20
21

결괏값이 이렇게 두 가지로 나오게 되었습니다

이게 참이 되는 조건문이랑

조건문이 거짓이 되는 문장의

위치에 따라 결괏값이 달라지더라구요 

이 점을 주의해서 코드를 활용해야겠습니다!

 

  • 다르게 표현해 보기 (list)
## while을 다르게 표현해보기
start_position = 0
while start_position < len(list_sample):
    print(list_sample[start_position])
    start_position += 1
2
4
6
8
10

 

3.3 break문

  • 개념 : 반복문을 즉시 종료시킴
  • 특징 : 반복문 내에서 특정 조건이 만족되면 더 이상 반복할 필요가 없을 때 사용함

 

  • break문 예시
## break문 (반복문 자체를 멈추고 싶을 때)
a = 0

while a < 100:
    condition = int(input("10을 입력하면 출력이 안 돼요!"))
    if condition == 10:
        break
    a += 1
10을 입력하면 출력이 안 돼요!1
10을 입력하면 출력이 안 돼요!2
10을 입력하면 출력이 안 돼요!3
10을 입력하면 출력이 안 돼요!10
baeminkyung@baemingyeong-ui-MacBookAir Desktop %

break는 10을 입력하자마자 반복문이 끝나버렸습니다.

아예 반복문을 끝내고 싶을 때 반복문 밑에

break를 써주시면 됩니다!

  • for문에서도 사용 가능한 break
### for문에서도 사용 가능한 break
list_sample_3 = [1,2,3,4,5,6]

for i in list_sample_3:
    print(i)
    if i == 4:
        break
1
2
3
4

for문을 써도 적용이 가능하네요!

그냥 반복문 전체에서 사용 가능하기 때문에

여기저기 다 붙여 쓰시면 됩니다!

 

3.4 continue문

  • 개념 : 현재 반복을 건너뛰고, 다음 반복을 이어감
  • 특징 : 특정 조건에서 코드 블록의 일부를 실행하지 않고 다음 반복으로 넘어가고 싶을 때 사용

 

  • continue문 예시
## continue문 (특정 조건이 들어와도 다시 반복)
a = 0

while a < 100:
    condition = int(input("10을 입력하면 출력이 안 돼요!"))
    if condition == 10:
        continue
    print("hi")
    a += 1
10을 입력하면 출력이 안 돼요!10
10을 입력하면 출력이 안 돼요!10
10을 입력하면 출력이 안 돼요!2
hi
10을 입력하면 출력이 안 돼요!9
hi
10을 입력하면 출력이 안 돼요!10
10을 입력하면 출력이 안 돼요!

반면에 continue를 쓰게 되면 계속 반복문이 반복되는 걸 알 수 있습니다

break는 단어 그대로 끝! 내는 거고

continue도 단어 그대로 이어져 가는 거네요! 😉

 

3.5 range() 함수

  • 개념 : 특정 범위의 숫자 시퀀스를 생성함
  • 특징
    1. for문과 함께 자주 사용됨
    2. 반복 횟수를 지정할 때 유용함
# range() : 특정 범위의 숫자 시퀀스 생성
for i in range(시작, 종료, 단계):
	실행할 코드
  • 시작 : 시작할 숫자 (기본값 0).
  • 종료 : 종료할 숫자 (해당 숫자는 포함되지 않음).
  • 단계 : 숫자 간의 간격 (기본값 1).
  • range() 예시
# range()_1
for e in range(0,10,2):
    print(e)
2
4
6
8

이번 거는 range() 함수 안에 3개의 값 모두 서술한 경우이고,

# range()_2
for e in range(10):
    print(e)
0
1
2
3
4
5
6
7
8
9

이번 거는 range() 함수에 한 가지 값만 넣었더니

0부터 9까지 출력되었습니다!

한 가지 값만 넣으면 그 값이 "종료"값이 되네요! 😮

 

  • 몇 번째의 값인지 확인해 보는 코드
# range()_3
for e in range(len(list_sample_3)):
    print(list_sample_3[e])
    print(e,"번째")
1
0 번째
2
1 번째
3
2 번째
4
3 번째
5
4 번째
6
5 번째

list_sample_3에는 총 6개의 값이 들어가 있었음을 알 수 있네요!

재밌습니다 🤗

좀 더 보기 좋게 출력하려면

# range()_4
for e, f in enumerate(list_sample_3):
    print(e,f)
0 1
1 2
2 3
3 4
4 5
5 6

enumerate()를 써주시면 더 가독성이 좋아지게 도출됩니다!

 

3.6 중첩 반복문

  • 개념 : 반복분 안에 또 다른 반복문을 사용하는 것(=Nested Loop)
  • 특징
    1. 2차원 데이터 (예 : 행렬)를 처리할 때 씀
    2. 복잡한 반복 작업을 수행할 때 유용함
# 중첩 반복문
for i in range(첫 번째 범위):
	for j in range(두 번째 범위):
    	실행할 코드

 

  • 중첩 반복문 예시 (구구단)
# 중첩 반복문 (구구단)
for i in range(2,3):
    print(f"{i}단:")
    for j in range(1,10):
      print(f"{i} x {j} = {i*j}")
    print()
2단:
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

오늘 한 것 중에 제일 재밌었던

결괏값이었습니다 🤣


4. 들여 쓰기

  • 개념 : 코드의 각 줄을 왼쪽에서 오른쪽으로 일정한 간격만큼 일어내는 것
  • 특징
    1. Python에서 들여 쓰기는 필수적
    2. Python은 들여 쓰기를 통해 코드 블록의 시작과 끝을 구분함
    3. 들여 쓰기가 잘못되면, Python 인터프리터가 코드의 구조를 이해하지 못하여 오류를 발생시킴
    4. 조건문, 반복문, 함수 등의 모든 구조적 코드에서 필수적으로 사용됨
    5. 들여쓰기가 오류가 생기면 indentationError라고 뜸
  • 규칙 
    1. 일관된 들여쓰기
    2. 공백 4칸이 표준
    3. 탭과 공백(띄어쓰기)의 혼용 금지
  • 들여쓰기 예시
#들여쓰기 예시

if True:
	print("이 코드는 실행됩니다.")
#결괏값 = 이 코드는 실행됩니다.

 

<조건문과 들여 쓰기>

# if문과 else문, elif문도 마찬가지

if 조건식:
    실행할 코드  # 조건이 참일 때 실행
else:
    실행할 코드  # 조건이 거짓일 때 실행

 

<반복문과 들여 쓰기>

# for문과 while문

for 변수 in 컬렉션:
    실행할 코드  # 반복할 코드 블록

while 조건식:
    실행할 코드  # 조건이 참인 동안 반복될 코드 블록

 

<함수 정의와 들여 쓰기>

# def 함수이름(매개변수)

def 함수이름(매개변수):
    실행할 코드  # 함수 본문

5. 함수의 개념

  • 개념 : 특정 작업을 수행하는 코드 블록을 정의하는 프로그래밍 구성 요소
  • 특징
    1. 함수는 각기 이름을 가지고 있고, 필요할 때마다 그 이름을 호출하여 코드 실행
    2. 함수는 입력값(매개변수)을 받아 처리하고, 결괏값을 반환할 수 있음
  • 함수의 사용처
    1. 반복되는 코드의 재사용
    2. 코드의 모듈화
      • 이때 모듈화란?
        • 프로그램을 여러 개의 작은 함수로 분할하여, 각 함수가 하나의 특정한 작업만 수행하도록 하는 것
    3. 복잡한 작업의 분할
  • 장점
    1. 코드 재사용성
    2. 가독성
    3. 유지보수 용이성
    4. 테스트 및 디버깅 용이성
  • 주의점
    1. 함수는 단일 작업을 수행하도록 설계해야 함
    2. 매개변수 수를 적절히 유지
    3. 함수 이름은 기능을 명확히 표현
    4. 부작용을 최소화

6. 프로그래머스 문제 풀이

처음에 못 풀었습니다 🙉

 

3번째 줄에서 멈추었는데요

\n을 입력하면 Enter 역할을 한다는 걸 배워서

3번째 줄에 \n을 입력하여 문제를 해결하였습니다 🙈

 

두 번째 문제는 무난히 풀었구요

 

마지막 문제 내용입니다

 

단순하게 생각해서 이렇게 입력하였더니

틀렸다고 해서

 

input()의 의미가 사용자가 입력하는 값을 넣겠다는 거니까

설마..? 하고

그냥 print(str) 입력하니까

 

정답이라고 떠서 해결하였습니다 👍🏻


마무리

오늘 정말 많이 공부한 거 같아요!!

정말 기네요! 😹

 

확실히 프로그래머에서 문제를 풀어봤기 때문에

저의 부족한 점과 이해 정도를 알게 됐어요!

프로그래머 해보라고 팀원분이 알려주셨는데

해보길 정말 잘했어요 🥰

 

개념을 공부한 것도 좋지만

문제를 먼저 켜보고 해결해 내는 게

저랑 맞는 공부법인 거 같아요!

덕분에 튜더 님이랑 다른 팀원분들과 소통을 많이 할 수 있어서

좋았습니다 🥰

 

내일도 문제 많이 풀어서 가져오겠습니다!

 

감사합니다~!

감기 조심하세요!


인사말

안녕하세요!

오늘부터 본캠프가 시작되는 날입니다.

그래서 오늘 12시간 동안 새로운 팀원들과 함께 공부하였습니다.

12시간 중에서 6시간 정도 집중했어요!

오전에는 OT가 있었기에 점심 식사 시간과 저녁 식사 시간을 제외한 나머지 시간 동안은 열심히 집중했답니다 😋

개인 공부를 진행하며, 모르는 부분이 생기면 서로에게 물어보면서 배워나갔습니다.

제가 모르는 점을 바로 물어볼 수 있다는 점이 너무 좋았습니다🫶

상시 튜터 님들과 매니저 님이 곁에 계셔서 든든하네요 😜

 

아무튼! 오늘부터는 Python 공부 내용을 포스팅 할 겁니다

잘 부탁드립니다 🙏🏻


요약

  1. 변수란?
  2. 변수 선언이란?
  3. 변수 할당이란?
  4. 컬렉션 자료형(리스트, 튜플, 딕셔너리, 셋)
  5. 명시적 타입 전환(int, float, str, bool)
  6. 컬렉션 타입 변환(list, tuple, set)
  7. 암시적 타입 변환(숫자형 데이터간의 연산)
  8. 타입 변환시 주의할 점🚨

1. 변수란?

변수 : 컴퓨터 프로그램에서 데이터를 저장하기 위해 사용되는 "이름이 붙은 저장 공간"

즉, 어떤 값을 저장해두고 필요할 때 그 값을 꺼내 사용하는 역할

name = "배민경"
age = 25

여기서 name과 age가 "변수"에 해당됩니다!


2. 변수 선언이란?

변수 선언 : 원하는 변수를 불러오는 행위

name = "배민경"
age = 25
print(name)

print()가 결괏값을 돌출하는 함수이고, 괄호 안에 있는 "name"을 선언함으로써

결괏값 : 배민경

이 됩니다!


3. 변수 할당이란?

변수 할당 : 변수 값을 지정해주는 행위이며, "="의 기호를 써서 할당한다.

*컴퓨터에서 "="는 "할당하다"를 의미하고, 수학에선 등호(=)의 의미가 됩니다.

greeting = "hello, world"

4. 컬렉션 자료형

  • 리스트(List)
  • 튜플(Tuple)
  • 딕셔너리(Dictionary)
  • 셋(Set)

 

  • 리스트(List)
    • 개념 : 여러 개의 항목을 순서대로 저장할 수 있는 가변 자료형
    • 표현법 : 대괄호[] 및 쉼표로 구분됨
    • 특징 : 순서가 있고, 가변적이며, 중복된 요소를 가질 수 있음
#리스트, 가변 (문자형은 수정 불가능)
number_list = [3,4,3.14,5,7]
print(number_list)
print(number_list[0])
print(number_list[0:2])
print(number_list[2:4])

print(number_list[0]) : 첫 번째 값 들고 오기
print(number_list[0:2]) : 첫 번째, 두 번째 값 들고 오기
print(number_list[2:4]) : 두 번째, 네 번째 값 들고 오기

#첫 번째 숫자 바꾸기
number_list[0] = 9
print(number_list)
#결괏값 = [9, 4, 3.14, 5, 7]


#값 추가하기
number_list.append(100)
print(number_list)
#결괏값 =[9, 4, 3.14, 5, 7, 100]


#값 지우기
number_list.remove(3.14)
print(number_list)
#결괏값 = [9, 4, 5, 7, 100]


#정렬하기
number_list.sort()
print(number_list)
#결괏값 = [4, 5, 7, 9, 100]


#len
print(len(number_list))
#결괏값 = 5

 

  • 튜플(Tuple)
    • 개념 : 리스트와 유사하지만, 한 번 생성되면 수정할 수 없는 불변 자료형
    • 표현법 : 소괄호()
    • 특징 : 순서가 있고, 불변적이며, 중복된 요소를 가질 수 있음
#튜플(Tuple), 불변
number_tuple = (3,1,5,4)

print(number_tuple)
#결괏값 = (3, 1, 5, 4)


print(number_tuple[0])
#결괏값 = 3


print(len(number_tuple))
#결괏값 = 4

 

  •  딕셔너리(Dictionary)
    • 개념 : 키-값 쌍(Key-value Pair)으로 데이터를 저장
    • 표현법 : 중괄호{} 및 각 키와 값은 클론(:)으로 구분
    • 특정
      1. 순서가 없으며, 키를 통해 접근함
      2. 가변적
      3. 키는 유일해야 함
      4. 값은 중복될 수 있음
#딕셔너리(Dictionary)
name_dict = {"이름":"민경", "성":"배"}
print(name_dict)
#결괏값 = {'이름': '민경', '성': '배'}


print(name_dict["이름"])
#결괏값 = 민경


#딕셔너리에 내용 추가하기
name_dict["나이"] = 25
print(name_dict["나이"])
#결괏값 = 25


#삭제하기
del name_dict["나이"]
print(name_dict)


#키 목록 확인하기
print(name_dict.keys())
#결괏값 = dict_keys(['이름', '성'])


#키 값 확인하기
print(name_dict.values())
#결괏값 = dict_values(['민경', '배'])

 

  • 셋(Set) 
    • 개념 : 중복되지 않는 요소들의 집합을 나타내는 자료형
    • 표현법 : 중괄호{}
    • 특징 : 순서가 없고, 가변적, 중복을 허용하지 않음
#셋(set), 중복된 값이 없음
number_set = {1,2,3,4,5,5,6}
print(number_set)
#결괏값 = {1, 2, 3, 4, 5, 6}


#셋 추가하기
number_set.add(8)
print(number_set)
#결괏값 = {1, 2, 3, 4, 5, 6, 8}


#셋 삭제하기
number_set.remove(3)
print(number_set)
#결괏값 = {1, 2, 4, 5, 6, 8}


#셋 합집합
number_set_2 = {5,6,7,9,11}
print(number_set.union(number_set_2))
#결괏값 = {1, 2, 4, 5, 6, 7, 8, 9, 11}


#셋 교집합
print(number_set.intersection(number_set_2))
#결괏값 = {5, 6}

5. 명시적 타입 전환

  • Int() : 정수로 변환
  • Float() : 실수로 변환(소수)
  • Str() : 문자열로 변환
  • Bool() : True or False로 변환

 

1. Int() : 정수로 변환

#명시적 타입 전환

## int() : 정수화
### 실수를 정수로 변환
a = 3.14
b = int(a)
print(b)
#결괏값 = 3


### 문자열을 정수로 변환
c = "100"
d = int(c)
print(d)
#결괏값 = 100

 

2. Float() : 실수로 변환

## float() : 실수화
### 정수를 실수로
a = 10
b = float(a)
print(b)
#결괏값 = 10.0


### 문자열을 정수로
c = "3.14"
d = float(c)
print(d)
#결괏값 = 3.14

 

 

3. str() : 문자열로 변환

## str() : 문자열화
a = 10
b = str(a)
print(b)
#결괏값 = 10


print(type(b))
#결괏값 = <class 'str'>

여기서 새롭게 배운 내용이었어요!

강의를 시청하면서 배운 거기 때문에 '그렇구나~' 하면서 공부했는데

결괏값이 강사 님의 내용과 다르더라구요..?

맞게 됐는지 아닌지 모르겠어서, 팀원분들께 여쭤봤더니

print(type(b)) 해보라고 알려주시더라구요

  • Type() : 함수의 유형을 알려줌

그렇게 해서 str()로 제대로 변환 됐다는 걸 확인 할 수 있었습니다!

 

4. bool()

## bool() : None과 빈 문자열 = False , 그 외는 True
bool_test_1 = 0
bool_test_2 = ""
bool_test_3 = "hello"

print(bool(bool_test_1))
#결괏값 = False


print(bool(bool_test_2))
#결괏값 = False


print(bool(bool_test_3))
#결괏값 = True

6. 컬렉션 타입 변환

- 문자열을 리스트로 전환

1. list()

## list() : 문자열을 리스트로 전환
a = "hello"
b = list(a)
print(b)
#결괏값 = ['h', 'e', 'l', 'l', 'o']

 

2. tuple()

## tuple() : 리스트를 튜플로 변환
c = [1,2,3]
d = tuple(c)
print(d)
#결괏값 = (1, 2, 3)

 

3. set()

## set() : 리스트를 셋으로 변환 (중복 제거)
e = [1,2,2,3,4]
f = set(e)
print(f)
#결괏값 = {1, 2, 3, 4}

 


7. 암시적 타입 변환

  • 개념 : Python이 자동으로 데이터를 변환하는 경우
  • 특징 : 일반적으로 숫자형 데이터 간의 연산에서 발생함
# 암시적 타입 변환 : 연산

## 정수와 실수의 연산에서 발생하는 암시적 변환
a = 5
b = 2.0
c = a + b
print(c)
#결괏값 = 7.0


print(type(c))
#결괏값 = <class 'float'>

8. 타입 변환시 주의할 점🚨

  1. 문자열 변환 주의 : Int()를 쓸 때는 숫자여야 합니다!
    • 올바른 예시
a = "123"
b = int(a)
print(b)
#결괏값 = 123
  • 잘못된 예시
c = "abc"
d = int(c)
print(d)
#결괏값 =
Traceback (most recent call last):
  File "/Users/baeminkyung/Desktop/A.py", line 154, in <module>
    d = int(c)
ValueError: invalid literal for int() with base 10: 'abc'

 

 

2. 정밀도 손실 주의 : Int()를 쓰기 전, 숫자가 실수였을 때 소수점 이하의 값이 날라가는 것을 주의하셔야 합니다.

a = 3.99
b = int(a)
print(b)
#결괏값 = 3

 

3. 암시적 변환의 이해 : 코드의 의미를 명확히 하기 위해 명시적으로 변환하는 것이 좋을 때도 있습니다.


마무리

와~!

오늘 공부한 내용을 이렇게 정리해보니까, 뿌듯하네요

처음엔 Python이 너무 어려워서 '어떡하나,,' 했는데

막상 해보니까 해볼만 했습니다!

뭐든 처음이 두렵고 어려운 법이죠 ☺️

어쨌든 시도를 해봤다는 거고, 해냈다는 게 중요하지 않겠습니까!

 

긴 글 읽어주셔서 감사하고,

열심히 공부해준 저에게 칭찬을 해주고 싶네요!

수고 많으셨습니다 :)

 

인사말

안녕하세요~!

사전캠프도 이번주 금요일이 마지막이네요

아쉽게도 이번주 금요일엔 개인 사정이 있어서 참석은 못 하지만,

SQL의 마지막 문제는 풀어보았답니다!

오늘 공부한 내용도 포스팅 해보도록 하겠습니다!

ps. 부쩍 추워진 거 같으니, 감기 조심하세요 😘


🎁 마지막 연습 문제!

데이터 베이스가 될 파일 내용입니다.
마지막 문제_20241121배민경.sql
0.00MB

 

문제 1. 모든 주문의 주문 ID와 주문된 상품의 이름을 나열하는 쿼리를 작성해주세요!

select p.name, o.id
from products p
join orders o
on p.id = o.product_id;

이제는 "Join"을 어떻게 쓰는지 이해가 된 거 같아요!

막힘없이 쭈르륵 나열한 저를 보니까 기분이 좋았습니다 😋.

팀원분들이랑 대화를 나눴는데 "Join"만 쓸 때는 "Inner"를 내포하는 거라고 하더라구요

그래서

"left join"를 쓰는 게 아닐까 싶은 생각을 했습니다

좀 더 확실한 범위값에서 데이터를 갖고 오는 느낌?으로 이해했거든요 😎

 

문제 2. 총 매출(price * quantity의 합)이 가장 높은 상품의 ID와 해당 상품의 총 매출을 가져오는 쿼리를 작성해주세요!

select p.id, sum(p.price * o.quantity) as total
from products p
join orders o
on p.id = o.product_id
group by p.id
order by total desc
limit 1;

이렇게 킨 코드를 막힘없이 적어내린 저한테 너무 신기했어요 😋

sum이랑 avg랑 count를 쓸 때는 "group by"를 함께 적어줘야 한다는 거!

스스로 인지하고 있다는 느낌을 받아서 기분 좋았습니다

점점 익숙해져 가는 걸지두요? 😏

 

하지만, 틀렸죠?

제가 보여드린 코드는, 데이터가 작아서 가능했던 거였구요

데이터의 크기가 만일 컸더라면

select p.id, SUM(p.price * o.quantity) as 총매출
from products p
join orders o
on p.id = o.product_id
group by p.id
order by 총매출 DESC
LIMIT 1;

이렇게 Sum을 기입하여야 정확히 값을 불러와질 수 있음을 배웠습니다

 

문제 3. 각 상품 ID별로 판매된 총 수량(quantity)을 계산하는 쿼리를 작성해주세요!

select p.name, p.id, o.quantity
from products p
join orders o
on p.id = o.product_id;

저는 이번 문제들의 기준을 "Products" 파일로 작업하였습니다!

기준 파일을 정해놓고 작업을 하니까 편하더라구요!

그래서 막힘없이 코드를 만들어내지 않았을까 싶었어요 😊

 

하지만, 또 실수했죠?

"총 수량"이기 때문에

만일, 데이터 파일이 컸더라면 이번에도 Sum을 활용하는 게 맞았다고 생각합니다.

select o.product_id, SUM(o.quantity) as 총수량
from orders o
group by o.product_id;

 

문제 4. 2023년 3월 3일 이후에 주문된 모든 상품의 이름을 나열하는 쿼리를 작성해주세요!

select p.name
from products p
join orders o
on p.id = o.product_id
where o.order_date > '2023-03-03'
order by p.name desc;

"나열" 보자마자 'order by ~ desc 써야겠다'를 생각해낸 문제였습니다

아직은 SQL과 친해지는 과정이라서 그런지

코드를 짜낼 때마다 즐거움이 퐁~ 퐁~ 올라오네요

역시, 무엇이든지 새롭게 배우고 적응하고 공부한다는 행위 자체가

너무 즐겁고 성장해가는 저의 모습을 볼 수 있어서 좋습니다!

계속 공부하며 성장해나가는 저의 과정과 모습도 잘 담아보겠습니다 😋

 

문제 5. 가장 많이 판매된 상품의 이름을 찾는 쿼리를 작성해주세요!

select p.name, o.quantity
from products p
join orders o
on p.id = o.product_id
order by o.quantity desc
limit 1;

"가장 많이 판매된"이라는 문구를 보고

"limit"를 마지막에 작성함으로써 Best 1를 끌어온 문제였습니다

 

이번에도, Sum을 활용해야 했지 않았나 싶었어요

"가장 많이 판매된"이기 때문에 합해야 한다고 생각하거든요

그래서 팀원분들께 피드백 받은 후 수정하였습니다.

select p.name
from products p
join orders o on p.id = o.product_id
group by p.name
order by SUM(o.quantity) DESC
LIMIT 1;

 

문제 6. 각 상품 ID별로 평균 주문 수량을 계산하는 쿼리를 작성해주세요!

select p.id, avg(o.quantity) as avg_orders
from products p
join orders o
on p.id = o.product_id
group by p.id;

앞서 언급하였던 avg 때도 group by 쓰는 걸 잊지 않았구요

여기서 제가 계속 놓치는 걸 찾았습니다

한 번 오류가 나서 뭐가 문제인지 코드를 천천히 살펴보았는데,

select p.id avg(o.quantity) as avg_orders
select p.id, avg(o.quantity) as avg_orders

두 개의 차이점이 보이시나요?

그렇습니다

제가 계속 콤마(,)를 빼먹어서 오류가 나더라구요

이제부터 알았으니, 다음 코드를 짤 때는 더 신경쓰면서 해야 할 거 같습니다

저의 실수를 이렇게 알게 되어서 다행이에요!

 

오늘의 마지막 문제입니다!

문제 7. 판매되지 않은 상품의 ID와 이름을 찾는 쿼리를 작성해주세요!

select p.id, p.name
from products p
left join orders o
on p.id = o.product_id 
where o.id is null;

여기서 제가 틀린 코드를 짰더라구요..

지금 보고 계시는 코드는 수정이 완료된 코드구요.

이전에는

select p.id, p.name
from products p
join orders o
on p.id = o.product_id 
where o.quantity is null;

이렇게 작성하였습니다.

생각을 해보니까,

지금 데이터 파일의 크기가 작아서 가능한 거고,

실제로 보는 데이터들은 파일 크기가 클 테니까

명확한 범위값을 주는 게 맞다고 생각합니다!

이 부분을 간과하고 있었던 거 같아요

이제라도 알았으면 됐죠 😋


마무리

최근에 새로운 팀원분이 오셨는데

다른 데서 조금은 배우고 오셨다 하셨거든요

그 분의 데이터를 바라볼 때 관점과 저의 관점을 비교할 수 있어서

너무 좋았습니다

저의 부족한 관점이 무엇이고, 데이터를 바라볼 때 접근법을 어떻게 해야 할지

생각할 수 있었던 기회였거든요 😋

차차 발전해가고, 여럿 사람들과 대화를 많이 나누고 싶습니다

서로 발전해나갔으면 좋겠어요 🤗

 

이제 다음주부터는 본 캠프 내용으로 찾아뵙겠습니다!

감사합니다 🤗

 

<새롭게 알게 된 것들>

1. "Join"은 "Inner"의 개념을 내포하고 있음

2. 데이터 값이 클 때를 생각해야 함

3. left join을 잘 활용해보자!

4. "총", "모든"이 들어갈 땐 Sum을 활용하여 데이터 명확히 끌고 오기! 

인사말

안녕하세요!

벌써 SQL 걷기반의 마지막 퀘스트를 푸는 날이 왔네요

시원하면서도 섭섭합니다!

더 공부하고 싶고 더 알아가고 싶은데 걷기반 퀘스트는 끝이네요

본 캠프 가서 더 배우면 되겠죠! 😊


9) 💪🏻 아프면 안됩니다! 항상 건강 챙기세요!

데이터 베이스가 될 파일 내용입니다.
9) 아프면 안됩니다! 항상 건강 챙기세요!_20241120배민경.sql
0.00MB

 

문제 1. 테이블에서 각 성별(gender)에 따른 환자 수를 계산하는 쿼리를 작성해주세요!

select gender, count(id) as count_patients
from patients
group by gender;

 

문제 2. 테이블에서 현재 나이가 40세 이상인 환자들의 수를 계산하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where timestampdiff(year, birth_date, curdate()) >= 40;

여기서 새롭게 알게 된 게

curdate() current_date()같은 거라고 하더라구요

이렇게도 쓰는구나를 알 게 되었습니다!

 

문제 3. 테이블에서 마지막 방문 날짜(last_visit_date)가 1년 이상 된 환자들을 선택하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where timestampdiff(year, last_visit_date, curdate()) >= 1;

이제는 날짜를 계산할 때 timestampdiff()를 쓴다는 게 바로 떠올라서

기분이 굉장히 좋았습니다. 😉

'제대로 이해를 했구나!' 싶더라구요 ㅎㅎ

 

문제 4. 테이블에서 생년월일이 1980년대인 환자들의 수를 계산하는 쿼리를 작성해주세요!

select count(*) as count_patients
from patients
where birth_date like "198%";

like 활용할 수 있다는 게 좋았던 문제였습니다

다른 팀원분께서는 이렇게 표현하셨더라구요

SELECT COUNT(*) AS 환자수
FROM patients
WHERE birth_date BETWEEN '1980-01-01' AND '1989-12-31';

같은 문제더라도 다른 방식으로 코드를 짜서 결과값을 낼 수 있다는 게

재밌다고 느껴진 대화였습니다 ㅎㅎㅎ


10) 👆🏻 이젠 테이블이 2개입니다.

데이터 베이스가 될 파일 내용입니다.
10) 이젠 테이블이 2개입니다_20241120배민경.sql
0.00MB

 

문제 1. 현재 존재하고 있는 총 부서의 수를 구하는 쿼리를 작성해주세요!

select count(name)
from department;

 

문제 2. 모든 직원과 그들이 속한 부서의 이름을 나열하는 쿼리를 작성해주세요!

select * from employee as e
left join department as d
on e.department_id = d.id;

새로운 개념이 나와서 몇 시간을 고민했는지 모르겠더라구요

"Join"이라는 걸 처음 접하게 되었습니다!

테이블이 두 개지만 함께 데이터를 불러오고 싶을 때, "Join"를 쓴다고 하더라구요

"Join"도 종류가 다양했습니다.

그중에서 자주 쓰는 게 "Left join"라서 정리를 해보았습니다.

 

**Left Join**은 두 테이블을 결합할 때,

왼쪽 테이블의 모든 행을 유지하고,

오른쪽 테이블의 일치하는 행을 포함하는 방식으로

데이터를 가져온다는 것을 의미합니다.

따라서,

왼쪽 테이블에 있는 모든 행이 항상 결과에 포함되는 것이죠

오른쪽 테이블에 일치하는 데이터가 없는 경우는 NULL 값으로 채워진다고 합니다!

출처 : Chat GPT

예)

select * from employee as e
left join department as d
on e.department_id = d.id;

"From" 뒤에 오는 파일이 기준이 되는 테이블이 되는 거죠

"left join" 뒤에 오는 파일이 "From" 뒤에 오는 테이블과 일치하는 행을 데리고 오는 거구요

이걸 이해하는데 2시간이 걸렸습니다. 🤔

이해를 하지 못하니까 시작을 못하겠더라구요

그래서 오래 걸렸던 거 같아요

또한

처음 배울 때, 확실히 잡고 가는 게 나중에도 활용성이 높다고 생각을 해서

머리 쥐어뜯으며 공부했습니다 😂

 

어쨌든 해냈다는 게 중요한 거죠 😋

 

문제 3. '기술팀' 부서에 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

select e.name, d.name
from employee e
join department d
on e.department_id = d.id
where department_id = 103;

"기술팀"의 id가 103이라서 저는 103으로 표시하여 원하는 결과값을 만들어냈습니다!

다른 팀원분들은 '기술팀'으로 서술하셨더라구요!

문자로도 되고, 숫자로도 표시가 된다는 게 재밌었습니다 😋

그리고

"Join"을 쓸 때 "On"을 이용해서 조건을 줄 수 있어요!

기준이 되는 employee 파일과, 포함이 되는 department 파일의 공통되는 행의 내용이

Id와 department_id였기 때문에 "on" 뒤에는 "e.department_id = d.id"로 적어주시면

공통되는 department 값이 불러와집니다!

이때 "e.", "d."는 employee(=파일명)의 "e", department(=파일명)의 "d"입니다!

 

문제 4. 부서별로 직원 수를 계산하는 쿼리를 작성해주세요!

select d.name, d.id, count(e.department_id) as count_departments
from department d
join employee e
on d.id = e.department_id
group by d.id;

이번에는 알고자 하는 주요 내용이 "부서별" 직원 수이기 때문에

기준이 되는 파일을 "department"로 했습니다!!

그리고, count()를 쓸 때는 group by와 함께 쓰는 것도 잊지 말아주세용!

 

문제 5. 직원이 없는 부서의 이름을 찾는 쿼리를 작성해주세요!

select d.name
from department d
join employee e
on d.id = e.department_id
where e.department_id is null;

직원이 없는 부서가 없었기 때문에 결과값은 0이 나왔습니다.

이때 "Null"을 사용할 때 "="을 쓰면 원하는 값이 나오는 게 아니라 그냥 Null로 나오는 거더라구요

그래서 "Null"을 쓰실 때는 "Is"로 써주시길 바랍니다!

저는 여기서 "="을 썼죠!

이렇게 하면 안된답니다 😋

 

문제 6. '마케팅팀' 부서에만 속한 직원들의 이름을 나열하는 쿼리를 작성해주세요!

select e.name
from employee e
join department d
on d.id = e.department_id
where d.id = 102;

 


마무리

이렇게 오늘도 SQL 공부가 마무리 되었습니다!

오늘의 에러 사항은 "Join"을 이해하는 데에 있었습니다!

자주 사용되는 코드라고 하니까, 공부를 더 해봐야겠어요!

 

오늘도 새롭게 배우고, 깨닫게 되니까 도파민 뿜뿜해서 좋았습니다 ㅎㅎ

내일도 화이팅! 

이제 다음주 월요일(11/25)부터는 본 캠프가 시작되기 때문에

12시간 공부하게 될 예정입니다!

지금 것보단 훨씬 배운 내용이 많아질 걸 생각하니까, 얼른 공부하고 싶어지네요 😋

오늘 하루도 수고 많으셨습니다!

 

감사합니다!

 

<새롭게 배운 것들>

1. join ~ on ~ : 다른 테이블에서 데이터를 찾아올 때와 조건

2. Null을 활용하게 될 땐 이퀄(=)이 아닌 "Is"로 쓸 것

+ Recent posts