no image
[C++] 백준 8단계 - 11005번 문제 (진법 변환 2)
문제설명 소스코드 #include using namespace std; int main() { long long N; int B; int digits = 0; char arr[20]; string dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; cin >> N >> B; while (N != 0) { arr[digits++] = dchar[N % B]; N /= B; } for (int i = digits - 1; i >= 0; i--) cout
2023.04.23
no image
[C++] 백준 8단계 - 2745번 문제 (진법 변환)
문제설명 소스코드 #include #include #include using namespace std; int main() { string N; int B; int result = 0; string dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; cin >> N >> B; for (int i = 0; i < N.length(); ++i) { int d = dchar.find(N[i]); result += d * pow(B, N.length() - 1 - i); } cout
2023.04.22
no image
[C++] 백준 - 4470번 문제 (줄 번호)
문제설명 소스코드 #include #include using namespace std; int main() { int N; string input; cin >> N; cin.ignore(); for (int i = 0; i < N; ++i) { getline(cin, input); cin.clear(); cout
2023.04.21
no image
[C++] 백준 7단계 - 2563번 문제 (색종이)
문제설명 소스코드 #include using namespace std; int main() { int whitepaper[100][100] = { 0 }; int N; int row; int col; int total = 0; cin >> N; for (int i = 0; i > row >> col; for (int j = row; j col; for (int j = ro..
2023.04.20
no image
[C++] 백준 7단계 - 10798번 문제 (세로읽기)
문제설명 소스코드 #include #include using namespace std; int main() { string arr[5]; for(int i = 0; i > arr[i]; for (int i = 0; i i) cout
2023.04.18
no image
[C++] 백준 7단계 - 2566번 문제 (최댓값)
문제설명 소스코드 #include using namespace std; int main() { int arr[9][9]; int input; int max = -1; int x; int y; for (int i = 0; i > input; arr[i][j] = input; if (arr[i][j] > max) { max = arr[i][j]; x = i; y = j; } } } cout
2023.04.18
no image
[C++] 백준 7단계 - 2738번 문제 (행렬 덧셈)
문제설명 소스코드 #include using namespace std; int main() { int N; int M; cin >> N >> M; int** arr = new int* [N]; //2차원 배열 동적할당을 위한 더블 포인터 선언 for (int i = 0; i > arr[i][j]; //첫 ..
2023.04.17
no image
[C++] 백준 6단계 - 25206번 문제 (너의 평점은)
문제설명 소스코드 #include using namespace std; int main() { string majorName; double avg = 0; float sumGrade = 0; double score[20]; float grade[20]; string input; for (int i = 0; i > majorName >> grade[i] >> input; if (input == "A+") score[i] = 4.5; else if (input == "A0") score[i] = 4.0; else if (input == "B+") score[i] = 3.5; else if (input == "B0") score[i] = 3.0; else if (input ==..
2023.04.17

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() 
{
	long long N; int B; int digits = 0;
	char arr[20];
	string dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	cin >> N >> B;
	while (N != 0)
	{
		arr[digits++] = dchar[N % B];
		N /= B;
	}
	for (int i = digits - 1; i >= 0; i--) cout <<arr[i];
}

 

풀이

  • 위와 같은 결과로 이루어진 배열을 역순으로 출력하면 진수변환이 되는 것이다.

 

자바로 구현

2023.01.23 - [자료구조 & 알고리즘] - [JAVA] n진수 변환 알고리즘

 

[JAVA] n진수 변환 알고리즘

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 10진수를 n진수로 변환하는 방법을 모른다면 아래의 포스팅에서[10진수-n진수 변환] 부분을 읽고 오시는 것을

rebugs.tistory.com

 

문제설명

 

소스코드

#include <iostream>
#include <math.h>
#include <string>
using namespace std;
int main() 
{
	string N; int B; int result = 0;
	string dchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	cin >> N >> B;
	for (int i = 0; i < N.length(); ++i)
	{
		int d = dchar.find(N[i]);
		result += d * pow(B, N.length() - 1 - i);
	}
	cout << result;
}

 

설명

  • 1010(2진법)을 10(10진법)으로 변환하는 방법은 위와 같다.
  • 따라서 B진법수 N을 10진법으로 변환하는 방법도 위와 유사하다.
  • N의 i번째 자리에 있는 문자를 dchar에서 찾은 뒤 해당 인덱스를 d에 저장한다.
  • d * B^(N 문자열의 길이 -1 -i)의 값을 result에 더한다.
  • result를 출력한다.
pow(a,b)(a와 b는 int) : a를 b제곱한 값을 리턴
str.find ("문자열") : str에서 "문자열" 이 있는 인덱스를 리턴 

 

비슷한 알고리즘(진법변환)

2023.01.23 - [자료구조 & 알고리즘] - [JAVA] n진수 변환 알고리즘

 

[JAVA] n진수 변환 알고리즘

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 10진수를 n진수로 변환하는 방법을 모른다면 아래의 포스팅에서[10진수-n진수 변환] 부분을 읽고 오시는 것을

rebugs.tistory.com

 

문제설명

소스코드

#include <iostream>
#include <string>
using namespace std;
int main() 
{
	int N; string input;
	cin >> N;
	cin.ignore();
	for (int i = 0; i < N; ++i)
	{
		getline(cin, input);
		cin.clear();
		cout << i + 1 << ". " << input << endl;
	}
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() 
{
    int whitepaper[100][100] = { 0 };
    int N; int row; int col; int total = 0;
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        cin >> row >> col;
        for (int j = row; j < row + 10; ++j) for (int k = col; k < col + 10; ++k) whitepaper[j][k] = 1;
    }
    for (int i = 0; i < 100; ++i) for (int j = 0; j < 100; ++j) total += whitepaper[i][j];
    cout << total << endl;
}

 

