1. 컴퓨터와 컴퓨팅 - 기억장치




기억장치 파트에서는 컴퓨터가 수많은 데이터들을 어떻게 기억하고 저장하는지

기억장치의 종류와 특징에 대해서 공부한다! 

  1. 컴퓨터에 쓰이는 기억장치의 의미를 정확히 알자
  2. 기억장치의 종류를 알고 각각의 크기(용량)와 속도를 비교해보자


모든 bit는 CPU를 통과해야 한다.(프로그램 실행, 파일 저장 등)

하지만 CPU의 저장공간은 매우 한정적이다.

이유는 한번에 64bit 처리하면 되니까.(64bit pc 기준)


따라서 다른 곳에 데이터를 저장할 필요가 있다.(RAM, HDD 등)

파일이나 프로그램 더블클릭 시 도착하는 곳 -> RAM

자료나 프로그램들은 하드디스크에 복사되고 RAM에 임시저장된다.

이유는? 빠르니까!


그럼 여기서 잠깐,

Q. 왜 느린 HDD가 더 큰 용량을 가지고 있는 것일까..

A1. HDD는 모든 것을 동시에 처리할 필요가 없다.

A2. HDD 용량과 무관하게 CPU에서 병목현상이 일어난다.-> 데이터는 더 좁은 파이프라인으로 흘러간다.(용량을 큰 것 부터 작은 저장공간으로 )

A3. RAM은 가격이 비싸다! -> 용량 크게 가져가기엔 부담이 큰 것!


여기서 데이터가 점점 좁은 파이프라인으로 흘러간다는 것은 그림과 같다.



위 L3,L2, L1은 캐시메모리를 의미하는데, 뒤에 붙은 숫자는 1차,2차,3차 등의 의미로 이해하면 된다.

CPU에 가까울 수록 더 빠르게 데이터를 처리하는 기억장치이지만 용량이 작다.


위와 같은 순서로 배치함으로써 데이터 처리 지연을 줄이는 것이다.



가상기억장치

사용자가 만약 사용하는 프로그램에 비해 적은 용량의 RAM을 장착하고 있다고 가정해보자.

여러 프로그램을 켜놨고, 하나를 활성화 시키면 뒤로 간 프로그램(비활성화)은 RAM에서 HDD 내 별개의 공간으로 옮겨진다.(가상장치로 저장)

그래서 다시 불러올 때 지연 발생 가능성이 존재한다.(RAM이 충분하면 이런 문제는 없다!)



생각해볼 점

  1. 내 PC의 기억장치?

    - RAM 16GB, SSD 512GB
  2. 왜 RAM이 HDD보다 비쌀까?

    - 램과 같은 메모리는 반도체 칩에 정보를 저장하고 HDD는 자성을 입힌 원판(플래터)에 정보를 저장한다. 반도체 칩은 고용량으로 만들기가 어렵다.
       즉, 제조과정에서 비용이 크게 요구되는 것!
  3. 왜 이렇게 다른 단계의 기억장치를 사용할까?

    - CPU가 빠른 연산(처리)을 할 수 있고 이러한 구조에서 사용자가 지연을 덜 느끼며 효율적인 처리가 가능하다.







edwith에서 제공하는 CS50 강의를 참고로 학습하여 정리한 글입니다. 틀린 내용을 말씀해주신다면 언제든지! 수정하겠습니다. 감사합니다.

http://www.edwith.org/

'CS50' 카테고리의 다른 글

1. 컴퓨터와 컴퓨팅 - 하드웨어  (0) 2018.04.27

1. 컴퓨터와 컴퓨팅 - 하드웨어





나는 최근에 맥북 프로를 구매했다.


이 때 내가 고려한 스펙은 다음과 같다.


  • CPU
  • RAM
  • 그래픽카드
  • 비용
  • 메모리
  • 화면크기

위와 같은 요소들이 컴퓨터를 구성하고 있다. 라고 생각할 수 있겠다.


