[4일] 데브코스 - greedy

Tony Lee·2023년 4월 13일
0

데브코스

목록 보기
2/5
post-thumbnail

해쉬 테이블

완주하지 못한 선수

프로그래머스에 있는 레벨 1 문제이다.
이전에 혼자 풀때는 카운터를 사용했는데

from collections import Counter

강사님은 해쉬 테이블로 심플하게 구현하신게 인상깊었다.

def solution(participant, completion):
    d = {}
    for p in participant:
        d[p] = d.get(p,0) + 1
    for c in completion:
        d[c] -= 1
    ans = [k for k,v in d.items() if v > 0]
    return ans[0]

이런식으로 푸셨는데, 강의가 끝난 후 혼자 똑같이 구현하기를 연습했다.

새롭게 배운 부분은 defaultdict()가 아니어도 d.get()으로 missingValue 처리를 하는 부분이었다. 코딩 테스트에서 유용하게 쓸 것 같다. 보기에도 깔끔하고 외부 라이브러리를 따오지 않는게 심플하다.

그리고 나머지는 간단하다. completion에서 발견하면 하나를 빼주고 리턴값은 value에 0 이상인 key만 리턴한다.

체육복 빌려줘

이번 문제는 두 개의 리스트를 비교하여 빈 공간을 찾는 문제였다.

논리를 간다하게 푸는 방법과 그걸 코드로 옮기는 과정에서 두 번 놀랐다.
교집합과 차집합을 이용한 풀이로 비슷한 문제를 본다면 쉽게 접근할 수 있을 것 같다.

def solution(n, lost, reserve):
    s = set(lost) & set(reserve)
    l = set(lost) - s
    r = set(reserve) - s
    for x in sorted(r):
        if x-1 in l:
            l.remove(x-1)
        elif x+1 in l:
            l.remove(x+1)
    return n - len(l)
        

코드는 이렇다.
s는 교집합, L은 잃어버린 사람, R은 남은 사람이다.

만약 체육복이 남은 사람보다 차례가 하나 낮은 사람이 존재한다면, 빌려주고, 존재하지 않는다면 다음 차례를 확인하여 빌려준다.
너무 간단하다.
이런 깔끔한 코드를 직접 떠오르는 단계까지 공부해야겠다는 생각이 든다.

정렬

가장 큰 수

프로그래머스 고득점 kit에 있는 문제다.

이것 또한 논리가 매우 깔끔하다.

def solution(numbers):
    numbers = [str(x) for x in numbers]
    numbers.sort(key=lambda x: (x*4)[:4], reverse=True)
    if numbers[0] == '0':
        return '0'
    return ''.join(numbers)

일단 모든 값을 문자로 변환하고, 문자를 반복시킨다 (1000의 자리까지)
그리고 그 순서대로 나열 후, join.
위 논리는 나도 문제를 보면서 떠올렸지만, 정렬 방법을 알지 못했는데, 감사합니다!

큰 수 만들기

이 문제는 내일 다시 풀어봐야 할 것 같다.

def solution(number, k):
    ans = []
    for i, num in enumerate(number):
        while len(ans)>0 and ans[-1] < num and k > 0:
            ans.pop()
            k -= 1
        if k == 0:
            ans.append(number[i:])
            break
        ans.append(num)
            
    ans = ans[:-k] if k>0 else ans
    return ''.join(ans)

분명 논리는 이해되지만 내가 직접 구현할 수 있을까 하는 의문이다. 오늘 잠들기 전에 복습 후, 내일 다시 풀어봐야겠다.

이번주 후기

장점

강의도 좋고 사람들도 좋다.
3팀의 팀장을 맡게 되었는데, 다들 좋은 사람들이고, 재밌는 프로젝트를 만들 것이다.

단점

매일 17시까지 작성을 권하는 TIL이 별로다.
나는 저녁에 정리하는 것을 좋아하는데 5시까지 짜맞춰서 올린다는게 학습의 의미가 있나 싶다.
차라리 다음날 YIL (Yesterday, I Learned) 로 바꿔서 올렸으면 좋겠다.
8명의 다른 팀원들에게도 물어봤는데 모두 같은 의견이었다.
보여주기 식이며 배움에 있어서 큰 의미가 없다고 느껴지는 것 같다.

profile
Striving to have a positive impact on the community

0개의 댓글