풀이

  • 100X100 2차원 배열을 선언하고 0으로 초기화한다.
  • 사용자로부터 행과 열을 입력받은 수를 각각 row와 col이라고 하면 row + 10, col + 10인 부분은 모두 1로 바꿔준다.
  • 1의 수를 모두 더하면 정답이다.
  • 아래의 코드는 위 과정을 시각적으로 나타낸다.
#include <iostream>
using namespace std;
void print(int arr[100][100])
{
    for (int i = 0; i < 100; ++i)
    {
        for (int j = 0; j < 100; ++j) cout << arr[i][j] << " ";
        cout << endl;
    }
}
int main() 
{
    int whitepaper[100][100] = { 0 };
    int N; int row; int col; int total = 0;
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        cin >> row >> col;
        for (int j = row; j < row + 10; ++j) for (int k = col; k < col + 10; ++k) whitepaper[j][k] = 1;
    }
    for (int i = 0; i < 100; ++i) for (int j = 0; j < 100; ++j) total += whitepaper[i][j];
    cout << total << endl;
    print(whitepaper);
}

문제설명

 

소스코드

#include <iostream>
#include <string>
using namespace std;
int main() {
    string arr[5];
    for(int i = 0; i < 5; ++i) cin >> arr[i];
    for (int i = 0; i < 15; ++i)
    {
        for (int j = 0; j < 5; ++j) if (arr[j].length() > i) cout << arr[j][i];
    }
}

 

설명

  • string형 배열 5개를 선언한다.
  • 5개의 문자열을 입력 받는다.
  • 행의 개수는 5개 이지만 열의 개수는 최대 15개인 행렬이 완성된다.
  • 행과 열을 바꿔서 출력하되, arr[j]의 길이 범위 안에서 출력한다.

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int arr[9][9];
	int input; int max = -1; int x; int y;
	for (int i = 0; i < 9; ++i)
	{
		for (int j = 0; j < 9; ++j)
		{
			cin >> input;
			arr[i][j] = input;
			if (arr[i][j] > max)
			{
				max = arr[i][j];
				x = i; y = j;
			}
		}
	}
	cout << max << endl;
	cout << x + 1 << " " << y + 1;
}

 

풀이

  • 2차원 배열(9x9행렬)을 생성한다.
  • 배열의 값을 입력받으면서 배열의 값이 초기에 -1로 설정된 max보다 크면 max에는 배열의 값이 들어간다.
  • max보다 배열의 값이 크면 for문의 지역변수인 i와 j를 x와 y에 대입한다.
  • max를 출력하고 x+1, y+1값을 출력한다.(배열은 idx가 0부터 시작하기 때문)

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int M;
	cin >> N >> M;
	int** arr = new int* [N]; //2차원 배열 동적할당을 위한 더블 포인터 선언
	for (int i = 0; i < N; i++) arr[i] = new int[M]; //배열이 배열을 가리킴
	int** arr2 = new int* [N]; //2차원 배열 동적할당을 위한 더블 포인터 선언
	for (int i = 0; i < N; i++) arr2[i] = new int[M]; //배열이 배열을 가리킴
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j) cin >> arr[i][j]; //첫 번째 배열 입력받음
	}
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j) cin >> arr2[i][j]; //두 번째 배열 입력받음
	}
	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)cout << arr[i][j] + arr2[i][j] << " ";
		cout << endl;
	}
}

 

풀이

int** arr = new int* [N]; //N개짜리 동적할당 배열을 가리키는 더블포인터
	for (int i = 0; i < N; i++) arr[i] = new int[M]; //각각 배열은 M개짜리 동적할당 배열을 가리킴
  • 위 코드를 N = 3, M = 3이라고 한다면 메모리는 아래와 같다.

  • 사용자로부터 N과 M을 입력받고 N x M행렬을 두 개 입력받는다.
  • 각각 행과 열을 덧셈한 후 출력한다.

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	string majorName; double avg = 0; float sumGrade = 0;
	double score[20]; float grade[20];
	string input;
	for (int i = 0; i < 20; ++i)
	{
		cin >> majorName >> grade[i] >> input;
		if (input == "A+") score[i] = 4.5;
		else if (input == "A0") score[i] = 4.0;
		else if (input == "B+") score[i] = 3.5;
		else if (input == "B0") score[i] = 3.0;
		else if (input == "C+") score[i] = 2.5;
		else if (input == "C0") score[i] = 2.0;
		else if (input == "D+") score[i] = 1.5;
		else if (input == "D0") score[i] = 1.0;
		else if (input == "F") score[i] = 0.0;
		else if (input == "P") { score[i] = 0.0; grade[i] = 0; }
		avg += (score[i] * grade[i]);
		sumGrade += grade[i];
	}
	avg = avg / sumGrade;
	cout << fixed;
	cout.precision(6);
	cout << avg;
}

 

풀이

  • 전공평점은 전공과목별 (학점 × 과목평점)의 합을 학점의 총합으로 나눈 값이다.
  • 전공 이름은 입력만 받고 따로 처리하지는 않는다.(필요없는 변수이다.)
  • 전공이름, 학점, 과목평점을 입력받는다.
  • 과목평점을 string형 변수 input에 받는다.
  • input은 과목평점이므로 각 맞는 숫자로 변환시켜 배열에 저장한다.
  • avg에 과목평점과 학점을 곱한 값을 모두 더한다.
  • sumGrade에 모든 학점을 더한다.
  • avg에 avg / sumGrade의 값을 대입한다.
  • 소숫점 아래 6자리까지 출력한다.