그렇다면 위 요소들은 어떻게 구성되어 있고, 어떤 기능을 하는지 알아보며 아래를 목표로 학습해보자.


  1. 컴퓨팅이 다른 분야의 혁신에 어떤 영향을 끼쳤을까?
  2. 컴퓨터의 하드웨어에는 어떤 요소가 있는지 설명할 수 있게 되어보자!하하


하드웨어는 컴퓨터를 물리적으로 구성하는 요소. 라고 할 수 있다.(물리적으로 구성하는 요소 라는 말이 잘 붙지 않는다.)

컴퓨터 관련 하여 물리적인 요소를 다 떠올려 보자.

먼저 지금 내가 보고 있는 모니터, 키보드, 마우스, 본체 케이스, 그 본체를 구성하는 많은 PCB 및 부품들...

모두 하드웨어라고 할 수 있겠다.

이러한 하드웨어들이 하는 기능은 컴퓨터에 연결되어 추가적인 기능을 수행하는 것이다.


어떤 추가적인 기능들을 할까?

현재 사용중인 키보드는 이 블로그에 글을 작성하는 것 처럼 타이핑을 할 수 있도록 해준다. 즉 입력장치로 구분할 수 있다.

마우스 또한 클릭, 드래그 등등을 통해 추가적인 기능을 할 수 있다. 마찬가지로 입력장치이다.

내가 보고 있는 모니터는 이러한 입력장치를 사용한 결과를 보여준다. 키보드로 입력한 결과를 보여주고 마우스로 그린 그림을 보여줄 수 있다. 즉 출력장치라 할 수 있다.

모두 같은 하드웨어이지만 키보드, 마우스, 모니터, 스피커, 프린트 등등 추가적인 기능을 수행하는 기기들을 주변기기라고 한다.


또한 중요한 요소 중 하나인 중앙 처리 장치기억장치가 있다.


중앙처리장치는 Central Processing Unit으로 CPU로 줄여 부른다. 입력장치에서 받은 명령을 실제로 처리하는 곳이다.

이 CPU의 속도는 1초에 얼마나 많은 연산을 하는지로 구분하고, 보통 GHz단위이다.


기억장치는 주기억장치보조기억장치로 나뉜다.

주기억장치의 대표적인 예는 RAM이다. RAM은 기억된 정보를 읽어내거나 다른 정보를 기억시킬 수도 있는 메모리이다.

응용프로그램을 일시적으로 불러오거나 데이터를 일시적으로 저장하는데 사용된다.

RAM은 메모리에 얼마나 많은 양의 정보를 저장하느냐에 따라 보통 GB[기가바이트]의 단위로 표시된다.


보조기억장치의 대표적인 예는 HDD, SSD이다. RAM이 일시적으로 데이터를 저장하는 것과 달리 HDD(하드디스크)와 같은 보조기억장치는 영구적으로 저장한다.(GB/TB단위)

즉, 휘발성/비휘발성의 특징 차이이다. 하드디스크는 원판 모양의 플래터를 회전시켜 드라이브에 데이터를 읽고 쓰는 원리이다.

SSD는 별도로 내부에 움직이는 부품이 없고 더 빠른 속도로 데이터를 읽고 쓴다.




