내일배움캠프/TIL

[TIL]250113_코드카타, 파이썬 베이직 라이브세션

dydatablog 2025. 1. 13. 22:26

FACTS :

  • ✅ 오전 SQL, 알고리즘 코드카타 각1문
  • [ ] 오후 QCC 3회차 복습
  • 오후 파이썬 라이브세션 복습
  •  오후 머신러닝 VOD강의 1주차 1-10까지

FEELINGS : 머신러닝 기초 강의를 듣기 시작했는데 너무 어려워서 기본서 책을 질러버렸다. 도저히 듣는것만으로는 머릿속에 안들어와서 필기를 하면서 들으려고 강의자료도 프린트하기 시작했다.

지난 주 TIL을 쓰면서 단계별 task를 짜는 것을 잘 못하는 것 같아서 구체적인 해결방안을 생각해봤다. 다른 분들을 보니 markdown이나 주석을 적극적으로 활용해서 단계를 나누는듯 했다. 나도 해봐야지.

⭐️코드 짤 때 mark down이나 #(주석)을 이용해서 문제의 조건을 모두 만족했는지 확인하기!

나중에 실무에서는 여러사람이 내 코드를 같이 보는 일이 많이 생길 수 있으니까 지금부터 습관을 잘 들여야겠다.

 

- FINDINGS 

입력값이 빈칸이면 조건문을 실행할 필요가 없으므로 맨 앞으로 빼서 걸러주기

dropna()의 기본값.dropna(axis = 'index', how = 'any')과 사용법, 특징

  • inplace = True : dropna가 적용된 DataFrame 자체에 dropna를 적용(인덱스는 업데이트되지 않음! reset_index로 인덱스를 다시 설정해야 함)
  • inplace = False : dropna가 적용된 DataFrame는 그대로 두고 dropna를 적용한 DataFrame을 return(default)

알고리즘 코드카타

이상한 문자 만들기

#중간 과정
def solution(s):
    answer = ''
    for i in range(len(s)):
        if (i+1) % 2 != 0:
            answer += s[i].upper()
        else:
            answer += s[i].lower()
    return answer

solution("try hello world")

#출력: 'TrY HeLlO WoRlD'
-> 정확성: 18.8

오답 이유: 문장 중간에 띄어쓰기가 여러번 들어갔을 경우

기댓값 : 'TrY_ _ _ _HeLlO_ _ _ _ _WoRlD'

출력값 : 'TrY_ _ _ _ hElLo_ _ _ _ _wOrLd'

-> 따라서 띄어쓰기까지 계산해야함.

def solution(s):
    answer = ''
    for j in s.split(' '):
        for i in range(len(j)):
            if (i+1) % 2 != 0:
                answer += j[i].upper()
            else:
                answer += j[i].lower()
        answer += ' '
    return answer[:-1]

solution("try    hello     world")

#출력 : 'TrY    HeLlO     WoRlD '
#다른 사람 풀이
def toWeirdCase(s):
    return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() for i, a in enumerate(x)]), s.split(" ")))

 

 

SQL 코드카타


82. Replace Employee ID With The Unique Identifier

SELECT eu.unique_id, e.name
FROM Employees e
LEFT JOIN EmployeeUNI eu ON e.id = eu.id

파이썬 베이직 라이브 세션 복습

실습 문제1)

#제출 코드
def word_frequency(text):
    word = text.split()
    word_count = {}
    for i in word:
        if i in word_count:
            word_count[i] += 1
        elif text == "":
            return "문자열이 비어 있습니다."
        else:
            word_count[i] = 1
    return word_count

# 테스트 1
text1 = "hello world hello python world"
print(word_frequency(text1))  

# 테스트 2
text2 = ""
print(word_frequency(text2))

-> 테스트 2를 만족시키지 못했다.

애초에 입력값이 빈칸이면 조건문을 실행할 필요가 없으므로 맨 앞으로 빼서 걸러주기

#정답 코드
def word_frequency(text):
    if not text:
      return ("입력한 문자열이 없습니다.")

    words = text.split()
    frequency = {}
    for word in words:
        if word in frequency:
            frequency[word] += 1
        else:
            frequency[word] = 1
    return frequency

# 테스트 1
text1 = "hello world hello python world"
print(word_frequency(text1))  
# 출력: {'hello': 2, 'world': 2, 'python': 1}

# 테스트 2
text2 = ""
print(word_frequency(text2))
# 출력: 입력한 문자열이 없습니다.

 

실습 문제2)

-> 시간이 부족해서 손도 못댔다.. 라이브세션이 끝나고 풀어봤는데 라이브 세션에서 이미 해설을 한번 들어서 그런지 마지막 출력 부분 빼고 쓸 수 있었다. 

라이브세션을 안들었으면 헷갈렸을 부분들:

 ✔️penguins.dropna(how = “any”, inplace = True) - inplace = True 옵션 사용

  • inplace = True : dropna가 적용된 DataFrame 자체에 dropna를 적용
  • inplace = False : dropna가 적용된 DataFrame는 그대로 두고 dropna를 적용한 DataFrame을 return(default)

dropna에서 inplace=True로 설정하면 결측치가 있는 행이 사라지지만, 인덱스는 업데이트되지 않는다.

따라서 reset_index로 인덱스를 다시 부여해야 한다.

(참고 :https://m.blog.naver.com/j7youngh/222845624447)

 

 ✔️penguins[["species", "sex", "bill_length_mm", "bill_depth_mm"]] - 이중리스트

 ✔️result[cond1 | cond2] - result[조건] 형태

#나의 풀이
import seaborn as sns

# Penguins 데이터셋 로드
penguins = sns.load_dataset("penguins")

#조건1 : Null값 제거
penguins = penguins.dropna()

#조건2 : 특정 컬럼 추출
result = penguins[['species', 'sex', 'bill_length_mm', 'bill_depth_mm']]

#조건3 : species가 "Adelie"이면서 bill_length_mm이 40 이상이거나, species가 "Chinstrap"이면서 bill_length_mm이 30 이하인 데이터
cond1 = (result['species'] == 'Adelie') & (result['bill_length_mm'] >= 40)
cond2 = (result['species'] == 'Chinstrap') & (result['bill_length_mm'] <= 30)

final_result = result[cond1|cond2]
print(final_result.shape)
#정답 코드
import seaborn as sns

# Penguins 데이터셋 로드
penguins = sns.load_dataset("penguins")

display(penguins.isna().sum())
penguins.dropna(how = 'any', inplace = True)

# 특정 열 선택
result = penguins[["species", "sex", "bill_length_mm", "bill_depth_mm"]]

# 'species'가 'Adelie' 면서 'bill_length_mm'이 40 이상이거나
# 'species'가 'Chinstrap'면서 'bill_length_mm'이 30 이하인 데이터 선택

cond1 = (result["species"] == "Adelie") & (result["bill_length_mm"] >= 40)
cond2 = (result["species"] == "Chinstrap") & (result["bill_length_mm"] <= 30)

final_result = result[cond1 | cond2]
print(final_result.shape) # (50, 4)

조건1부분의 null값 제거에서 나는 penguins = penguins.dropna() 으로 썼는데 정답과 결과값이 같아서 여쭤보니

dropna()의 기본 값이 .dropna(axis = 'index', how = 'any')라서 그렇다고 한다.