status의 원리

|

status의 원리

  • index라는 파일, status의 명령이 어떻게 동작하는지에 대한 공부(직관적인 이해)

  • index 파일과 최신 커밋 파일(tree)의 비교를 통해 git status가 커밋할 파일이 있는지, 없는지를 결정
    • 두 내용이 일치하면 git status에서 커밋할 내용이 없다고 판단
  • vim f2.txt로 내용을 변경 후, git status로 확인해보면 f2.txt 파일이 수정 된 것을 확인 할 수 있음
    • git은 index 파일에 적혀있는 f2.txt의 내용의 값과 실제 f2.txt의 내용이 다르다면, 해당 파일이 수정 되었다고 감지
  • git add f2.txt를 하고, git status로 확인하면, 수정 된 것은 똑같으나 changes to be committed를 확인 가능
    • 즉, 커밋 대상에 포함 된 상태가 됨
    • 두 개의 상태를 gistory로 확인해보면, object에 새로운 파일이 추가된 것을 확인 가능(커밋 대기 상태)
  • 이를 통해 git은 index의 내용과 최신 커밋의 tree가 가르키고 있는 f2.txt의 내용이 다르다면, 현재 f2.txt는 index에 add되어 커밋 대기 상태가 된 것을 알 수 있음
  • git commit을 하고 커밋 메세지를 작성 후 gistory를 확인하면, 커밋이 만들어졋고 그 tree에는 f2.txt의 고유번호가 index과 tree가 같게 된 것을 확인 가능
    • index와 저장소와 프로젝트 폴더 세가지가 정확하게 일치하기 때문에 git status로는 더이상 커밋할게 없다고 알려주게 됨
  • index 파일과 commit의 tree 사이의 관계를 정리해보면?
views
  • workspace는 우리가 .git 디렉터리 바깥의 프로젝트 폴더를 의미
  • workspace에서 git add를 하게 되면 해당 내용들이 index파일에 등록되고, 커밋을 하면 index에 등록된 내용들이 local repository에 저장됨
    • object가 저장 되며, commit object, tree, 파일이 저장 됨
views
  • staging area는 위의 그림에서 index파일, 즉 커밋 대기 상태인 staging area에 올라간 상태를 의미
  • woriking directory에서 git add를 하게 되면 saging area, git commit 하면 repository에 저장 됨

  • git의 구조
    • workspace = working directory = work tree
    • index = staging area = cache
    • repository

190213 백준 알고리즘 문제풀기

|

[10828] 스택

문제

  • 정수를 저장하는 스택을 구현 후 입력으로 주어지는 명령어를 처리
    • push X: 정수 X를 스택에 넣는 연산이다.
    • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
    • size: 스택에 들어있는 정수의 개수를 출력한다.
    • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
    • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • 스택(Stack)은 제한적으로 접근할 수 있는 나열 구조
  • 접근 방법은 목록의 끝에서만 일어나며, 끝먼저내기 목록(Pushdown list)라고도 함
  • 스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)로 되어있음
  • 자료를 밀어넣는것을 푸시(Push) , 넣어둔 자료를 꺼내는것을 팝(Pop) 이라고 하며, 가장 최근에 보관한 자료부터 나오게 됨.
  • 예를 들어, a, b, c를 순서대로 넣은 다음 자료를 하나씩 꺼내면 c, b, a 순서대로 나오게 됨

정답

class Stack:
    def __init__(self):
        self.len = 0
        self.list = []

    def push(self, num):
        self.list.append(num)
        self.len += 1

    def pop(self):
        if self.size() == 0:
            return -1
        pop_result = self.list[self.len-1]
        del self.list[self.len-1]
        self.len -= 1
        return pop_result

    def size(self):
        return self.len

    def empty(self):
        return 1 if self.len == 0 else 0

    def top(self):
        return self.list[-1] if self.size() != 0 else -1

stack = Stack()
for _ in range(int(input())):
    input_split = input().split()
    op = input_split[0]
    if op == "push":
        stack.push(input_split[1])
    elif op == "pop":
        print(stack.pop())
    elif op == "size":
        print(stack.size())
    elif op == "size":
        print(stack.size())
    elif op == "empty":
        print(stack.empty())
    elif op == "top":
        print(stack.top())
    else:
        print("ERROR")

