SQL & Python Study

[D+16][알고리즘 코드카타 #2] 서울에서 김서방 찾기, 나누어 떨어지는 숫자, 음양 더하기, 핸드폰 번호 가리기, 없는 숫자 더하기 본문

✏️ STUDY etc./Code Kata

[D+16][알고리즘 코드카타 #2] 서울에서 김서방 찾기, 나누어 떨어지는 숫자, 음양 더하기, 핸드폰 번호 가리기, 없는 숫자 더하기

김숮엉 2024. 5. 9. 23:22
✒️ Code Kata Index 

문제 1. 서울에서 김서방 찾기 ☆☆☆
문제 2. 나누어 떨어지는 숫자  ★☆☆
문제 3. 음양 더하기  ★☆☆
문제 4. 핸드폰 번호 가리기  ★☆☆
문제 5. 없는 숫자 더하기  ★☆☆

 

문제 1. 서울에서 김서방 찾기

 

풀이과정

  • 변수가 list 형태로 제공되네? index()를 활용해서 'Kim'의 위치(인덱스 번호)를 찾자! 
    list_name.index ('Kim') 배열에서 원하는 값의 위치를 찾을 수 있는 함수 
  • 결과는 문장으로 반환해야 하니 fstring으로 반환해줘야겠다. *아까 찾은 인덱스 번호를 변수 x에 담아 함께 출력!
def solution(seoul):
    x = seoul.index('Kim') # Kim의 위치 찾아주기
    return f"김서방은 {x}에 있다"

문제 2. 나누어 떨어지는 숫자

 

풀이과정

  • array 리스트에서 나누어 떨어지는 값(나머지가 0인 값)만 담는 리스트를 만들자! 
    리스트컴프리헨션 사용 [ x for x in array if x % divisor == 0 ] 
    나누어 떨어지지 않는 값은 어차피 신경 안 써도 되니 별도 else는 지정하지 않다. 
  • 만약 나머지가 0인 x 가 없다면! 즉, 리스트가 null 일 경우 -1을 반환해야하니 if 문으로 상황을 나눠주고 
  • 나누어 떨어진 값들은 오름차순으로 반환해야하니 .sort()로 리스트를 정렬해 주자.  

새롭게 깨달은 내용 

  • 처음엔 정렬한 값을 answer에 담아 리턴했다. answer = ls.sort() 이렇게! 그런데 값이 null로 나와 엄청 당황했다.
    알고 보니 ls.sort()는 그 자체로 하나의 리스트인 것이 아니라, 원래 리스트를 정렬하고 None 값을 반환하기 때문에 변수에 담으면 null 값을 반환하게 된다고 한다. 따라서, 다른 변수에 할당하지 않고 바로 리스트를 반환해야 한다! 하긴 list가 있는데 이걸 또 변수에 담는다는 것 자체가 비효율적인 거지... 이해함.
def solution(arr, divisor):
    ls = [ x for x in arr if x % divisor == 0 ] # 나누어 떨어지는 값을 담은 리스트
    if ls == [] : # 나누어 떨어지는 값이 없을때 -1 반환
        ls.append(-1) 
    else :
        ls.sort() #오름차순 정렬
    return ls

문제 3. 음양 더하기

 

풀이과정 

  • 처음엔 true, false로 이뤄진 배열을 보자마자 불리언 인덱싱을 생각했다. 하지만 numpy를 활용해야하는 것도 있고, false인 값은 어떻게 담을지 아직 잘 몰라 더 쉬운 방법으로 접근하기로 했다.
  • 두 개의 리스트를 for 문으로 돌려 false 인 값은 -x를, true인 값은 x를 반환하자. 
    *문제 제한사항에 두 리스트의 길이가 같음을 명시했기 때문에 위처럼 진행했다. 
  • 절댓값이 벗겨진 x 들을 빈 리스트에 담아 sum을 리턴해주자! 

놓치면 안 되는 부분 

  • 리스트 2개를 for 문으로 돌릴 때 zip()으로 감싸줘야 함. 처음에 이거 놓쳐서 value error 남!  
    zip()으로 묶어주는 이유 : 동일한 인덱스에 있는 값을 하나의 쌍으로 묶어주기 위함! 
    만약 zip()으로 묶어주지 않으면, 리스트 길이가 다를 때 짧은 리스트에 맞춰 데이터가 반복 수행됨으로 제대로 된 결과 x 
def solution(absolutes, signs):
    ls = [] # 절댓값 벗겨진 값을 받을 빈 리스트 
    for x, y in zip(absolutes, signs) : #zip()으로 두 리스트를 묶어줘야 함. 
        if y == True :  
            ls.append(x) 
        else : 
            ls.append(-x) 
    return sum(ls)

문제 4. 핸드폰 번호 가리기

 

풀이과정 

  • 처음엔 핸드폰 넘버가 000-0000-0000로 고정된 포맷일 줄 알았다. 그래서 앞에 개수를 세어 *을 반환하려고 했으나, 핸드폰 넘버는 4~20로 제각각이라는 제한 조건 발견... 
  • 그래서 핸드폰 넘버를 list로 만들고 len()을 활용해서 4자리를 제외한 길이 구하고 (변수 x에 할당)
  • for문을 활용해 x 번만큼 list의 값을 *로 변경해주었다. ls [x] = '*' (x를 인덱스로 받아서 값 변경하기) 
  • 마지막으로 .join()을 활용해 제각각 떨어진 데이터를 모아서 출력!! 

더 디벨롭해 볼 수 있는, 새롭게 깨달은 사실

  • 다른 사람들의 풀이를 보니 for문을 사용하지 않고 len() -4 만큼 *을 반복하고, 슬라이싱을 통해 뒷 4자리만 반환할 수도 있었다! 슬라이싱은 엄청 기본적인 것인데, 아직 손에 잘 안 익어 이걸 생각 못했다. 다음에 꼭 활용한다.  
    '*' * (len(phone_number)-4)) + s[-4:] 
def solution(phone_number):
    ls = list(phone_number)
    x = len(ls) - 4 # 뒷4자리를 제외한 번호 길이 구하기 
    for x in range(x) : # x만큼 반복하여 4자리 외에 *로 변경 
        ls[x] = '*'
    return ''.join(ls) # list 값들을 붙여 출력

문제 5. 없는 숫자 더하기

 

풀이과정 

  • 처음 문제를 보고 주어진 numbers의 범위가 0~9로 매우 작다는 사실을 발견! 이득이잖아? 
    for문에 변수를 2개 주고 돌릴 필요없이 numbers와 비교할 0~9를 담은 리스트를 만들어 주자. 
  • if - for문을 활용해 numbers에 있는 값은 리스트에서 소거 → numbers에 없는 값만 리스트에 남도록 해주자.
  • 리스트의 합계를 반환!    

더 디벨롭해볼 수 있는, 새롭게 깨달은 사실

  • 다른 사람들의 풀이를 보니 0~9 합계에서 sum(numbers)를 빼서 값을 반환하는 천재 같은 발상을..!! 이런 사람들이 코딩을 하는 건가 싶다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 진짜 천재들 같으니라고. 쉽게 풀었다고 좋아했지만 그럴 필요가 없었다. 암튼, 감명 깊었으니 이것도 내 머릿속에 저장!
    45 - sum(numbers) 
  •  리스트컴프리헨션을 사용해서 if not in numbers 값을 반환하는 방법도 있었다. 
    sum([i for i in [1,2,3,4,5,6,7,8,9,0] if i not in numbers])
def solution(numbers):
    ls = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
    for x in numbers :
        if x in ls : 
            ls.remove(x)
    return sum(ls)

 

[ TIL ] 2024. 5. 9 

 

오늘은 알고리즘 문제가 어제보다 훨씬 수월하게 풀려서 정말 기분이 좋았다. 파이썬 나랑 꽤 잘 맞을지도? 😉

다만, 쓰고자 하는 함수는 생각나지만 정확한 사용방법이 기억이 나지 않아 구글링으로 슬쩍 문법을 커닝했다. 자주 사용하는 함수는 이제 완벽히 외워야할 때가 온 것 같다. 

반면 SQL 코드카타는 이제 60번대가 넘어가면서 문제가 너무 어려워졌다.. 데이터가 출력돼도 오답인 경우가 많아 여간 머리 아픈 게 아니다😔 오늘 2개의 문제를 풀었는데 9시가 넘어서도 계속 오답이 나와서 내일 오전에 맑은 정신으로 다시 풀어보려고 한다!

+@ 오늘부터 데이터 전처리와 시각화 학습을 시작했는데, 실제 데이터 분석가가 하는 일을 배울 수 있어 너무 기대되고 즐겁고 떨린다! 아직은 설렘이 가득한데, 금방 또 머리 쥐어뜯어서 머리털 빠지겠지? 그래도 지금은 설렌다! 우하하🍀