생각해볼 점

  1. 어떻게 USB는 지금처럼 보편화 될 수 있었을까? 다른 회사들은 이 표준을 피하고 싶어할까?

    1990년대 이전에는 컴퓨터와 주변기기(키보드, 모니터, 마우스 등등) 연결에 사용하는 인터페이스가 다양했다.
    이와 관련한 지식이 부족하면 사용하기 힘들고, 제조사들도 곤란한 경우가 있었다.(다양한 인터페이스에 맞추려면)
    그래서 개발된 것이 USB라고 볼 수 있다. USB의 장점은 아래와 같다.
    별 다른 조작 없이 꽂기만 하면 즉시 사용가능
    주변기기가 별도 외부 전원 없이 동작
    Plug and Play 지원(일부 USB장치는 추가 SW설치 필요)
    Hot Swapping지원(컴퓨터 전원 켜진 상태로 연결/분리 가능)

    위와 같은 장점들과 더불어 제조사들에게 가장 큰 이득이었을 특허사용료 무료인 점으로 인해
    지금처럼 보편화가 될 수 있지 않았나 싶다.


    USB 표준은 굉장히 편리하고 좋지만 다른 회사에선 USB 표준을 피하고 싶을까????
    내 생각은 그럴 것 같다.
    먼저 이렇게 보편화 된 USB이고 현재는 무료로 특허 사용 가능하지만 유료로 바뀔 가능성도 없진 않겠다.(낮지만)
    그래서 각 회사마다 자신들이 독자적으로 개발한 인터페이스가 표준으로 채택되고 이를 사용하는 것이 가장 안전한 상황이라고 생각한다.
    정리하자면 현재 USB 표준을 사용하는 것이 편하고 보편화 되어있으니 다른 표준을 찾아 사용하고 싶어 한다기보다는
    좀 더 안전한 상황은 독자적으로 개발한 인터페이스가 표준으로 채택되고 널리 사용되는 것이라 생각하여 피하고 싶을 것이라 생각한다.
    소비자 입장에서는 인터페이스가 다양하면 불편하겠지만..
  2. SSD가 아닌 HDD를 사용해야 하는 이유가 있을까?

    특징을 비교해보자면
    HDD : 용량에 비해 저렴한 가격, 안정적, 속도 느림, 소음 심함
    SSD : 속도 빠름, 소음 없음(물리적 동작 없기 때문), 비쌈

    위와 같은 특징을 고려해봤을 때 HDD는 백업용 저장공간이 필요할 때 SSD 보다 유용하게 쓰일 것이다.







edwith에서 제공하는 CS50 강의를 참고로 학습하여 정리한 글입니다. 틀린 내용을 말씀해주신다면 언제든지! 수정하겠습니다. 감사합니다.

http://www.edwith.org/

'CS50' 카테고리의 다른 글

1. 컴퓨터와 컴퓨팅 - 기억장치  (0) 2018.05.01

백준 1991 : 트리 순회


문제

이진 트리를 입력받아 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)한 결과를 출력하는 프로그램을 작성하시오.

예를 들어 위와 같은 이진 트리가 입력되면,

  • 전위 순회한 결과 : ABDCEFG // (루트) (왼쪽 자식) (오른쪽 자식)
  • 중위 순회한 결과 : DBAECFG // (왼쪽 자식) (루트) (오른쪽 자식)
  • 후위 순회한 결과 : DBEGFCA // (왼쪽 자식) (오른쪽 자식) (루트)

가 된다.



입력

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자 대문자로 매겨지며, 항상 A가 루트 노드가 된다. 자식 노드가 없는 경우에는 .으로 표현된다.




출력

첫째 줄에 전위 순회, 둘째 줄에 중위 순회, 셋째 줄에 후위 순회한 결과를 출력한다. 각 줄에 N개의 알파벳을 공백 없이 출력하면 된다.



예제 입력 1 


7
A B C
B D .
C E F
E . .
F . G
D . .
G . .

예제 출력 1

ABDCEFG
DBAECFG
DBEGFCA















풀이



'Algorithm > 재귀함수' 카테고리의 다른 글

CodeUp 1901 : (재귀 함수) 1부터 n까지 출력하기  (0) 2018.03.27

백준 11052 : 붕어빵 판매하기


문제

강남역에서 붕어빵 장사를 하고 있는 해빈이는 지금 붕어빵이 N개 남았다.

해빈이는 적절히 붕어빵 세트 메뉴를 구성해서 붕어빵을 팔아서 얻을 수 있는 수익을 최대로 만드려고 한다. 붕어빵 세트 메뉴는 붕어빵을 묶어서 파는 것을 의미하고, 세트 메뉴의 가격은 이미 정해져 있다.

붕어빵 i개로 이루어진 세트 메뉴의 가격은 Pi 원이다.

붕어빵이 4개 남아 있고, 1개 팔 때의 가격이 1, 2개는 5, 3개는 6, 4개는 7인 경우에 해빈이가 얻을 수 있는 최대 수익은 10원이다. 2개, 2개로 붕어빵을 팔면 되기 때문이다.

