no image
[C++] 백준 9단계 - 5086번 문제 (배수와 약수)
문제설명 소스코드 #include using namespace std; int main() { int a, b; while (true) { cin >> a >> b; if ((a == 0) && (b == 0)) break; if (b % a == 0)cout
2023.05.10
no image
[컴퓨터 구조] RAM의 특징과 종류
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. RAM의 특징 RAM에는 실행할 프로그램의 명령어와 데이터가 저장됨 비휘발성 저장장치이기 때문에 전원이 차단되면 저장된 내용이 모두 사라진다. CPU는 SRAM(캐시 메모리)을 먼저 참조하고 원하는 데이터가 없으면 DRAM(주기억장치)을 참조한다. CPU는 보조기억장치에 직접 접근하지 못하기에 DRAM(주기억장치)에 실행할 프로그램이나 데이터를 적재한다. 그중에서 자주 사용하는 프로그램이나 데이터를 SRAM(캐시 메모리)에 적재한다. RAM의 용량과 성능 RAM 용량이 작다면 CPU가 실행하고 싶은 프로그램이나 데이터를 보조기억장치에서 RAM에 적재하는 작업이 잦아질 것..
2023.05.10
no image
[C++] 백준 8단계 - 10757번 문제 (큰 수 A+B)
문제설명 소스코드 #include using namespace std; int main() { string inputA, inputB; string tmp = ""; string result = ""; short A, B, digit; bool carry = false; cin >> inputA >> inputB; if (inputA.length() = 0; --i) { A = inputA[i] ..
2023.05.09
no image
[C++] 백준 10단계 - 27323번 문제 (직사각형)
문제설명 소스코드 #include using namespace std; int main() { int A; int B; cin >> A >> B; cout
2023.05.09
no image
[C++] 백준 8단계 - 2869번 문제 (달팽이는 올라가고 싶다)
문제설명 소스코드 #include using namespace std; int main() { int A; int B; int V; cin >> A >> B >> V; int count = (V - A) / (A - B); if ((V - A) % (A - B) == 0) count += 1; else count += 2; cout
2023.05.08
no image
[C++] 백준 8단계 - 2292번 문제 (벌집)
문제설명 소스코드 #include using namespace std; int main() { int N; int idx = 1; cin >> N; --N; while (N > 0) { N -= (idx * 6); ++idx; } cout 2 -> 8 -> 20 -> 38 -> 62 ... 즉 첫번째 항을 제외하고, 6의 배수로 증가하는 수열이다. 따라서 N을 맨 처음에 1빼주고 계속 6의 배수만큼 빼주고 idx를 1증가 시킨다. N이 0 또는 음수가 되면 루프를 탈출한다. idx를 출력한다.
2023.04.25
no image
[C++] 백준 11718번 문제 (그대로 출력하기)
문제설명 소스코드 #include #include using namespace std; int main() { string input; while (true) { getline(cin, input); if (input == "") return 0; cout
2023.04.25
no image
[C++] 백준 8단계 - 2903번 문제 (중앙 이동 알고리즘)
문제설명 소스코드 #include #include using namespace std; int main() { int N; int arr[16] = { 0 }; arr[0] = 0; int dot = 0; cin >> N; for (int i = 1; i 5² -> 9²...로 증가하는 수열이다. 밑인 2, 3, 5, 9...의 수열(a')의 규칙은 아래와 같다. 따라서 밑수를 제곱한 값이 정답이 된다.
2023.04.24

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
	int a, b;
	while (true)
	{
		cin >> a >> b;
		if ((a == 0) && (b == 0)) break;
		if (b % a == 0)cout << "factor" << endl;
		else if (a % b == 0) cout << "multiple" << endl;
		else cout << "neither" << endl;
	}
}

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


RAM의 특징

  • RAM에는 실행할 프로그램의 명령어와 데이터가 저장됨
  • 비휘발성 저장장치이기 때문에 전원이 차단되면 저장된 내용이 모두 사라진다.
  • CPU는 SRAM(캐시 메모리)을 먼저 참조하고 원하는 데이터가 없으면 DRAM(주기억장치)을 참조한다.

