no image
[C++] 백준 5단계 - 10809번 문제
문제설명 소스코드 #include using namespace std; int main() { string input; string alphabet = "abcdefghijklmnopqrstuvwxyz"; cin >> input; for (int i = 0; i < alphabet.length(); ++i) { if (input.find(alphabet[i]) != string::npos) { cout
2023.04.03
no image
[C++] 백준 5단계 - 11720번 문제
문제설명 소스코드 #include #include //stoi()함수를 쓰기위해 using namespace std; int main() { string input; int N; int sum = 0; string tmp; cin >> N; cin >> input; for (int i = 0; i N; for (int i = 0; i > input; sum += input - 48; } cout
2023.04.03
no image
[C++] 백준 5단계 - 11654번 문제
문제설명 소스코드 #include using namespace std; int main() { char input; cin >> input; cout
2023.04.02
no image
[C++] 백준 5단계 - 9086번 문제
문제설명 소스코드 #include using namespace std; int main() { int N; string input; cin >> N; for (int i = 0; i > input; cout
2023.04.02
no image
[C++] 백준 5단계 - 2743번 문제
문제설명 소스코드 #include using namespace std; int main() { string input; cin >> input; cout
2023.04.02
no image
[C++] 백준 5단계 - 27866번 문제
문제설명 소스코드 #include using namespace std; int main() { string input; int n; cin >> input >> n; cout
2023.04.01
no image
[C++] 백준 4단계 - 1546번 문제
문제설명 소스코드 #include using namespace std; int main() { int N; int max = 0; double score = 0; cin >> N; double* arr = new double[N]; for (int i = 0; i > arr[i]; if (arr[i] > max) max = arr[i]; } for (int i = 0; i < N; ++i) { if (arr[i] == max) { score += 100; continue; } score += (arr[i] / max) * 100; } cout
2023.04.01
no image
[C++] 백준 4단계 - 10811번 문제 (바구니 뒤집기)
문제설명 소스코드 #include using namespace std; int main() { int N; int M; cin >> N >> M; int* arr = new int[N]; //동적 할당 int a; int b; for (int i = 0; i > a >> b; for (int j = 0; j > M; int* arr = new int[N]; int a; int b; for (int i = 0; i > a >> b; for (int j = 0; j
2023.03.31

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
    string input; string alphabet = "abcdefghijklmnopqrstuvwxyz";
    cin >> input;
    for (int i = 0; i < alphabet.length(); ++i)
    {
        if (input.find(alphabet[i]) != string::npos)
        {
            cout << input.find(alphabet[i]) << " ";
        }
        else cout << -1 << " ";
    }
}

 

풀이

string형의 find()함수를 활용하여 풀었다.

  • string 클래스의 멤버함수이며, find("찾고자 하는 문자 또는 문자열")로 사용한다.
  • 리턴값은 찾는 문자의 첫번째 인덱스값이다.
  • 찾는 문자가 없다면 npos를 리턴하는데 쓰레기값이다.

문제설명

소스코드

#include <iostream>
#include <string> //stoi()함수를 쓰기위해
using namespace std;
int main()
{
	string input; int N; int sum = 0; string tmp;
	cin >> N;
	cin >> input;
	for (int i = 0; i < N; ++i)
	{
		tmp = input[i]; //string형은 배열처럼 인덱싱할 수 있다.
		sum += stoi(tmp); //stoi()함수는 string자료형을 숫자로 바꿔준다.
	}
	cout << sum;
}

 

또는

#include <iostream>
using namespace std;
int main()
{
    int N; char input; int sum = 0;
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        cin >> input;
        sum += input - 48;
    }
    cout << sum << endl;
}

위 방식은 아스키코드에서 '0'부터 '9'까지 48 ~ 57로 대응되는 것을 이용한 것이다. 

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main()
{
	char input;
	cin >> input;
	cout << (int)input;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; string input;
	cin >> N;
	for (int i = 0; i < N; ++i)
	{
		cin >> input;
		cout << input[0] << input[input.length() - 1] << endl;
	}
}

 