1개 팔 때의 가격이 5, 2개는 2, 3개는 8, 4개는 10 인 경우에는 20이 된다. 1개, 1개, 1개, 1개로 붕어빵을 팔면 되기 때문이다.

마지막으로, 1개 팔 때의 가격이 3, 2개는 5, 3개는 15, 4개는 16인 경우에는 정답은 18이다. 붕어빵을 3개, 1개로 팔면 되기 때문이다.

세트 메뉴의 가격이 주어졌을 때, 해빈이가 얻을 수 있는 최대 수익을 구하는 프로그램을 작성하시오.



입력

첫째 줄에 해빈이가 가지고 있는 붕어빵의 개수 N이 주어진다. (1 ≤ N ≤ 1,000)

둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)



출력

해빈이가 얻을 수 있는 최대 출력



예제 입력 1 

4
1 5 6 7

예제 출력 1 

10
















풀이


bottom-up 방식

cost[i] 에 기존 계산했던 값들을 저장해 놓고 cost[i] 와 비교 -> 메모제이션?

'Algorithm > DP' 카테고리의 다른 글

Baekjoon 11057 : (DP) 오르막 수  (0) 2018.03.28

CodeUp 1411 : 빠진 카드


문제 설명   
 

우리는 1부터 N까지의 숫자가 차례대로 적힌 N장의 카드 묶음을 가지고 있다.

그런 데 이 카드 묶음을 옮기는 중 실수로 땅에 떨어뜨려 그 중 한 장을 잃어버렸다.

여러 분은 땅에 떨어진 카드 묶음을 읽어서 빠진 하나의 카드 번호를 찾아 출력해야 한다.


입력

첫 줄에는 한 장을 잃어버리기 전 카드의 전체 장수 N이 주어져 있다. 단 . 3 <= N <= 50 이다.

이어지는 N-1개의 각 줄에는 한 장이 빠진 카드 묶음의 카드 숫자가 하나씩 순서 없이 나열되어 있다.

출력

여러분은 주 어진 카드 묶음에서 빠진 하나의 카드를 찾아서 그 번호를 출력해야 한다.


입력 예시   

10 3 4 1 10 2 6 7 5 9

출력 예시

8




풀이


1부터 N까지의 카드가 순서대로 있고 이를 찾았으면 TRUE(1), 아니면 찾지 못한 것으로 놓고

for 문으로 찾은 카드들을 입력받고 다시 for문으로 전체 카드들을 찾았는지 검사했다.


더 좋은 방법 => N을 입력할 때 1~N까지의 값들을 모두 더하고, 찾은 카드 입력받을 때 마다 빼주면 맨 마지막 남는 값이 정답이다.

CodeUp 3117 : (Stack) 0은 빼!


문제


당신의 상관은 당신이 작년에 회사의 실적에 얼마나 도움이 되었는지 횟수를 세었다.

불행히도 당신의 상관은 때때로 횟수를 틀리게 읽는다.

다행히도 당신의 상관은 잘못된 숫자를 읽은 것을 인식하면 ‘zero’라고 말한다. 이는 ‘직전의 숫자는 무시한다’는 것을 의미한다. 

불행히고 당신의 상관은 실수를 반복할 수 있고, 매 실수 마다 ‘zero’라고 말한다. 

어느 순간이나 당신의 상관은 ‘zero’라고 말할 수 있으며, 만약 모든 숫자들이 무시되면 그 합은 0이 된다. 

상관이 말하는 문구를 입력받아 정확한 합을 구하는 프로그램을 작성하시오.



입력

첫 번째 줄에는 0(zero)을 포함하는 정수 K를 입력받는다.
그 다음 K줄동안 1부터 100까지의 정수 또는 을 입력 받는다.

[입력값의 정의역]



출력

정확한 합을 출력한다.



입력 예시


10 1 3 5 4 0 0 7 0 0 6


출력 예시

7





풀이


stack은 데이터를 1열로 나열하지만, 새롭게 추가한 데이터에만 접근할 수 있다.
후입선출(Last In First Out : LIFO)의 구조이다.
스택에 데이터를 추가하는 것을 push라고 하며 데이터를 꺼내는 작업을 pop이라고 한다.


