git 도구 - stashing 과 cleaning

|

Pro Git Book 을 읽고 주요 내용을 정리합니다.

Stashing

  • 어떤 작업 중에 급한 일이 생겨 다른 브랜치로 변경해야한다. 그런데 현재 하던 작업이 진행중이어서 커밋을 하기에는 애매하다.
  • 커밋하지 않고, 나중에 다시 돌아와서 작업을 이어서 하고 싶을 때는 git stash 명령을 사용해서 해결
  • stash 명령 적용대상
    1. Modified + Tracked 상태인 파일 (한번이라도 add를 한 적이 있는 파일)
    2. Staging Area에 있는 파일

git stash

  • git stash 명령을 실행하면 스택에 새로운 Stash가 만들어지고 커밋하기 애매한 작업중인 파일의 상태가 저장된다.
  • 그리고 워킹 디렉토리는 깨끗해진다.
  • git stash list 명령을 사용해서 저장한 Stash 목록을 확인할 수 있다.
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

git stash apply

  • git stash apply 명령을 실행하여 Stash 내용을 다시 적용할 수 있다.
  • git stash apply stash@{2} 처럼 원하는 Stash 를 골라서 적용하는 것도 가능하다. (이름이 없으면 가장 최근 Stash 적용)
  • git stash apply --index 옵션을 통해서 Staged 상태까지 적용할 수 있다.
  • git stash -u 옵셔능ㄹ 통해서 untracked 파일도 함께 저장할 수 있다.

git stash drop

  • git stash drop stash@{2} 명령을 사용하여 해당 Stash를 제거한다.
  • git stash pop이라는 명령도 있는데 이 명령은 Stash를 적용하고 나서 바로 스택에서 제거해준다.

git stash branch

  • git stash branch 명령을 실행하면 Stash 할 당시의 커밋을 Checkout 한 후 새로운 브랜치를 만들고 여기에 적용한다. 이 모든 것이 성공하면 Stash를 삭제한다.

