leetcode 461. Hamming Distance

|

문제출처

문제

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

Note:
0 ≤ x, y < 2**31.

Example:

Input: x = 1, y = 4

Output: 2

Explanation:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

The above arrows point to positions where the corresponding bits are different.

풀이코드

def hamming_distance(x, y):
    bin_x = format(x, "032b")
    bin_y = format(y, "032b")
    result = 0
    for i in range(32):
        if bin_x[i] != bin_y[i]:
            result += 1
    return result
  • format() 함수를 활용 (참고)
>>> format(10, '010b')
# '0000001010'
>>> format(10, 'b')
# '1010'
>>> format(10, '#b')
# '0b1010'

다른사람풀이

  • 비트연산자 XOR연산 활용 (XOR연산은 각 자릿수를 비교하여 다르면 1, 같으면 0)
  • 비트연산자 참고 (codecademy)
def hamming_distance(x, y):
  return bin(x^y).count('1')

leetcode 1. two sum

|

문제출처

문제

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].


풀이코드

def two_sum(nums, target):
    for idx, num in enumerate(nums):
        if target - num in nums:
            return idx, nums.index(target-num)

다른사람풀이

  • hash table을 활용 (O(n))
def two_sum(nums,target):
    dic = {}
    i = 0
    for num in nums:
        if target - num in dic:
            return dic[target-num], i
        d[num] = i
        i += 1

Django - 서드 파티 패키지

|


Two Scoops of Django 21장을 읽고 정리한 내용입니다.


  • 장고의 진정한 강력함은 오픈 소스 커뮤니티에서 제공하는 파이썬 패키지와 서드파티 장고 패키지들이다.
  • 장고와 파이썬 개발 과정에서 전문적으로 이루어지는 작업의 대부분은 서드파티 패키지들을 장고 프로젝트 안으로 이식시키는 것이다.

21.1 서드 파티 패키지의 예

  • ‘부록 A 이 책에서 언급된 패키지들’ : 우선적으로 고려해볼만한 유용한 패키지 목록

21.2 파이썬 패키지 인덱스

  • PyPI는 Python Package Index의 약자
  • 파이썬 패키지를 업로드하기 위한 공용 저장소 (현재 장고를 포함하여 11만개 이상의 패키지가 있다)
  • pip는 PyPI에서 패키지를 설치하는데 사용하는 명령줄 도구 (파이썬 3.4 이후 기본 포함)

screen 7

21.3 djangopackages.org

  • djangopackages.org은 장고 앱을 위한 재사용 가능한 앱, 사이트, 도구들을 모아 놓은 디렉토리다.
  • 각 패키지의 기능을 비교하기에 가장 좋은 사이트이다.

screen 9

21.4 다양한 패키지를 알아두자

  • 장고(파이썬) 개발자로서 필요할 때마다 바퀴(라이브러리)를 다시 만드는 대신에 서드 파티 라이브러리를 이용하는 것을 목표로 삼기를 바란다.
  • 다양한 패키지를 이용함에 따라 그 패키지들의 코드를 공부하고 배울 수 있다.
  • 동시에 나쁜 패키지들로부터 좋은 패키지를 선별해 내는 능력도 중요하다. (21.10 좋은 장고 패키지의 조건 참고)

21.5 패키지 설치, 관리를 위한 도구들

21.6 패키지 요구사항

  • 장고와 파이썬의 의존성을 requirements 파일로 관리한다.
  • 파일의 위치는 프로젝트 루트 아래 requirements/ 디렉토리

21.7 장고 패키지 이용하기: 기본

  • 1단계: 패키지 문서 읽기
  • 2단계: 패키지 버전 번호를 requirements에 추가하기
  • 3단계: virtualenv에 requirements 설치
  • 4단계: 패키지의 설치 문서를 그대로 따라하기

21.8 서트 파티 패키지에 문제가 생겼을 때

  • 패키지 저장소의 이슈 트래커 살펴보기
  • 누구도 올린 문제가 아니라면 버그를 보고하기
  • 스택오버플로, IRC 활용

21.9 자신의 장고 패키지 릴리스 하기

21.10 좋은 장고 패키지의 요건

목적

  • 패키지 이름은 목적과 기능을 잘 설명할 수 있어야하 한다.
  • 장고에 관련된 패키지는 저장소의 루트 폴더를 django- 라는 접두어로 시작하게 한다.

