전체 글

Hello World
컴퓨터가 0과 1로 숫자와 문자를 표현하는 방법 컴퓨터가 0과 1로 숫자를 표현하는 방법 컴퓨터는 0과 1로 숫자를 표현할 수 있다. 전기를 이용해 컴퓨터를 동작시키기 때문인데, 전기가 흐르면 1, 흐르지 않으면 0이 된다. 이 때문에 컴퓨터에서는 2진법을 사용한다. 한 개의 비트로는 2가지의 상태밖에 표현할 수 없다. 더 많은 숫자 (또는 상태)를 표현하기 위해서는 많은 스위치를 연결하면 된다. 위 그림에서 0000은 0, 1000은 8, 1100은 12, 1111은 15를 나타낸다. 정보 단위 - 비트(bit): 0과 1을 표현하는 가장 작은 단위 - n비트로 2^n가지의 정보 표현 가능 - 프로그램은 수 많은 비트로 이루어져 있다. - 하지만 "이 파일은 9876543210비트야"라고 말하지는 않는..
· C
C언어의 컴파일 과정 C언어로 만든 코드, 이를테면 main.c라는 이름을 가진 파일을 컴파일 하면 그 결과로 main.exe 파일이 생성된다. 하지만 실행 파일은 한 번에 생성되는 것이 아니라 전처리기 - 컴파일러 - 어셈블러 - 링커를 통과하는 일련의 과정을 거쳐 생성된다. 전처리 과정 (pre-processing, main.c → main.i) - 본격적으로 컴파일 하기 전에 처리할 작업들을 관리 - 외부에 선언된 다양한 소스 코드, 라이브러리를 포함한다. (e.g. #include) - 프로그래밍의 편의를 위해 작성된 매크로를 변환한다. (e.g. #define) - 컴파일할 영역을 명시한다. 컴파일 과정 (compile, main.i → main.s) - 전처리가 완료되어도 여전히 소스 코드 상..
· 백준
코드 (스택 이용) # 1-3, 3-1 5-5 # 결국 사이클을 찾는 문제 -> 무방향 그래프는 dfs로 사이클 판별 가능 import sys input = sys.stdin.readline n = int(input()) numdict = dict() # 인접 리스트 방식, 1개당 1개씩만 짝지어져서 dict 사용 for i in range(1, n+1): x = int(input()) numdict[i] = x def dfs(x): stack = [x] visited[x] = 1 path = [x] flag = False while stack: pn = stack.pop() if numdict[pn] == x: flag = True # 여기서 바로 리턴해도 상관 X if not visited[numdi..
컴퓨터의 핵심 부품 4가지 컴퓨터의 핵심 부품 4가지에 대해 러프하게 정리해보았다. 컴퓨터의 핵심부품1 메모리(주기억장치) - 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다. - 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다. - 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다. - 메모리에 저장된 값의 위치는 주소로 알 수 있다. 컴퓨터의 핵심부품2 CPU (central processing unit) - CPU는 메모리에 저장된 명령어를 읽고 해석하고 실행하는 부품이다. - CPU 내부에는 ALU, 레지스터, 제어장치가 있다. (실제로는 더 많은 부품이 있는 매우 정교한 부품이지만, 크게 3가지로 볼 수 있다) - ALU(산술 논리 연산 장치): 계산기 - ..
컴퓨터 구조 컴퓨터 구조를 배워야 하는 이유는 다음과 같다고 한다. 1. 성능, 비용, 용량에 맞는 개발을 할 수 있다. 2. 컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자가 될 수 있다. (문제 해결 능력 배양) 컴퓨터 구조는 결국 성능, 용량, 비용에 대한 이야기이다. 따라서 프로그래밍 언어의 문법만으로 해결하기 어려운 문제들을 해결(또는 고려)할 수 있다. 컴퓨터 구조에서 배우는 것은 크게 두 가지 1. 컴퓨터가 이해하는 정보 (데이터와 명령어) 1-1. 데이터: 숫자, 문자, 이미지, 동영상과 같은 정적인 정보 컴퓨터와 주고받는/내부에 저장된 정보를 데이터라고 통칭하기도 한다. 0과 1로 숫자를 표현하는 방법 0과 1로 문자를 표현하는 방법 1-2. 명령어 컴퓨터는 결국 명령어를 처리하는 기계..
· 백준
코드 n,m = map(int, input().split()) lecture = [*map(int, input().split())] # 가장 큰 경우는 1개에 다 때려박았을 때의 시간 # 가장 작은 경우는 1개씩만 넣었을 때의 시간, 블루레이는 같은 크기여야하므로 가장 큰 값을 가짐 s,e = max(lecture), sum(lecture) while s mid: # mid보다 클 경우 개수 증가 및 시간 초기화 cnt += 1 temp = 0 temp += i if cnt > m: s = mid + 1 # 개수가 넣으려는 블루레이보다 많을 경우, 블루레이 용량을 늘려야함 else: e = mid - 1 # 그 외에는 용량을 줄임 print(s) 어떤 걸 변수로 두고 찾아야하는지 많이 헤맸던 문제. 그래..
· 백준
코드 # 특정 배열에서 크기가 고정인 부분 배열을 빠르게 처리해야한다 -> 슬라이딩 윈도우 from collections import deque n,m = map(int, input().split()) dnastring = input() cntlst = [*map(int, input().split())] cnt = 0 nstr = deque(dnastring[:m]) numdict = {"A":0, "C":0, "G":0, "T":0} for i in nstr: if i == "A": numdict[i] +=1 elif i == "C": numdict[i] +=1 elif i == "G": numdict[i] +=1 elif i == "T": numdict[i] +=1 if numdict["A"] >= ..
· 백준
코드 # 특정 배열에서 고정된 크기의 부분 배열을 처리 -> 슬라이딩 윈도우 n,m = map(int, input().split()) num_lst = [*map(int,input().split())] visited = sum(num_lst[:m]) # 연속된 날짜의 합 구하기(매일 변하는 값) res = visited # 결과를 저장할 값 (조건을 만족할 때마다 변하는 값) s = 0 days = 1 for i in range(m,n): temp = visited + num_lst[i] -num_lst[s] # 전날을 빼고 그 다음 날을 넣은 값 if temp > res: res = temp days = 1 elif temp == res: days += 1 s+=1 # 다음날로 visited = tem..
트리 트리는 그래프의 일종으로 노드들이 나무 가지처럼 연결된 비선형 계층적 자료구조이다. 트리 용어 Node: 트리 구조의 교점으로 node는 데이터를 가지고 있고, 자식 노드를 가질 수 있음. Root Node: 트리 구조에서 가장 위에 있는 노드. 즉, 트리의 시작점이 되는 노드. Edge: 트리를 구성하기 위해 노드와 노드를 연결하는 선. Level: 트리의 특정 깊이를 가지는 노드의 집합. Degree: 각 노드가 가진 가지의 수. '차수'라고도 함 Leaf Node (Terminal Node): 하위에 다른 노드가 연결되어 있지 않은 노드. Internal Node: Leaf Node를 제외한, 중간에 위치한 노드들. 트리의 특징 트리 자료구조는 일반적으로 대상 정보의 각 항목들을 계층적으로 구..
누적합 누적합은 리스트의 각 원소에 대해 그 이전 원소들의 합을 미리 구해 구간의 합을 구하는 방법이다. 이를테면 매출을 매일 기록해둔 카페 주인이 주말 매출과 주중 매출을 알고 싶어한다. 월요일을 일주일의 시작이라고 가정하고 예시를 살펴보자. 카페 수익 월 화 수 목 금 토 일 1 2 3 4 5 6 7 화요일부터 금요일까지의 수익은 2,3,4,5의 합인 14이다. 또 수요일부터 일요일까지의 매출의 합은 3,4,5,6,7의 합인 25가 된다. 데이터가 적으면 빠르게 구할 수 있지만, 데이터가 많아질수록 합을 구하는 시간이 오래 걸린다. 이때 누적합을 이용하면 빠르게 구할 수 있다. 화요일부터 금요일까지의 매출은 2,3,4,5를 다 더해주는 것이 아니라, 금요일까지의 누적합에서 월요일까지의 누적합을 빼주면..
Melon Man
제발 CPU는 집에서 만들어 씁시다