[C++] 백준 10798,9093,11655,2740

8143 단어 C브론즈백준C

10798번 세로읽기

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오. 총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’ 중 하나이다. 각 줄의 시작과 마지막에 빈칸은 없다.

문자열 배열로 입력을 한줄 씩 받고 getline(cin, word[i]) 해당 단어 길이를 벗어나지 않으면 세로 방향으로 읽는다.

#include<iostream>
#include<string>

using namespace std;

int main() {

	string word[5];
	
	for (int i = 0; i < 5; i++) {
		getline(cin, word[i]);
	}

	for (int i = 0; i < 15; i++) {

		for (int j = 0; j < 5; j++) {

			if(i<word[j].length())
				cout << word[j].at(i);
		}
	}

}

9093번 단어 뒤집기

문장이 주어졌을 때, 단어를 모두 뒤집어서 출력하는 프로그램을 작성하시오. 단, 단어의 순서는 바꿀 수 없다. 단어는 영어 알파벳으로만 이루어져 있다. 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 문장이 하나 주어진다. 단어의 길이는 최대 20, 문장의 길이는 최대 1000이다. 단어와 단어 사이에는 공백이 하나 있다.

이 문제를 통해서 문자열 자르기 split 방식과
사용자 입력을 받는 cin, getline의 차이점에 대해서 알게되었다.
C++은 split함수가 따로 없기 때문에 내가 만드는 방법을 숙지하고 있는 것이 좋다.

stringstream
문자열에서 작동하는 스트림 클래스.
이 클래스 객체는 일련의 문자를 포함하는 문자열 버퍼를 사용하고 있습니다. 문자열에서 내가 원하는 자료형의 데이터를 추출할 때 사용합니다.
sstream 헤더파일을 포함해야함

getline(stringstream, string, delimeter)
stringstream에서 구분자 문자가 나올 때까지 읽는다. delimeter은 char자료형으로 공백단위로 읽고 싶다면 ' '을 인수로 주면된다.

getline(cin, string)
줄단위로 입력을 받아 string 변수에 저장한다. 개행문자\n까지 읽는다. 그리고 처음 나오는 \n 역시 읽으므로 입력버퍼에 \n가 남아있는 경우 뒤에 남아있는 문자열을 읽지않는 의도치않은 상황이 발생할 수 있어서 cin>> 으로 입력받은 후 getline으로 \n을 지워줘야한다.

cin
공백단위로 입력을 받고 개행문자\n 전까지만 읽는다. 그리고 다시 cin으로 입력을 받을시 입력버퍼에 남아있는 \n를 무시한다.

#include<iostream>
#include<string>
#include<vector>
#include<sstream> 
#include<algorithm>

using namespace std;

vector<string> split(string str, char delimiter);

int main() {

	int n;
	cin >> n;
	vector<vector<string>> vec(n);
	string input;
	
	getline(cin, input);
	//cin로 한번 읽고 난 다음 getline로 읽으면 4를 읽고 \n이 남아있는 상태라서 getline을 한번 더 수행해 줘야 된다. 
	//그 다음부터 getline을 실행해야 원하는 대로 값을 넣을 수 있다. 아니면 처음부터 getline으로 값을 읽어줘도 된다.

	for (int i = 0; i < n; i++) {
		getline(cin, input);
		vec[i] = split(input,' ');
	}

	for (vector<string> strArr: vec) {
		for (string str : strArr) {
			reverse(str.begin(), str.end());
			cout << str<<' ';
		}
		cout << endl;
	}
}

vector<string> split(string input, char delimiter) {
	vector<string> output;
	stringstream ss(input);
	string buffer;

	while (getline(ss, buffer, delimiter)) {

		output.push_back(buffer);
	}

	return output;
}

11655번 ROT13

ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다. 예를 들어, "Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr"가 된다. 문자열이 주어졌을 때, "ROT13"으로 암호화한 다음 출력하는 프로그램을 작성하시오.

스멀스멀 암호화 방식 중 대칭키가 떠올랐는 문제 (오늘난 네트워크보안과블락체인을 드랍했다고 한다. 덕분에 다음학기때 1학점짜리 전공을 들으러 학교를 다녀야겠지만..아무렴어때 선택과 집중이 필요한 4학년이다.)

대충 아스키코드 검색해서 나오는 그림보고 문제를 풀었다.

#include<iostream>
#include<string>

using namespace std;

int main() {

	//아스키 코드 A~Z 65~90  a~z 97~122

	string input;
	getline(cin, input);

	for (int i = 0; i < input.length(); i++) {

		char c = input[i];
		if (65 <= c && c <= 90) {
			input[i] = 65 + ((c - 65 + 13) % 26);
		}
		else if (97 <= c && c <= 122) {
			input[i] = 97 + ((c - 97 + 13) % 26);
		}
	}
	cout << input;
}

2740번 행렬 곱셈

N x M크기의 행렬 A와 M x K크기의 행렬 B가 주어졌을 때, 두 행렬을 곱하는 프로그램을 작성하시오.

아니 행렬의 곱은 어째서 볼 때마다 방법이 헷갈리는지 모르겠다. 학교 수업들으면서 한두번 본게 아닐텐데 볼때마다 구글링한다.
출처: https://j1w2k3.tistory.com/575

이차원배열 두개를 만들어 입력을 받고
첫번째 입력받은 행렬(matrix1)은 가로로 이동을 하고 두번째 행렬(matrix2)은 세로로 이동을 하면서 방문한 원소를 곱한 뒤 합을 구한다. 총 합을 결과 행렬(result)의 matrix1의 행, matrix2의 열 위치에 집어넣는다.

#include<iostream>
#include<string>

using namespace std;

int main() {

	int n, m;
	cin >> n >> m;

	int matrix1[100][100];

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++)
			cin >> matrix1[i][j];
	}

	int k;
	cin >> m >> k;

	int matrix2[100][100];
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < k; j++) {
			cin >> matrix2[i][j];
		}
	}
	
	int result[100][100];

	for (int i = 0; i < n; i++) {

		for (int r = 0; r < k; r++) {

			int sum = 0;
			for (int j = 0; j < m; j++) {

				sum+=matrix1[i][j] * matrix2[j][r];
			}
			result[i][r] = sum;
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < k; j++)
			cout << result[i][j]<<' ';
		cout << endl;
	}

}

이렇게 일주일동안 브론즈 맛보기 후 실버 단계로 넘어갈 계획이었는데 중간에 벨로그 업로드도하고 학교 졸작관련 신경도 쓰고.. 이것저것 병행하다보니 시간이 더 흘러버렸다.

2학년 여름방학때 별생각없이 쳤었던 컴활1급 필기가 있다. 2년이 지나면 실기를 칠 수 있는 자격이 만료되는데 벌써 시간이 그렇게 흘러버렸다. 2학년 겨울방학때 실기쳤음 딱 맞았을 것 같은뎅,,왜 안했었을까 사실 정처기가 있으면 컴활은 크게 필요없다고 다들 말해서 그냥 날리는게 맞지않을까 싶어서 손을 놓았었다. 하지만 생각할수록 계륵 그 자체여서 일단은 4월 6일날 시험날짜를 잡아두긴했다. 아마도 그때까진 컴활준비를 바짝 할 예정이다.
아무래도 정처기 실기 접수 전까진 공부를 안 할 내자신이 눈에 보이기에,,

좋은 웹페이지 즐겨찾기