git clean

  • 워킹 디렉토리 안의 추적하고 있지 않은 모든 파일을 지운다.
  • git clean -n 옵션을 통해서 가상으로 실행해보고 어떤 파일들이 지워질지 알 수 있다.
  • git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다. .gitignore`에 명시했거나 해서 무시되는 파일은 지우지 않는다.

스택 시간복잡도 O(1)으로 최소값 구하기

|

문제출처

문제

How would you design a stack which, in addition to push and pop, also has a function min which returns the minimum element? Push, pop, and min should all operate in O(1) time.

풀이코드

  • O(1) 의 시간복잡도를 가진다는 것은 hash, dictionary 처럼 변수에 직접 접근한다는 의미
  • 변수 mins와 min을 추가하여 최소값에 바로 접근 할 수 있도록 한다.
class Stack():
    def __init__(self):
        self.items = []
        self.mins = []
        self.min = None

    def push(self, item):
        self.items.append(item)
        self.mins.append(self.min)
        if self.min is None or self.min > item:
            self.min = item

    def pop(self):
        self.items.pop()
        self.min = self.mins.pop()

    def get_min(self):
        return self.min

    def peak(self):
        return self.items[-1]

if __name__ == '__main__':
    stack = Stack()
    stack.push(7)
    stack.push(4)
    stack.push(5)
    stack.push(3)
    print(stack.get_min()) # 3
    stack.pop()
    print(stack.peak()) # 5
    stack.pop()
    print(stack.peak()) # 4
    print(stack.get_min()) # 4

팁스타운 코드챌린지 예선문제 2

|

문제출처

문제

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항 문자열의 길이 : 1,000,000이하의 자연수 문자열은 모두 소문자로 이루어져 있습니다. 시간제한 : 1569ms

풀이코드

def solution(s):
    result = []
    for i in s:
        if not result:
            result.append(i)
        elif result[-1] == i:
            result.pop()
        else:
            result.append(i)
    return int(not bool(result))

팁스타운 코드챌린지 예선문제 1

|

문제출처

문제

△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, … , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.

이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. 단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.

제한사항 N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.) A, B : N 이하인 자연수 (단, A ≠ B 입니다.)

풀이코드

def solution(n, a, b):
    result = 1
    if a > b:
        a, b = b, a
    if a % 2 and abs(a-b) == 1:
            return result
    while True:
        if a % 2:
            a = a // 2 +1
        else:
            a = a // 2
        if b % 2:
            b = b // 2 + 1
        else:
            b = b // 2
        result += 1
        if a % 2 and abs(a-b) == 1:
            return result

170515-0521_TIL

|

5월 21일 (일)

오늘 한 일

  • Google Campus Seoul 리크루팅 데이에 참석해서 resume 첨삭을 받으려고 이력서를 정리했다. 지금까지 공부하면서 생각했던 부분을 정리할 수 있어서 좋았다. 앞으로 더 공부하면서 내용을 추가하고 다듬어야겠다는 생각을 했다. 결과적으로 신청마감 1시간 전에 이력서 정리를 마무리하고 웹페이지에 접속했는데, 신청 버튼이 사라져있었다. 따로 인원제한이나 마감시간에 대한 안내가 없어서 안심하고 있었는데 신청을 하지 못하게 되서 아쉬웠다.

    주최측에 문의했더니 참가가 가능하다는 안내를 받았다. 이력서 리뷰 신청도 정상 처리되었다 :)

  • Bubble sort 구현을 연습했다.

5월 20일 (토)

오늘 한 일

  • Summer Coding 예선에 참가했다. 2시간 동안 3개의 알고리즘 문제를 풀었는데 생각보다 쉽지 않았다. 문제를 작게 쪼개서 하나씩 해결하고, 원하는 동작이 명확할 때 사용 가능한 외장함수가 있는지 찾아보고 활용해야 겠다는 생각을 했다.
import itertools

list(itertools.combinations([1,2,3,4],3))
# 예 :[1,2,3,4]의 요소를 사용해서 만들 수 있는 길이 3의 리스트 경우의 수 전체는
# [(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)] 이다.

내일 할 일


5월 19일 (금)

오늘 한 일

  • tryhelloworld 알고리즘 문제를 다시 풀었다.
  • AskDjango 장고 기본강의를 들었다. - django.contrib.auth.forms의 form 을 상속받아서 커스텀 form을 작성하는 부분을 연습했다.
    • UserCreationForm 을 상속받아 email, phone_number를 추가로 입력받는 커스텀 SignUpForm 작성
    • User Model과 OneToOne relation을 갖는 Profile 모델을 작성하고, 회원가입 form에서 입력받은 데이터를 활용하여 인스턴스 생성
    • AuthenticationForm 을 상속받아 퀴즈에 대한 답을 입력하는 answer 필드를 추가한 커스텀 LoginForm 작성
  • linear Search (순차탐색), Binary Search (이진탐색), Selection Sort (선택정렬) 구현을 연습했다.
  • 처음 시작하는 파이썬을 읽었다. (ch4. 파이크러스트: 코드 구조)

내일 할 일


5월 18일 (목)

오늘 한 일

  • AskDjango 장고 기본강의를 들었다.
    • django.contrib.auth의 인증관련 설정 및 주요 모델필드, 멤버함수에 대해서 익혔다.
    • User 모델을 획득할 때는 auth.User 로 직접 가져오기 보다,
      get_user_model 함수 또는 settings.AUTH_USER_MODEL을 통해서 가져오는게 변경에 따른 위험이 적다는 것을 배웠다.
  • tryhelloworld 알고리즘 문제를 처음부터 다시 풀기 시작했다. 2달 전에 풀었던 문제들을 다시 풀어보니 낯설기도 하고, 기본적인 부분들을 다시 한번 확인할 수 있어서 좋았다.
  • 처음 시작하는 파이썬을 읽었다. 주변에서 워낙 추천을 많이해서 읽기 시작했는데 기본서 다음으로 참고하기 괜찮은 것 같다. 빠르게 훑어보고 다음으로 추천 받은 책인 파이썬 핵심 레퍼런스를 읽어봐야지
  • 선택정렬에 대한 글을 읽었다.

내일 할 일


5월 17일 (수)

오늘 한 일

  • PhotoWall 프로젝트에 회원가입/로그인/프로필/로그아웃 부분을 구현했다.
  • 영어 스터디 게시판 마크업 부분 수정, 제목 필터링 기능 추가

내일 할 일

  • tryhelloworld 알고리즘 문제 처음부터 다시 풀면서 코드개선 (시간복잡도 고려)
  • 처음 시작하는 파이썬 읽고 실습

5월 16일 (화)

오늘 한 일

  • 예전에 만들었던 영어 스터디 게시판을 개선했다. 기존의 FBV를 CBV로 바꾸고, summernote editor를 적용했더니 코드 길이가 많이 짧아져서 뿌듯했다.
  • Pro Git Book 의 rebase 부분을 읽고 블로그에 정리했다. 전에 커밋메시지를 수정하려고 stackoverflow를 참고해서 rebase를 사용한 적이 있는데 원하는대로 해결하지 못했던 기억이 있다. Pro Git Book의 설명이 괜찮은 건지 이번에는 성공! 나중에 필요할 때 활용해야겠다.

내일 할 일

  • 알고리즘 문제 풀이
  • django 사용자 인증 관련내용 실습 후 블로그 정리
  • PhotoWall 프로젝트 - 회원가입/로그인/프로필/로그아웃 실습

5월 15일 (월)

오늘 한 일

  • django에 summernote 앱을 설치하고 WYSIWYG editor를 적용해보았다.(신기..!) 마크다운 editor를 적용할 수 있는 앱이 있는지 찾아봐야겠다. (찾아보니 python3 이상을 지원하는 마크다운 장고 패키지 중에 dracos-markdown-editor이 있었다.)
  • 개인프로젝트 페이지에 bootstrap을 활용하여 carousel을 추가하고, 게시판 페이지 마크업을 진행했다.
  • 알고리즘 문제를 풀었다.

내일 할 일

  • AWS 배포 부분 복습하고 삭제하기
  • 예전에 만든 영어 스터디 게시판 개선
    • FBV를 CBV ListView, DetailView로 변경
    • 기존 입력 form을 summernote로 변경
  • 알고리즘 문제 풀기
  • 사용자 인증 관련 블로그 정리