결과











Baekjoon 9372 : (BFS) 상근이의 여행


문제


상근이는 겨울방학을 맞아 N개국을 여행하면서 자아를 찾기로 마음먹었다. 

하지만 상근이는 새로운 비행기를 무서워하기 때문에, 최대한 적은 종류의 비행기를 타고 국가들을 이동하려고 한다.

이번 방학 동안의 비행 스케줄이 주어졌을 때, 상근이가 가장 적은 종류의 비행기를 타고 모든 도시들을 여행할 수 있도록 도와주자.

상근이가 한 국가에서 다른 국가로 이동할 때 다른 국가를 거쳐 가도(심지어 이미 방문한 국가라도) 된다.




입력

첫 번째 줄에는 테스트 케이스의 수 T(T ≤ 100)가 주어지고,

각 테스트 케이스마다 다음과 같은 정보가 주어진다.

  • 첫 번째 줄에는 국가의 수 N(2 ≤ N ≤ 1 000)과 비행기의 종류 M(1 ≤ M ≤ 10 000) 가 주어진다.
  • 이후 M개의 줄에 a와 b 쌍들이 입력된다. (a와 b를 왕복하는 비행기가 있다는 것을 의미한다)
  • 주어지는 비행 스케줄은 항상 연결 그래프(Connected Graph)를 이룬다.




출력

테스트 케이스마다 한 줄을 출력한다.

  • 상근이가 모든 도시를 여행하기 위해 타야 하는 비행기 종류의 최소 개수를 출력한다.






풀이


문제 자체가 잘 이해가 안되서 여러 번 읽어보았다.
국가의 수가 입력되는데, 5가 입력되면 1,2,3,4,5 라는 국가가 있는 것이다.
출력에서는 모든 도시를 여행해야하기 때문에, 입력을 할 때 모든 국가를 포함할 수 있도록 조심해야 겠다.


- 연결 그래프란?

모든 두 꼭짓점 사이에 경로가 존재하는 그래프이다.

모든 꼭짓점 사이에 경로가 존재할 때, 최소로 이용하는 비행기는 결국 최단 경로만 찾으면 된다.
최단 경로는 언제나 꼭짓점, 즉 국가의 갯수 - 1이다.


결과



테스트 케이스마다 한 줄 출력이라고 해서 위와 같이 코딩했는데 백준에서는 출력형식이 잘못되었다고 결과 나옴.
수정 필요!





Baekjoon 11057 : (DP) 오르막 수


문제


오르막 수는 수의 자리가 오름차순을 이루는 수를 말한다. 이 때, 인접한 수가 같아도 오름차순으로 친다.

예를 들어, 2234와 3678, 11119는 오르막 수이지만, 2232, 3676, 91111은 오르막 수가 아니다.

수의 길이 N이 주어졌을 때, 오르막 수의 개수를 구하는 프로그램을 작성하시오. 수는 0으로 시작할 수 있다.




입력

첫째 줄에 N (1 ≤ N ≤ 1,000)이 주어진다.




출력

첫째 줄에 길이가 N인 오르막 수의 개수를 10,007로 나눈 나머지를 출력한다.





DP(Dynamic Programming) 란??

간단히 말해, 작은 문제의 답을 조합하여 큰 문제의 답을 구하는 것이다.

다이나믹 프로그래밍 알고리즘을 적용하기 위해서는 아래와 같은 조건을 만족해야 한다.

  • Overlapping Subproblem
  • Optimal Substructure

Overlapping Subproblem 은 중복되는 부분 문제이다. 예를 들면 N번째 피보나치수를 구하는 문제를 구하는 문제는 N-1번째 N-2번째 피보나치 수를 구하는 문제가 되고 다른 수를 구할 때 같은 문제가 겹치는 경우가 생긴다.
큰 문제와 작은 문제를 같은 방법으로 풀 수 있어야한다. 그리고 문제를 작은 문제로 나누어서 풀 수 있어야한다.