190211 백준 알고리즘 문제풀기

|

[4948] 베르트랑 공준

문제

  • 입력되는 수 n에 대해 n보다 크고 2n보다 작거나 같은 소수의 갯수를 출력

정답

import sys
import math

def isprimenum(num):
    if num <= 1:
        return 0
    for j in range(2, int(math.sqrt(num))+1):
        if num/j == 1:
            break
        if num%j == 0:
            return 0
    return 1

result = 0
while(1):
    num = int(sys.stdin.readline())
    if num == 0:
        break
    else:
        result = 0
        for j in range(num+1, 2*num+1):
            result += isprimenum(j)
        print(result)

[9020] 골드바흐의 추측

문제

  • 골드바흐의 추측은 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것
    • 즉, 4=2+2, 14=7+7로 모든 짝수는 두 소수의 합으로 출력 가능하다는것을 의미
  • 첫째 줄에 테스트 케이스, 주어지는 수는 짝수로 주어짐
  • 경우의 수가 많은 경우, 두 소수의 차가 적은 수를 출력해야 함
    • 이를 이용해, for loop를 돌때는 끝 수(주어지는 )의 절반부터 마지막까지 돌면 속도가 빠르게 문제도 해결 가능

정답

import sys
import math

def isprimenum(num):
    if num <= 1:
        return 0
    for j in range(2, int(math.sqrt(num))+1):
        if num/j == 1:
            break
        if num%j == 0:
            return 0
    return 1

for _ in range(int(sys.stdin.readline())):
    num = int(sys.stdin.readline())
    fnum = 0
    lnum = 0
    for j in range(int(num/2), num+1):
        if isprimenum(j) == 1:
            fnum = j
            lnum = num - fnum
        if isprimenum(lnum) == 1:
            print(lnum, fnum)
            break

190209 백준 알고리즘 문제풀기*

|

[1929] 소수 구하기*

문제

  • M이상 N이하의 소수를 모두 출력하는 프로그램을 작성
  • 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어짐 (1 ≤ M ≤ N ≤ 1,000,000)

  • 기존의 함수를 이용해서 문제를 풀었으나 시간초과가 발생했다.
  • 에라토스테네스의 체를 이용
    • 무식하게 배수들을 지워나가는 방식이지만, 그만큼 빠르게 작동 할 수
  • 만약 어떤 수 $m=ab$라면, $a$와 $b$중 적어도 하나는 $\sqrt{n}$이하이므로, $n$보다 작은 합성수 $m$은 $\sqrt{n}$보다 작은 수의 배수만 체크해도 전부 걸러질 수 있음. 따라서 $\sqrt{n}$이하의 수의 배수만 지우면 됨.

정답

import sys
import math

def isprimenum(num):
    if num <= 1:
        return 0
    for j in range(2, int(math.sqrt(num))+1):
        if num/j == 1:
            break
        if num%j == 0:
            return 0
    return 1

nums = list(map(int, sys.stdin.readline().split()))
for j in range(nums[0], nums[1]+1):
    if isprimenum(j)==1:
        print(j)

190208 백준 알고리즘 문제풀기

|

[2581] 소수

문제

  • 2개의 정수가 입력되고, 두 수를 포함하는 사이의 수들 중 소수를 찾아 그 합과 제일 작은 소수를 출력

  • 소수는 1보다 큰 자연수이므로 그 이하의 수는 소수가 아니다
  • 약수가 없는 수가 소수이므로 2부터 자기자신/2 까지만 소수인지 확인하면 된다
  • 2부터 자기자신/2까지 판단할 수를 나누며 나머지가 0이된다면 소수가 아님(약수가 존재)
  • 아닐경우는 소수로 판단한다.

정답

def isprimenum(num):
    lnum = int(num / 2)
    if num <= 1 or num == 4:
        return 0
    for j in range(2, lnum):
        if num%j == 0:
            return 0
    return 1
pnums = []
nums = []
nums.append(int(input()))
nums.append(int(input()))

for j in range(nums[0], nums[1]+1):
    if isprimenum(j)==1:
        pnums.append(int(j))
if sum(pnums)==0:
    print(-1)
else:
    print(sum(pnums))
    print(sorted(pnums)[0])