범위

  • 패키지 자체의 역할 범위는 작은 태스크에만 초점이 맞추어져야 한다.

문서화

테스트

  • 제작되는 패키지는 반드시 테스트를 거쳐야한다.
  • 테스트는 다른 사람들이 좀 더 효과적으로 패키지에 공헌할 수 있게 해준다.

템플릿

  • 최근에는 뼈대 역할을 하는 템플릿 세트를 제공하는 것이 표준 (css는 제외한 상태로 최소한의 html, 자바스크립트)

유지보수

  • 저장소에 마이너, 메이저 릴리스 코드를 업데이트 하면 파이썬 패키지 인덱스에도 자동으로 업데이트 하도록 고려

커뮤니티

  • 모든 기여자에게 해당 작업에 대한 귀속 조건을 담은 CONTRIBUTORS.rst나 AUTHORS.rst 파일을 제공해야 한다. screen 10

모듈성

  • 패키지는 장고 프로젝트의 코어 컴포넌트(템플릿, ORM 등)를 다른 모듈로 교체하지 않고도 문제 없이 적용되어야 한다.
  • 설치는 기존 프로젝트에 최소한의 영향을 미쳐야 한다.

파이썬 패키지 인덱스에 올리기

  • 패키지의 모든 메이저, 마이너 릴리스는 PyPI에서 다운로드 할 수 있도록 해야한다.

가능한 자세하게 requirements 스펙을 작성하기

  • setup.py 파일 안에 정의되는 installed_requires 인자에는 제작된 서드파티 라이브러리를 이용하기 위해 어떤 다른 종류의 패키지가 필요한지 정보가 담겨있다.
  • 이를 가능한 다양한 환경과 호환되도록 설정해야한다.
  • 요구되는 라이브러리가 단 하나의 버전만으로 매우 좁게 정의되어 있으면 다른 개발자의 다른 사이트 프로젝트에서는 해당 패키지가 작동할 수 없는 상황이 발생한다.
  • 따라서 서드 파트 패키지들의 requirements를 다른 패키지들의 라이브러리 호환성을 위해 가능 한 넓게 기술해야 한다.
Django>=1.5,<1.9
requirements>=1.2.3,<=2.6.0

버전 번호 붙이기

  • 장고, 파이썬처럼 PEP386 이름 규약에 따라서 버전 번호를 붙이는 방법을 선호
  • ‘A. B. C’ 패턴
  • alpha, beta, rc(release-candidate) 접미사는 앞으로 릴리스될 버전에 대해서 이용 (예: django-crispy-forms 1.4.0-beta)
  • 완성되지 않은 코드를 PyPI에 올려서는 안된다.
    • PyPI는 알파, 베타, rc 코드가 아닌 안정적이고 신뢰할 수 있는 패키지만 모아 놓은 공간

이름

  • 오픈소스 장고 패키지 이름 정하기 팁
    • 파이썬 패키지 인덱스에 이미 등재된 이름인지
    • djangopackages.org에 이름이 있는지

라이센스

  • 완성된 패키지 저장소의 루트에 LICENSE.rst 파일을 제작하자
  • 개인이라면 MIT 라이센스를 추천한다.

URL Namespaces 이용

  • URL Namespaces 이용을 통해서 프로젝트들 사이에서 서로 충돌이 나는 것을 막을 수 있다.


쉬운 방법으로 패키지 제작하기

  • cookiecutter를 사용하여 프로젝트 템플릿을 쉽게 만들어 보자

    오픈 소스 패키지 관리하기

    풀 요청에 대한 보상

  • CONTRIBUTORS.txt 또는 AUTHORS.txt 같은 프로젝트 저작자 문서를 만들고 공헌한 사람들의 이름을 반드시 넣어야 한다.

screen 10

반영될 수 없는 풀 요청에 대해

  • 테스트 케이스를 통과하지 못한 풀 요청 (22장 참고)
  • 테스트 범위를 벗어난 코드들 (22장 참고)
  • 풀 요청은 가능한 한 최소의 범위에 대한 수정과 변경을 담고 있어야 한다.
  • 너무 복잡한 코드
  • PEP8 규약을 따르지 않는 코드
  • 빈 칸 정리로만 이루어진 코드