Optimal Substructure 문제의 정답을 작은 문제의 정답을 구할 수 있다. 다이나믹 프로그래밍에서는 작은 문제들을 한 번만 풀어야한다.(시간을 줄이려면 당연히) 그리고 정답을 구했으면 이 답을 어딘가 메모해놓고 (Memoization) 이 답들을 이용해서 큰 문제를 푼다. 그리고 저장되는 공간을 cache라고 한다. 따라서 DP를 구현하기 위해서는 메모를 작성하는 부분과 메모를 읽는 부분이 필요하다. (위 풀이에서는 이 메모가 배열에서 이루어진 것인가?)

다이나믹 프로그래밍 문제를 푸는 방법에는 크게 두가지가 있다.

  • Top-down
  • Bottom-Up

Top down 방식으로 문제를 푸는 방법은 다음과 같다.

  1. 문제를 작은 문제로 나눈다.
  2. 작은 문제들을 푼다.
  3. 작은 문제들의 답으로 전체 문제를 푼다.

위의 피보나치 수열을 구하는 방법이 Top-down의 좋은 예이다. 주로 재귀함수를 이용해서 구현한다고 한다.

Bottom-Up 방식으로 문제를 푸는 방법은 다음과 같다.

  1. 가장 작은 문제부터 푼다.
  2. 문제의 크기를 점점 크게 만들어서 전체문제를 푼다.


(참고 : http://gnujoow.github.io/algo/2016/05/15/Algo0-dynamic-programing/)


'Algorithm > DP' 카테고리의 다른 글

백준 11052 : 붕어빵 판매하기  (0) 2018.04.07

CodeUp 1901 : (재귀 함수) 1부터 n까지 출력하기



문제


부터 정수 n 까지 출력하는 재귀함수를 설계하시오.

이 문제는 반복문 for, while 등을 이용하여 풀수 없습니다.




입력

정수 n이 입력된다




출력

1부터 n까지 한 줄에 하나씩 출력한다.





재귀함수란??


함수 안에서 함수 자기 자신을 호출하는 것을 재귀 호출이라고 한다.(recursive call)
일반적인 상황에선 쓰지 않지만 알고리즘을 구현할 때 매우 유용하다.
반복문으로 구현한 알고리즘 보다 코드가 더 직관적이이고 이해하기 쉽기 때문이다.

재귀함수 사용 시, 주의점은 종료 조건을 잘 만들어주어야 한다는 것이다.
종료를 못하면 언젠가 스택이 꽉차고, 스택 오버플로우가 일어나며 프로그램이 종료된다.

(참고 : https://dojang.io/mod/page/view.php?id=584)



'Algorithm > 재귀함수' 카테고리의 다른 글

백준 1991 : 트리 순회  (0) 2018.04.14

프로젝트 오일러 (Project Euler) #1. 3과 5의 배수


프로젝트 오일러에 대한 소개 글을 올린지 11일이나 지나서 1번 문제를 올리네요..ㅋㅋㅋ


나름대로 너무 바빴나 봅니다.


이 글을 읽는 분들의 문제를 풀어나가는 재미를 빼앗지 않기 위해 정답은 제 github에 올리고 주소만 올릴 생각입니다.

이 글에서는 제가 문제를 푸는 데 있어서 사용한 C언어 문법적인 이야기 하도록 하겠습니다.

풀어보시다가 정 모르겠거나, 다른 사람이 어떻게 생각하고 풀었는지 궁금하시다면 방문해주세요.(의견 나눔 대환영!)

(블로그의 글은 저의 생각이지, 무조건 정답은 아닙니다.)


그럼 바로 시작하겠습니다.



#1. If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these            multiples is 23.

      Find the sum of all the multiples of 3 or 5 below 1000.


#1. 10 이하의 자연수 중에 3,5 의 배수를 나열해 본다면, 3,5,6,9 입니다. 이들의 합은 23입니다.

     1000이 하의 자연수 중에서 3과 5의 배수들의 총 합을 구하세요.





제 방법에 문제가 있다거나, 좀 더 효율적인 방법은 댓글로 얼마든지 알려주세요 ^^


읽어주셔서 감사합니다.














+ Recent posts