CPU는 보조기억장치에 직접 접근하지 못하기에 DRAM(주기억장치)에 실행할 프로그램이나 데이터를 적재한다.

그중에서 자주 사용하는 프로그램이나 데이터를 SRAM(캐시 메모리)에 적재한다.

 

RAM의 용량과 성능

  • RAM 용량이 작다면 CPU가 실행하고 싶은 프로그램이나 데이터를 보조기억장치에서 RAM에 적재하는 작업이 잦아질 것이다. 이는 성능 저하로 연결된다.(병목현상)
  • RAM 용량이 크다면 실행하고 싶은 프로그램이나 데이터를 보조기억장치에서 RAM에 적재하는 작업이 줄어들기 때문에 어느 정도 성능향상이 될 것이다.
  • RAM이 크다고해서 RAM용량에 비례해서 성능 향상이 되는 것은 아니다.

 

RAM의 종류

DRAM(Dynamic RAM)

  • 저장된 데이터가 동적으로 변하는(사라지는) RAM
  • 시간이 지나면 저장된 데이터가 점차 사라진다.
  • 데이터의 소멸을 막기 위해 일정 주기로 데이터를 재활성화(다시 저장)해야 한다.
  • 소비 전력이 낮고, 저렴하고, 집적도가 높기 때문에 대용량으로 설계하기 용이하기 때문에 일반적으로 주기억장치에 쓰인다.
집적도
"집적도가 높다"는 말은 "더 작고 빽빽하게 만들 수 있다"는 뜻이다.

 

 

SRAM(Static RAM)

  • 저장된 데이터가 정적인(사라지지 않는) RAM
  • 전원이 차단되지 않는다면 저장된 데이터가 사라지지 않는다.
  • 일반적으로 SRAM이 DRAM보다 빠르다.
  • 소비 전력이 높고, 비싸고, 집적도가 낮기 때문에 대용량으로 만들어질 필요는 없지만 속도가 빨라야 하는 저장장치에 사용된다.
  • 보통 캐시 메모리에 사용된다.

 

 

SDRAM(Synchronous Dynamic RAM)

  • SRAM과 관계가 없는 클럭 신호와 동기화된, 발전된 형태의 DRAM이다.
  • 클럭 타이밍에 맞춰 동작하며 클럭마다 CPU와 정보를 주고받을 수 있다.

 

DDR SDRAM(Double Data Rate SDRAM)

  • 대역폭을 넓혀 속도를 빠르게 만든 SDRAM이다.
  • SDRAM에 비해 대역폭이 두 배가량 증가하였다. 즉, 한 클럭당 두 배의 데이터를 주고받을 수 있다.
  • 이러한 이유 때문에 단순 SDRAM을 SDR SDRAM(Single Data Rate SDRAM)이라고 부른다.

  • DDR2 SDRAM은 DDR SDRAM보다 대역폭이 두 배 넓은 SDRAM이다. 즉, SDR SDRAM보다 대역폭이 4배 넓다.
  • DDR3 SDRAM은 DDR2 SDRAM보다 대역폭이 두 배 넓은 SDRAM이다. 즉, SDR SDRAM보다 대역폭이 8배 넓다.
  • DDR4 SDRAM은 DDR3 SDRAM보다 대역폭이 두 배 넓은 SDRAM이다. 즉, SDR SDRAM보다 대역폭이 16배 넓다.

 

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	string inputA, inputB;
	string tmp = ""; string result = "";
	short A, B, digit; bool carry = false;
	cin >> inputA >> inputB;
	if (inputA.length() < inputB.length()) swap(inputA, inputB);
	for (int i = 0; i < (inputA.length() - inputB.length()); ++i) tmp += "0";
	inputB = tmp + inputB;
	for (int i = inputA.length() - 1; i >= 0; --i)
	{
		A = inputA[i] - '0'; B = inputB[i] - '0';
		digit = A + B;
		if (carry == true) { digit += 1; carry = false; }
		if (digit > 9) carry = true;
		result += digit % 10 + '0';
	}
	if (carry == true) result += "1";
	for (int i = 0; i < result.length(); ++i)
	{
		cout << result[result.length() - 1 - i];
	}
}

 

