1.Virtual Memory를 사용해서 메모리의 관리가 쉬워졌는데
메모리의 물리적 위치는 동일하지만 운영체제에서 프로그램에 필요한 부분만 가져와
추상화된 주소를 0부터 시작하는 방식이다.
이런 유연한 메모리 관리 방식을 동적 메모리 할당이라고 한다.
Virtual Memory의 사용의 이점은 각자 메모리를 할당받기 떄문에
서로로부터 격리되었기 때문에 한 프로그램에서 문제가 발생해도 다른 프로그램에 영향을 주지 않는다.
이런 보호 방식을 Memory Protection이라고 한다.
2.데이터의 저장은 펀치카드에서 튜브(지연장치)로 넘어가고
튜브형태에서 다시 개선된 것이 자심 기억장치로 넘어가게 된다.
자심 기억장치는 전류를 통해 극성의 위치로 0과 1을 표기하는데
격자로 배치해 어디서든 전류로 접근할 수 있다는 장점이 있다
하지만 격자무늬로 배치하는 것에 한계를 느끼고 자기 테이프라는 새로운 저장장치가 개발되었으며
저장된 자성을 테이프 드라이브라는 기계 내부에서 회전하며 조회할 수 있었다.
테이프 드라이브는 회전에 의해 접근할 수 있었기 때문에
자기 드럼 기억장치라는 병렬적 배치로 접근 량을 늘리고 회전 속도를 늘려
더 빠르고 많은 데이터를 조회할 수 있게 개선했다.
자기 드럼 기억장치가 드디어 우리가 알고 있는 디스크의 시초가 된다고 볼 수 있다.
디스크는 표면이 자성을 띄기 때문에 유사한 동작을 하며
더 작고 얇기 때문에 많이 쌓을 수 있고 더 빠르게 회전할 수 있다.
하드 디스크의 디스크가 이 디스크의 일종이라고 할 수 있으며
현재까지도 사용되고 있다.
3.이미지는 0~255까지의 숫자를 통해 표현하며
각각의 정도를 Red, Green, Blue 3가지의 0~255로
255255255같은 하나의 줄이 픽셀 하나를 나타내며
이 픽셀들이 모여 화면에 출력되는 색을 표현한다.
4.파일들의 각각 데이터들은 작성 순서에 따라 들어가기 때문에
정렬되어 있다고 생각할 수 있지만 데이터의 제거 및 추가가 반복될 경우
빈 공간에 마구잡이로 채워지기 때문에 현재 데이터의 위치를 파악하기가 어렵다.
이런 문제점을 해결하기 위해 Directory File이라는
다른 파일이 있는 위치를 기록하는 특수 파일이 존재하는데
특정 파일의 이름, 생성일, 수정일, 생성자, 읽고쓰기 여부 등 다양한 정보와
어디서 어디까지의 위치를 차지하고 있는지 또한 기록된다.
5.데이터를 삭제하더라도 실제로 그 데이터 위에 0이 덮어씌워져 지워지는 것이 아니라
그 데이터 위에 다른 데이터를 덮어씌워도 된다는 허가가 떨어진 것이기 때문에
실제로는 해당 데이터를 복구 할 수 있게 된다.
그렇기 때문에 파일을 확실히 지워야 할 경우
지우고 싶은 파일을 모두 지운 다음 용량의 최대치까지 가득 채우는 행동이 필요하며
확실함을 위해 몇번 반복하는 것이 좋을 것 같다.
6.조각모음은 파일들의 빈 공간을 정리해 공간을 마련해준다고 생각했지만
사실은 각각의 블록들이 가득 찰 때 마다 새로운 블록을 추가로 할당받고
해당 파일들의 블록이 여기저기에 흩어져 있기 때문에 모두 방문하기 오래 걸리기 때문에
여러 블록으로 나눠진 파일들의 순서에 따라 한 곳에 모아주는 작업이 조각모음이었다.
7.일반적 압축은 공통된 부분을 갯수로 표현한 다음 없애 버리는 방식으로 진행된다.
aabbbbcddddeffghhhhhh = 2a4b1c4d1e2f1g6h 21 => 16
위의 예시와 같은 느낌이지만 실제 데이터의 중복이 많으면 많을 수록 유용한 방식이며
이런 방식으로 진행할 경우 원본 그대로 복구가 가능하기 때문에 "무손실"압축이라고 한다.
반대로 "손실"압축의 경우에는 일정 정도의 손실이 있음에도
원본의 형태를 대충은 알아볼 수 있는 수준의 결과가 나오고
그런 손실을 감수할만큼의 용량적인 메리트를 볼 수 있을 경우 선택하는 방식인데
아래와 같이 8x8의 그림이 있을 경우
오른쪽에 있는 두 가지의 예제처럼 하나의 픽셀덩어리를 밀어버리는 방식이다.
abcdefghi abcdefghi aaaaaaaa
sdaddqwdf abcdefghi ssssssss
fvncsijds abcdefghi ffffffff
asdqweeaa abcdefghi aaaaaaaa
abcdefghi abcdefghi aaaaaaaa
sdaddqwdf abcdefghi ssssssss
fvncsijds abcdefghi ffffffff
asdqweeaa abcdefghi aaaaaaaa
사진 등의 고정된 시점의 경우 손실, 무손실 정도의 압축을 사용하지만
동영상의 경우에는 시간도 이용할 수 있는데
같은 장소에서 촬영하거나 움직임이 적은 촬영 등에서는
이전과 일정 정도 이상 변하지 않은 픽셀들은 업데이트를 하지 않는 방식으로 진행한다.
이를 통해 움직임이 있는 작은 부분만 기록하면 되기 때문에
변화가 적은 영상일수록 훨씬 더 압축률이 높다.
(예를 들어 책 한 페이지를 10분간 찍은 영상이면 한장의 용량보다 조금 더 클 수 있지 않을까?)
(1).백준 11724 연결 요소의 개수는 전형적인 그래프 관련 문제로
각각의 정점에서 이어지는 노드들을 기록한 다음
연결된 요소들의 그룹이 몇개인지를 출력하는 문제였다.
먼저 연결된 선들을 기록한 다음
각각의 정점을 지나친 적이 있는지 확인하고
지나친 적이 없을 경우 해당 노드를 방문하며
해당 노드에서 뻗어나가는 route들이 있는지를 확인한 다음
해당 route들이 비방문 상태일 경우 stack에 추가하는 방식으로
한번의 count++의 방문으로 연결된 모든 정점을 탐색했다.
for문을 통해 비방문한 연결리스트가 나타날 경우 count++ 처리를 했으며
최종적으로 count의 값을 출력했다.
const input = `6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3`.split('\n')
const [vertexNum, nodeNum] = input[0].split(' ').map(Number)
const nodes = {}
const routeCheck = new Array(vertexNum+1).fill(1)
let count = 0
const nodeClear = (num) => {
if(nodes[num]){
const stack = [...nodes[num]]
while(stack.length){
const indexNow = stack.pop()
routeCheck[indexNow] = 0
for(let i = 0 ; i < nodes[indexNow].length ; i++){
const nowCheck = nodes[indexNow][i]
if(routeCheck[nowCheck]){
routeCheck[nowCheck] = 0
stack.push(nowCheck)
}
}
}
}
}
for(let i = 1 ; i < input.length ; i++){
const [start, end] = input[i].split(' ').map(Number)
if(nodes[start]){
nodes[start].push(end)
}
else{
nodes[start] = [end]
}
if(nodes[end]){
nodes[end].push(start)
}
else{
nodes[end] = [start]
}
}
for(let i = 1 ; i <= vertexNum ; i++){
if(routeCheck[i]){
console.log(routeCheck, nodes)
routeCheck[i] = 0
nodeClear(i)
count++
}
}
console.log(count)'회고' 카테고리의 다른 글
| [취업준비일지] - 134 (0) | 2023.03.03 |
|---|---|
| [취업준비일지] - 133 (0) | 2023.03.02 |
| [취업준비일지] - 131 (0) | 2023.02.28 |
| [취업준비일지] - 130 (0) | 2023.02.27 |
| [취업준비일지] - 129 (0) | 2023.02.26 |
