내일배움캠프/TIL(Today I Learned)

[2026/03/25] 내일배움캠프 13일차 TIL

sj68 2026. 3. 25. 20:33

오늘은 데이터 분석 입문 발제날이다. 한 주동안, 파이썬의 기본적인 코딩 실력을 길렀고 이제 pandas와 matplotlib을 이용하여 데이터 전처리와 시각화를 본격적으로 시작할 시간이다. 일단 이번주는 pandas 사용에 익숙해지는 시간을 가져보고, 추가적으로 SQL 강의도 틈틈히 들어야겠다.

 

1) 하샤드 수

하루에 코트카타 문제를 5개씩 풀며, 어느새 20번대에 접어들었다. 처음과 다르게 문제의 난이도가 점점 올라가고 있는 느낌이었다.

 

아이디어

1. 입력받은 x값을 str로 바꾸고, for 문을 이용해 자릿수 합을 계산

2. x값을 자릿수 합으로 나눠서 True, False를 반환

def solution(x):
    sum = 0
    for num in str(x):
        sum += int(num)
        
    if x%sum==0:
        return True
    else:
        return False

처음에 True를 true로 작성해서 오류가 생겼었는데, 파이썬은 대소문자를 구분하기 때문에 제대로 확인해야 한다는 것을 다시 한번 명심했다. 또한, 코드를 군더더기 없이 작성했다고 생각했는데 다른 사람의 코드를 살펴보니 한줄로 작성한 코드가 있었다.

def Harshad(n):
    return n%sum(int(x) for x in str(n)) == 0

처음에 코드를 한번 훑어보고 if문이 없는데 어떻게 True와 False를 반환하는거지? 라고 생각했는데 뒤에 == 0을 이용하여 조건을 만족하면 True 아닐경우 False를 바로 반환하도록 한 것이 었다. 리스트컴프리헨션과 sum()함수를 이용해서 코드를 한줄로 압축까지하다니 역시 파이썬은 대단하다.

 

> 대소문자 구분의 중요성, 코드를 짧게 작성하는 요령을 배웠다

 

2) 두 정수 사이의 합

다음 문항은 두 정수 사이의 합 구하기, 하지만 a와 b의 대소관계가 정해져 있지 않아서 상당히 까다로웠다.

 

아이디어

1. a와 b의 대소관계를 확인하여 big, small이라는 새로운 변수에 넣는다

2. for 변수 in range(small,big+1)하여 모든 정수의 합을 리턴한다.

def solution(a, b):
    sum = 0
    big = a if a-b>0 else b
    small = a if a-b<0 else b
    
    for x in range(small,big+1):
        sum += x

    return sum

그런데 코드를 작성하고나니 뭔가 '파이썬 답지 않다고' 느껴졌다. small과 big 변수가 굳이 필요할까? 라는 생각이 들기도했다.

a,b를 리스트에 넣고 sort를 해볼까 싶었지만 내가 원하던 스타일의 해답은 아니었다.

a, b = b, a

그러다가 생각지도 못한 방법을 발견했는데, 그것은 위의 코드처럼 a과 b의 자리를 바꾸는 것이었다.

def adder(a, b):
    if a > b:
        a, b = b, a
    return sum(range(a, b + 1))

small과 big을 따로 정의하지않고 이런식으로 풀 수 있다는 것이 정말 참신했다.

 

> 변수, ~ = 변수 ~로 변수들의 값을 교환할 수 있다는 것을 알게 되었다.

 

3) 콜라즈 추측

이 문제의 경우 알고리즘이 그대로 나와있어서 보이는 그대로 코드를 작성해봤다.

def solution(num):
    answer = num
    count = 0
    
    while (answer!=1):
        if answer%2==0:
            answer = answer/2
        else:
            answer = answer*3+1 
        count += 1
        if count>=500:
            return -1
    return count

코드를 작성하던 중 중간에 '주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 -1을 반환해 주세요.라는 문구를 보게되었고, 저번에 while은 무한 반복의 위험성 때문에 쓰지말아야지! 라고 다짐했지만 몇 번 코드를 반복했는지 체크하는 방법이 생각나지 않아 결국 사용해서 코드를 작성하게되었다.

 

그래서 다른 사람들도 while문을 사용해서 작성했을까? 하고 코드를 둘러봤는데

def collatz(num):
    for i in range(500):
        num=num/2 if num%2==0 else num*3+1
        if num==1:
            return i+1
    return -1

'500번'이라는 조건을 이용하여 range(500)을 사용함으로써 while문을 대체했고 삼항 연산자를 이용하여 짧게 조건문을 바꿔준 케이스가 있었다. 결국, for문을 사용하는 방법은 존재했고 부족함을 느꼈다. 하지만, 이 코드를 보고 해석하면서 이제 그 부족함을 채웠으므로 나는 성장했다.

 

> while문 대신 for문을 사용하는 방법은 늘 존재한

 

4) 나누어 떨어지는 숫자 배열

이 문제의 경우에도 다른 사람의 코드를 보면서 큰 깨달음을 얻은 케이스인데 

 

아이디어

1. 배열을 이용해서 나누어 떨어지는 값을 하나씩 append

2. elemet가 하나도 없는 경우를 구분하기 위해 append를 수행했을때 카운트 변수를 1 증가시켜줌

def solution(arr, divisor):
    answer = []
    check = 0
    
    for x in arr:
         if x%divisor==0:
            answer.append(x)
            check += 1
    if check ==0:
        return [-1]
    answer.sort()
    return answer

아이디어를 바탕으로 코드를 작성했지만, 역시나..! 파이썬 답지 않았다. 뭔가 불필요한 코드들을 많이 사용한 기분이었다.

def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]

그러다가 충격적이게도 이 긴 코드를 한 문장으로 줄인 코드를 발견했다.

빈 리스트는 False로 인식하고 파이썬은 or 앞이 참일경우 해당 값까지만 , 거짓일경우 뒤에 것까지 호출하는 원리를 이용한 것이었다. 이 두가지 사실 다 잘 모르고 있던 내용이라 새로운 깨달음을 얻은 듯 했다. 또한 sort대신 sorted를 이용하여 리스트를 직접 수정하지 않고 반환값을 바로 return 하는 것도 인상깊었다.

 

> 빈 리스트는 False로 인식, or 앞이 참일경우 앞의 값까지만 거짓일경우 뒤에 것 까지 호출한다는 것을 알게됨

 

이렇게 오늘은 데이터 분석에 입문한 날이지만 파이썬 위주로 TIL을 작성하게 되었는데,  pandas의 기본적인 사용 방법을 배우기 시작한 단계라 의문점을 가지거나 기존의 지식을 고치거나 하기 어려웠기 떄문이다. 내일은 파이썬 공부와 더불어 panas의 이런저런 기능들을 시험해보면서 TIL을 작성해야겠다.