풀이

C++에서는 string이라는 자료형을 제공한다.

string 자료형은 편리한 함수들을 많이 제공하는데, 그 중에서 하나가 바로 length()함수이다.

length()함수는 문자열의 길이를 리턴한다. 또한 string 자료형은 배열처럼 인덱싱을 할 수 있기 때문에 위 코드처럼 작성하면 된다.

문제설명

소스코드

#include <iostream>
using namespace std;
int main() {
	string input;
	cin >> input;
	cout << input.length() << endl;
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	string input; int n;
	cin >> input >> n;
	cout << input[n - 1]; //string형은 char형 배열처럼 사용할 수 있다.
}

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int max = 0; double score = 0;
	cin >> N;
	double* arr = new double[N];
	for (int i = 0; i < N; ++i)
	{
		cin >> arr[i];
		if (arr[i] > max) max = arr[i];
	}
	for (int i = 0; i < N; ++i)
	{
		if (arr[i] == max)
		{
			score += 100;
			continue;
		}
		score += (arr[i] / max) * 100;
	}
	cout << score / N;
}

 

풀이

세준이가 3과목 10점, 20점, 30점을 받았다면, ((10/30 X 100) + (20/30 X 100) + (30/30 X 100)) / 3 을 출력하면 된다.

효율이 떨어질지라도 나는 첫 번째 for문에서 값을 입력받고 최댓값을 구하고, 두 번째 for문에서 점수의 총합을 계산하였다.

문제설명

 

소스코드

#include <iostream>
using namespace std;
int main() {
	int N; int M;
	cin >> N >> M;
	int* arr = new int[N]; //동적 할당
	int a; int b;
	for (int i = 0; i < N; ++i) arr[i] = i + 1; //배열 초기화
	for (int i = 0; i < M; ++i)
	{
		cin >> a >> b;
		for (int j = 0; j <= (b - a) / 2; ++j)
		{
			int tmp = 0;
			tmp = arr[j + a - 1];
			arr[j + a - 1] = arr[b - j - 1];
			arr[b - j - 1] = tmp;
		}
	}
	for (int i = 0; i < N; ++i) cout << arr[i] << " ";
}

 

풀이

  • 1부터 N까지 수 중에서 i부터 j까지의 수를 역순으로 M번 정렬한다.

내가 작성한 소스코드는 기본적으로 swap 알고리즘을 기초로 만들어졌다.

swap알고리즘의 내용 이전에 내가 작성한 https://rebugs.tistory.com/143 에서 확인할 수 있다.

 

[JAVA] 배열 요소를 역순으로 정렬하는 알고리즘

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 배열의 요소가 1, 2, 3, 4, 5, 6, 7 이렇게 7개 있다고 하면 역순으로 정렬하면 7, 6, 5, 4, 3, 2, 1이다. 그림에서 보는

rebugs.tistory.com

위 포스팅의 응용버전이 이번 문제인 것 같다.

자세한 스왑 과정을 확인하려면 아래와 같은 코드로 과정을 지켜보면 된다.

#include <iostream>
using namespace std;
int main() {
	int N; int M;
	cin >> N >> M;
	int* arr = new int[N];
	int a; int b;
	for (int i = 0; i < N; ++i) arr[i] = i + 1;
	for (int i = 0; i < M; ++i)
	{
		cin >> a >> b;
		for (int j = 0; j <= (b - a) / 2; ++j)
		{
			int tmp = 0;
			tmp = arr[j + a - 1];
			cout << arr[j + a - 1] << "와 " << arr[b - j - 1] << "를 바꿉니다." << endl;
			arr[j + a - 1] = arr[b - j - 1];
			arr[b - j - 1] = tmp;
		}
		for (int i = 0; i < N; ++i) cout << arr[i] << " ";
		cout << endl;
	}
	for (int i = 0; i < N; ++i) cout << arr[i] << " ";
}