Temp

20210201, 프로그래머스 문제

ezn 2021. 2. 2. 23:17

프로그래머스 Hash

1. 완주하지 못한 선수

def solution(participant, completion):
    participant.sort() # nlog(n)
    completion.sort() # nlog(n)
    for p, c in zip(participant, completion):
        if p != c:
            return p
    return participant[-1]

2. 전화번호 목록

def solution(phone_book):
    phone_book.sort()
    for i in range(len(phone_book) - 1):
        if phone_book[i] in phone_book[i+1]:
            return False

    return True

 

 


Git (inflearn - 지옥에서 온 Git)

Version Control System

  • Version Control System - Version Management, not by changing the file name

    • Backup
    • Recovery
    • Collaboration
  • CVS, SVN, GIT : Version Control System (Dropbox, Google Drive)

  • Why is it difficult to use GIT? Because real life is more hell than GIT

    • Complexity of Code(10) + Complexity of GIT(100) = Complexity of Project(100)
    • Complexity of Code(100) + Complexity of GIT(10) = Complexity of Project(80 or less)
    • Git은 필요한 상황에서 사용해야 효용성이 있다.
  • What is 'Version'? : '의미 있는 변화' -> 완결된 작업

  • git init

  • git status

  • git add <file name> or git add . -> stage area

  • git commit -m "message" (-m "message" 없이, vim에서 바로 편집도 가능) -> repository

  • commit message는 간결하고, 그러면서 풍부하게...

git log, git diff

  • git log -p : [가장 최신 commit]과 [그 이전 commit]의 차이를 포함한 commit log 출력 / commit별 차이점
  • git diff <commit id>..<commit id> : 각 commit id에 해당하는 시점의 차이를 출력

git reset, git revert -> 'commit을 여러 방식으로 되돌릴 수 있다.'

git reset <commit id> --hard
  • commit id 에 해당하는 commit을 최신 상태의 commit으로 하고 이후의 버전은 삭제하고(필요하면 복구가 가능하지만 주의) 돌아감.
  • 협업할 때, 공유한 이후에는 절대 reset 하지 말 것.
  • --hard : 우선은 사용하지만, 추후 위험성을 이해하고 사용할 것.
    ##### `git revert`

 


Git

1. 가지(branch)치기

branch 만들기
  • git checkout -b feature_x, feature_x는 만들고자 하는 branch의 이름
master(main으로 바뀜) branch로 branch 이동하기
  • git checkout master(main)
branch 삭제하기
  • git branch -d feature_x
branch push(발행하기)
  • git push origin <branch name>

2. 갱신과 병합(merge)

로컬 저장소를 원격 저장소에 맞춰 갱신하기
  • git pull
  • 원격 저장소의 변경 내용이 로컬 잡업 디렉토리에 받아지고(fetch), 병합(merge)된다.
다른 branch에 있는 변경 내용을 현재 branch에 병합하기
  • git merge <branch name>
git pull, git merge <branch name> 병합 중 충돌
  • git pull, git merge <branch name> 둘 다 자동으로 변경 내용을 병합 하기위한 시도를 한다.
  • 문제는, 항상 성공하는 것이 아니라 충돌(conflicts)이 일어나기도 하는데, 충돌이 발생하면 git이 알려주는 파일의 충돌 부분을 직접 수정해서 병합이 가능하도록 해줘야 한다.
변경 내용을 병합하기 전에, 어떤 것이 바뀌었는지 비교해보기
  • git diff <기준 branch> <대상 branch>

3. 꼬리표(tag) 달기

  • 소프르퉤어의 새 버전을 발표할 때마다 꼬리표를 달아놓으면 좋다. (꼬리표는 SVN등에 이미 존재하는 기능)
  • git tag 1.0.0 1b2e1d63ff : 1.0.0이라는 tag를 추가한다.
    • 1b2e1d63ff는 tag가 가리킬 확정본(commit)의 식별자
    • 확정본(commit) 식별코드의 앞부분 일부만 입력해도 tag를 붙일 수 있지만, 그 일부분이 고유하다는 조건이 필요.
  • git log : 확정본(commit)목록, 식별코드를 확인할 수 있다.

4. 로컬 변경내용 되돌리기

  • git checkout -- <file name> : 변경 내용을 변경 전 상태(HEAD)로 되돌려준다. (이미 인덱스에 추가된 변경내용과 새로 생성한 파일은 그대로 남는다.)
  • 로컬에 있는 모든 변경내용과 commit을 포기하려면, git fetch origin으로 원격 저장소의 최신 이력을 가져오고, git reset --hard origin/master로 로컬의 master branch가 가져온 이력을 가리키도록 할 수 있다.

5. 유용한 명령어

  • git config color.ui true : 콘솔에서 git output을 컬러로 출력하기
  • git config format.pretty oneline : log에서 commit을 한 줄만 표시하기
  • git add -i : 파일을 추가할 때 대화식으로 추가하기