목록Computer Science (54)
용's
데이터베이스가 나오기 전의 파일시스템은 중복된 정보들이 너무 많아서 이를 효율적으로 처리하기 힘들다는 단점이 존재. 따라서, 이러한 중복을 피해서 정보를 일원화하여 서로 관련성을 갖는 데이터의 집합을 모아놓은 것이 바로 데이터베이스(Database). 이러한 데이터베이스에는 일반적으로 데이터 항복의 각 값이 데이터베이스에 중복없이 한번만 기록될 때 데이터의 일관성이 유지된다고 한다(이러한 중복없이 데이터를 한번만 기록하기 위한 데이터베이스의 설계 이론을 정규화라 하고...) 하지만 항상 중복을 배제하기는 하지만 경우에 따라 불가피하게 중복을 허용하는 데이터가 있다. 이러한 것을 최소한의 중복 또는 통제된 중복이라고 한다. 즉, 정규화를 하면 데이터의 중복을 통제하여 중복이 최소화되도록 설계할 수 있다. ..
이번 N사 면접가서 굉장히 다양한 전공지식 질문을 받았는데... 대답 못한 질문이 대다수였지만 자꾸 생각나는 질문 하나를 이번 기회에 정리해보고자 한다. "프로세스간에 통신은 못하나요?" ※ 본 글은 한빛미디어의 "프로세스 간 통신 방법과 프로그램 작성" 문서 요약문이 되겠다. 운영체제 내에서 수행되는 프로세스들은 여러 가지 필요에 의해 서로 데이터를 주고 받을 필요가 있다. 데이터를 주고받는 프로세스들을 분류해보면 간단하고 짧은 메시지를 주고 받거나 복잡하고 긴 메시지를 주고받을 수 있고, 동일한 시스템의 프로세스끼리 통신을 하거나 서로 다른 시스템의 프로세스끼리 통신할 수 있다. 그리고 통신의 주체가 되는 양쪽 끝의 프로세스가 모두 사용자 프로세스일 수도 있고 한쪽이 시스템의 커널일 수도 있다. 간단..
가장 먼저 Pivot을 배열에서 하나 선택해서 Pivot을 기준으로 왼쪽에는 Pivot보다 작은 수가, 오른쪽에는 Pivot보다 큰 수가 정렬되도록 한다. 이를 위해 배열의 인덱스 0을 가르키는 Low(또는 Left)를 시작으로 인덱스를 하나씩 증가시키며 Pivot보다 큰 수를 찾는다. Left가 찾고 난 뒤, Right가 배열의 끝에서 점점 감소하며 Pivot보다 작은 수를 찾는다. 그러면 현재 Left는 Pivot보다 큰 수, Right는 Pivot보다 작은 수를 가르키고 있으므로 이 둘을 Swap한다. (위의 그림에서는 두 수를 모두 찾고 나서 swap하는 것이 아닌, 빈칸(Vac)이 생기는 곳에 곧바로 찾은 수를 넣고 있다. 예를 들면, Pivot으로 선택된 45가 있던 자리에 Vac이 생기고, ..
이전 포스팅에서는 Change Making 문제를 다뤘다. 이번 동적 프로그래밍 문제에서는 '주어진 동전의 종류를 이용하여 목표치(W)를 만드는 경우의 수 카운트' 문제를 풀어보도록 한다. 알고리즘을 단번에 생각해내기가 상당히 어렵다. 차근차근 이 문제를 접근해보자 예를 들어 설명하는 것이 가장 빠를 듯 하다. 1원 2원을 이용하여 4원(W)을 만드는 경우의 수는 몇 가지인가? 1+1+1+1 = 4 2+1+1 = 4 2+2 = 4 이렇게 총 3가지가 된다. 1원 2원을 이용하여 5원(W)을 만드는 경우의 수는 몇 가지인가? 1+1+1+1+1 = 5 2+1+1+1 = 5 2+2+1 = 5 이렇게 총 3가지가 된다. 자세히 보면, 1원으로 W를 만드는 경우의 수 + 2원을 이용하여 W를 만드는 경우의 수로 ..
change making problem [https://en.wikipedia.org/wiki/Change-making_problem] 위키피디아에서 알 수 있듯이 이 문제는, '주어진 동전의 종류를 조합하여 목표 금액을 만들고자 할 때, 최소의 동전 개수를 구하는 문제' 예를 들면, 다음 문제와 같다. '1원 5원 10원을 가지고 15원을 만들고자 할 때, 15원을 만드는 조합 중 최소의 동전 개수는?' Greedy한 방식으로도 풀 수 있지만 이 문제는 가장 기초적인 동적 프로그래밍(Dynamic Programming)로 해결할 수 있는 문제 중 하나이다. 아이디어는 다음과 같다. 1원이 포함된 n가지 동전으로 W원을 만들고자 할 때, W원을 만드는 최소의 동전 개수는 다음 두가지 경우의 수 중 최소값..
순열을 만드는 아이디어는 다음과 같다 N Permutation 1 a 2 ba ab 3 cba bca bac cab acb abc ... ... 표를 자세히 보면 N이 1에서 2가 될 때, a를 사이에 두고 b가 앞 뒤쪽으로 하나씩 생겨 2개의 순열이 생겨났다. N이 2에서 3이 될 때, O b O a O 의 O에 c가 하나씩 생겨 3개의 순열이, O a O b O 의 O에 c가 하나씩 생겨 3개의 순열이 생겨 총 6개의 순열이 생겼다. 여기서 ba, ab는 N=1 -> N=2로 될 때 만들어 진 것. 따라서 Recursive Call 방법으로 순열을 만들 수 있을 것이다. (N! 이면, '(N-1)!은 내가 만드니 N만 니가 처리해줘' 라는 방식) 코드를 짜봤지만, 그 다지 깔끔한 코드가 아닌 듯 하다..
BigDecimal 클래스- 오차가 존재하지 않는 실수의 표현을 위해 정의된 클래스 - 실제 double이나 float를 사칙연산 시, 근사치 계산으로 정확한 수치의 결과가 나오지 않음예) double a = 4.7double b = 0.4a+b = 5.1000000000000005와 같은 결과가 나옴 이때 a와 b를BigDecimal a = new BigDecimal("4.7")BigDecimal b = new BigDecimal("0.4")의 객체로 만들고 a.add(b)를 하면 결과가 5.1이라는 정확한 실수로 나오게 된다.
▶ 혼잡 회피 알고리즘(Congestion Avoidance Algorithm) → 혼잡(Congestion)이란, 대기(Waiting)/큐잉(Queuing)를 포함하는 어떠한 곳에서도 발생 가능한 것으로, 네트워크 내 대기하는 패킷 수가 네트워크 처리 용량을 초과하는 현상을 보통 말함. → 이를 회피하는 알고리즘으로는 RED, WRED, TCP Vagas, ECN 등이 있다. → RED- 버퍼(큐)가 오버플로우될 떄까지 기다리지 않고, 패킷들을 폐기(Drop)하는 방법- 즉, 패킷을 보낼 수 있지만 특정 Sender(랜덤한 Sender)의 패킷을 Drop시켜 버퍼의 오버플로우를 피함 → WRED- RED 알고리즘에서 Drop시키는 플로우(Flow)를 특정 기준/정책에 준하는 값에 따라 우선순위를 두고 ..
최소값(또는 최대값)을 찾아서 계속해서 앞쪽(또는 뒤쪽)으로 두는 정렬방식... 123456789101112131415161718192021222324 int main(){ int a[10] = { 5, 2, 3, 10, 1, 7, 9, 8, 6, 4 }; for (int i = 0; i