파이썬 패키지 인덱스에 정식으로 릴리스하기

  • PyPI에 올라온 패키지의 버전이 예전 버전이라고 해서 스테이블 마스터나 트렁크 브랜치를 이용하라고 하는 것은 무책임한 일로 간주된다.
  • 오픈소스 프로젝트의 저장소는 제품 품질을 지닌 코드로 볼 수 없으며, 파이썬 패키지 인덱스는 설치 가능한 패키지를 안전하게 제공하는 리소스로 설계되어 있음
  • 명확하게 언제 릴리스 해야하는지는 python-request의 변경이력을 참고하면 좋다.
  • 트와인(Twine)은 파이썬 패키지 인덱스로 패키지를 올리는데 사용되는 라이브러리
  • 인증된 TLS를 이용해 패키지를 업로드 함으로써 SSH 연결을 이용하지 않는 python setup.py의 보안 문제를 해결한다.
  • 참고

기본 예제 템플릿을 제공하라

  • 제작된 프로젝트를 이용한 기본적인 에제 템플릿을 제공하면 이용을 고려할 때 패키지를 테스트하기 쉽기 때문에 도움이 된다.

패키지의 수명

  • 프로젝트에 활동적으로 참여하는 사람에게 권한을 넘겨줌으로써 해당 프로젝트가 다시 활성화 될 수 있다.
  • 예시 : pip/virtualenv, django-debug-toolbar, django-uni-form 등

level 4. 최고의 집합

|

문제출처

문제

자연수 N개로 이루어진 집합 중에, 각 원소의 합이 S가 되는 수의 집합은 여러 가지가 존재합니다.
최고의 집합은, 위의 조건을 만족하는 집합 중 각 원소의 곱이 최대가 되는 집합을 의미합니다.

집합 원소의 개수 n과 원소들의 합 s가 주어지면,
최고의 집합을 찾아 원소를 오름차순으로 반환해주는 bestSet 함수를 만들어 보세요.
만약 조건을 만족하는 집합이 없을 때는 배열 맨 앞에 –1을 담아 반환하면 됩니다.
예를 들어 n=3, s=13이면 [4,4,5]가 반환됩니다.
(자바는 집합이 없는 경우 크기가 1인 배열에 -1을 담아 반환해주세요.)

풀이코드

  • 처음에는 itertools, functools 모듈을 임포트해서 주어진 길이와 합 조건에 맞는 모든 리스트의 경우의 수를 구했다.
  • 모든 경우의 수를 구하고 for 문을 돌리다 보니 실행시간이 오래 걸리는 문제가 발생한다.
  • 참 어렵게도 풀었다..

첫번재 시도 - 느리다

def bestSet(n, s):
    import itertools
    from functools import reduce
    if n > s:
        return [-1]
    combinations = [i for i in itertools.combinations_with_replacement(range(s+1), n) if sum(i) == s]
    multiply_li = [reduce(lambda x,y: x*y, combination) for combination in combinations]
    index = multiply_li.index(max(multiply_li))
    return sorted(list(combinations[index]))

두번째 시도

  • 첫번째 방법으로 풀고나니 이렇게 어렵게 풀 문제가 아닌것 같다는 생각이 들었다.
  • 단순한 예시를 사용해서 곱이 최대가 되는 경우를 살펴보니 각 요소의 편차가 가장 작을 때 곱이 최대가 되는것 같다.
def bestSet(n, s):
    if n > s:
        return [-1]
    portion, remainder = divmod(s, n)
    li = [portion] * n
    for i in range(remainder):
        li[i] += 1

    return sorted(li)

세번째 시도

def bestSet(n, s):
    if n > s:
        return [-1]
    portion, remainder = divmod(s, n)
    li = [portion] * n
    while remainder > 0:
        li[li.index(min(li))] += 1
        remainder -= 1

    return sorted(li)

2017년 10월 TIL

|