풀이

  • C계열 언어에선 브론즈5 문제가 절대 아님.
  • inputA와 inputB의 길이중 inputB의 길이가 더 크다면 둘의 내용을 바꾼다(swap)
  • inputA와 inputB의 길이 차이만큼 tmp에 "0"을 추가한다. (자리수 맞추기 ex) 1234와 0001)
  • inputB = tmp + inputB (자리수 맞추기 ex) 1234와 0001)
  • inputA와 inputB의 1의 자리수를 A와 B로 설정(- '0'을 함으로 to_string함수를 안써도 된다.)
  • 올림수가 있으면 digit을 1올린다.
  • digit이 9 초과이면 올림수가 있음을 표시한다.
  • result에 digit의 1의자리만 추가한다. (+ '0'을 함으로 to_string함수를 안써도 된다.)
  • for문 밖에서 올림수가 있는지 검사한다. 올림수가 있으면 "1"을 추가한다.(30+70 = "00" + "1")
  • result를 뒤집어서 출력한다.

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
    int A; int B;
    cin >> A >> B;
    cout << A * B;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
	int A; int B; int V;
	cin >> A >> B >> V;
	int count = (V - A) / (A - B);
	if ((V - A) % (A - B) == 0) count += 1;
	else count += 2;
	cout << count;
}

 

풀이

  • 반복문으로 풀면 무조건 시간초과가 발생한다.
  • 정상에 일단 오르면 미끄러지지않으므로 최종적으로 가야하는 목표는 V가 아닌 V-A까지만 가면 다음날 A만큼 올라서 정상에 갈 수 있다.
  • V-A를 가는데 걸리는 기간은 (V-A) / (A-B)이다. 즉 count = (V-A) / (A-B)
  • (V-A) % (A-B) == 0일 경우 : count에 +1만큼 더해준다.(+1을 하는 이유는 V-A까지만 갔기 때문이다.)
  • (V-A) % (A-B) != 0일 경우  : count에 +2만큼 더해준다.((V-A) % (A-B)가 0이 아니므로 정상에 도달하기에 하루가 더 필요함) 

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
	int N; int idx = 1;
	cin >> N;
	--N;
	while (N > 0)
	{
		N -= (idx * 6);
		++idx;
	}
	cout << idx;
}

 

풀이

  • 정육각형의 각 변에 정육각형이 계속 붙는 벌집구조이다.

  • 첫 정육각형에서 다음으로 큰 정육각형 그 다음으로 큰 정육각형....의 시작 순서는 아래와 같다.
  • 1 -> 2 -> 8 -> 20 -> 38 -> 62 ...
  • 즉 첫번째 항을 제외하고, 6의 배수로 증가하는 수열이다.
  • 따라서 N을 맨 처음에 1빼주고 계속 6의 배수만큼 빼주고 idx를 1증가 시킨다.
  • N이 0 또는 음수가 되면 루프를 탈출한다.
  • idx를 출력한다.

문제설명

 

소스코드

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string input;
	while (true)
	{
		getline(cin, input);
		if (input == "") return 0;
		cout << input << endl;
	}
}

문제설명

 

소스코드

#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	int N; int arr[16] = { 0 };
	arr[0] = 0; int dot = 0;
	cin >> N;
	for (int i = 1; i <= N; ++i)
	{
		arr[i] = arr[i - 1] + pow(2, i-1);
		dot = arr[i] + 2;
	}
	cout << dot * dot;
}

 

풀이

  • 위 문제는 2² -> 3² -> 5² -> 9²...로 증가하는 수열이다.
  • 밑인 2, 3, 5, 9...의 수열(a')의 규칙은 아래와 같다.

  • 따라서 밑수를 제곱한 값이 정답이 된다.