210105 | 백준 1152, 1157, 1546, 2577, 10818 | C++

박나연·2021년 1월 5일
0

하루백준

목록 보기
2/20
post-custom-banner

1152

1152번 : 단어의 개수

첫번째 시도

string 타입을 사용하여 getline 함수를 통해 공백을 포함한 문장을 받았다
그런데 틀렸습니다 라는 답을 받게되었다!
실행은 예제와 같게 잘 되는데 왜일까..!!

#include <iostream>
#include <string>
using namespace std;

int main() {
	string sentence;
	getline(cin, sentence);

	int count = 0;
	for (int i = 0; i < sentence.size(); i++) {
		if (sentence[i] == ' ' && i != sentence.size() - 1) {
			if (i != 0)
				count++;
		}
		if (i == sentence.size() - 1)
			count++;
	}
	cout << count;
}

두번째 시도

그래서 char타입으로 문장을 받아보기로 했다. cin.getline을 사용하여 최대 1000000길이의 문자를 받았다. 그런데도 틀렸다는 결과가 나왔다. 마찬가지로 실행은 모두 정상적으로 되었다.

#include <iostream>
#include <cstring>
using namespace std;

int main() {
	char sentence[1000000];
	cin.getline(sentence, 1000000);

	int count = 0;
	for (int i = 0; i < strlen(sentence); i++) {
		if (sentence[i] == ' ' && i != strlen(sentence) - 1) {
			if (i != 0)
				count++;
		}
		if (i == strlen(sentence) - 1)
			count++;
	}
	cout << count;
}

최종

그래서 예외처리를 해주는 부분에 문제가 있구나 하고 깨달았다.
기존에는 문자열의 제일 첫번째 부분은 무조건 제외를 하고 count 를 진행하였고, 문자열의 가장 마지막 부분이 나오면 무조건 한 단어가 끝났다고 판단하여 count +1 를 해주었다.

우선, 문장이 빈상태로 입력되면 0을 리턴하도록 하는 것을 추가하였고 문자열 자리수가 0일때부터 끝까지 공백을 고려하여 1부터 count를 해준다. 여기서 만약 가장 처음 혹은 끝이 공백이라면 count 를 -1해주는 방식이다.

앞방식과의 차이점과 발견하지 못한 오류를 곰곰히 생각해보았는데...
발견하지 못하였다. 어느부분에서 백준이 오답이라고 판단한지 모르겠다 ㅜㅜ

#include <iostream>
#include <string>
using namespace std;

int main() {
	string sentence;
	getline(cin, sentence);

	if (sentence.empty()) {
		cout << "0";
		return 0;
	}

	int count = 1;
	for (int i = 0; i < sentence.length(); i++) {
		if (sentence[i] == ' ')
			count++;
	}
	if (sentence[0] == ' ')
		count--;
	if (sentence[sentence.length() - 1] == ' ')
		count--;

	cout << count;
}

1157

1157번 : 단어 공부

#include <iostream>
#include <string>
using namespace std;

int main() {
	string word;
	cin >> word;

	int count[100] = { 0, };

	for (int i = 0; i < word.length(); i++) {
		if (word[i] >= 97 && word[i] <= 122) {
			word[i] -= 32;
		}
		count[word[i]]++;
	}

	int max = 0;
	char result = '?';
	for (int j = 65; j <= 90; j++) {
		if (max < count[j]) {
			max = count[j];
			result = j;
		}
		else if (max == count[j])
			result = '?';
	}

	cout << result;
}

아스키 코드를 활용하여 소문자를 대문자로 변환한 후 각 문자의 아스키코드 인덱스에 따른 갯수를 저장하는 배열을 count[100] 에 저장하였다.
그 후 각 인덱스를 비교하여 max값을 포함한 인덱스를 찾아내고, 그 인덱스가 아스키코드를 의미하므로 그 인덱스를 출력하도록 한다.
max 와 해당 인덱스 갯수가 같다면 ?로 변수를 저장한다.

1546

1546번 : 평균

#include <iostream>
#include <string>
using namespace std;

int main() {
	int size;
	cin >> size;
	double score[1000];
	int max = 0;
	for (int i = 0; i < size; i++) {
		cin >> score[i];
		if (score[i] > max)
			max = score[i];
	}

	double sum = 0;
	for (int i = 0; i < size; i++) {
		score[i] = score[i] / max * 100;
		sum += score[i];
	}

	cout << fixed;
	cout.precision(2);
	cout << sum / (double)size;
}

2577

2577번 : 숫자의 개수

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
	int a, b, c;
	cin >> a >> b >> c;

	int r;
	r = a * b * c;
	string result = to_string(r);

	vector<string> vec(result.size());
	for (int i = 0; i < vec.size(); i++) {
		vec[i] = result[i];
	}

	int size = 0, count;
	while (size < 10) {
		count = 0;
		for (int i = 0; i < vec.size(); i++) {
			if (vec[i] == to_string(size))
				count++;
		}
		cout << count << endl;
		size++;
	}
}

to_string int를 string으로 바꿔주는 함수

10818

10818번 : 최소, 최대

#include <iostream>
#include <vector>
using namespace std;

int main() {
	int num;
	cin >> num;

	vector<int> vec(num);
	int min = 1000000, max = -1000000;
	for (int i = 0; i < num; i++) {
		cin >> vec[i];
		if (vec[i] < min)
			min = vec[i];
		if (vec[i] > max)
			max = vec[i];
	}

	cout << min << " " << max;
}
profile
Data Science / Computer Vision
post-custom-banner

0개의 댓글