10월 2일 - 10월 8일

  • 평화롭고 긴 연휴를 보냈다. 추석특집 트렐로 보드를 만들고 야심차게 계획을 세웠지만 역시나 그대로 하지는 못했다.
  • 그래도 뿌듯한건 회사에서 가져온 일들을 몇 가지 했다는 것, 작은 일이지만 혼자 공부하는 것과는 다른 재미가 있다. 다른 사람 코드 보는 것도 신기하고.. 시간이 걸려도 어떻게 동작이 되면 참 기분이 좋다.
  • 집에있는 컴퓨터를 사용하려니 환경설정과 migration 문제로 종일 삽질을 했다.
  • 칸아카데미 - 인터넷이 작동하는 방법영상을 봤다. 인터넷 창립자라는 빈트 서프(Vint Cerf)가 영상에 나오는데 역시 외국 자료는 좋구나 싶었다. 다음은 SQL이란: 데이터 쿼리와 관리을 공부해봐야지
  • Udemy를 찾아보니 듣고 싶은 강의가 많아서 장바구니에 잔뜩 담아두었다.
  • 오랜만에 알고리즘 문제를 풀었다. 미련한 방법으로 풀다가 시간이 많이 걸렸는데 오랜만에 푸니끼 더 오래 걸린 것 같다. 일주일에 한문제 이상은 꾸준하게 풀어야겠다는 생각이 든다.

10월 9일 - 10월 15일

  • 칸아카데미 - SQL이란: 데이터 쿼리와 관리자료를 이용해서 SQL을 공부했다. 웹 브라우저에서 직접 SQL문을 작성하고 주어진 과제를 풀어나가는 형식이라 재미있었다. 대신 따로 답안이 제공되지는 않아서 중간에 막힐때는 찾아보는데 시간이 좀 걸렸다. Django Queryset도 비슷한 형식의 연습 사이트가 있으면 좋겠다는 생각을 헀다. 찾아보니 Django Queryset을 SQL문과 비교해놓은 글이 있어서 읽어보았는데 SQL보다 Queryset이 익숙한 나에게는 도움이 되었다. SQLのSELECT文を、DjangoのQuerySet APIで書いてみた
  • 스터디 참여 - Two Scoops of Django 21장 서드파티패키지 부분을 읽고 내용을 요약했다.
  • django-filter 패키지를 설치하고 사용해보았다. 필터링할 기본 데이터를 fixture를 활용해서 모델에 넣어보고, 기존의 데이터를 json파일로 dump뜨는 걸 해보았다. django widget tweaks 패키지를 사용해서 form에 좀 더 쉽게 Bootstrap 스타일 적용을 위한 class를 추가할 수 있었다.
  • simpleisbetterthancomplex 사이트의 A Complete Beginner’s Guide to Django를 part1-3을 진행했다. 제목만 보고 입문 튜토리얼이라고만 생각했었다. 그런데 훑어보니 모든 part에 다양한 test코드를 작성하는 내용이 포함되어 있어서 도움이 될 것 같다.

출퇴근지하철


10월 16일 - 10월 22일

  • A Complete Beginner’s Guide to Django를 진행하면서 test 코드 작성을 연습하고 있다. 회사에서 하는 것처럼 Push 할때마다 test를 자동으로 돌리고 싶어서 Travis CIcodecov github에 연동해보았다. travis 파일의 before_script 항목에 flake8을 사용해서 PEP8 규칙에 맞는지 확인하는 코드를 추가했는데 PEP8 검사에 자꾸 실패해서 불필요한 커밋을 여러번 하게 된다. .git 폴더 내 pre-commit 파일에 flake 관련 명령어를 추가하여 commit하기 전에 확인할 수 있도록 했다.Build Status(이 마크가 그런 의미었구나..!)

  • drf+react를 공부하기 시작했다. drf(django-rest-framework)는 오랫동안 미루고 있는 숙제같은 것인데, 자료를 이것저것 봐도 막연한 느낌만 들어서 이번 기회에 활용해보고 개념을 좀 잡을 수 있었으면 좋겠다.
  • 스터디 참여 - Two Scoops of Django 22장 테스트, 정말 거추장스럽고 낭비일까? 23장 문서화에 집착하기 부분을 다뤘다. 회사의 선배 개발자 분들이 테스트 코드를 열심히 작성해놓으신 덕분에 코드 커버리지가 70프로를 훌쩍 넘는데, 처음에는 잘 몰랐지만 시간이 지날수록 테스트 코드의 고마움을 자주 느끼고 있다.
  • 스터디 심화시간에 도커에 대해서 이야기를 듣고 docker 영상을 보고 따라해 보았는데 여전히 어렵다..