본문 바로가기

Algorithm Problems/구현

[백준/C++] 4447번: 좋은놈 나쁜놈

문제

https://www.acmicpc.net/problem/4447

 

4447번: 좋은놈 나쁜놈

비키니시티에는 초능력을 가진 수퍼 히어로들로 바글바글하다. 스폰지밥과 패트릭은 주어진 문자열로 좋은놈과 나쁜놈을 골라내려 한다. 스폰지밥: 우와, 문자열에서 강한 힘이 느껴지는데!

www.acmicpc.net


문제 요약

n개의 문자열을 입력 받는다.

 

문자열에 g, b가 몇 번 들어있는지 세고, 적절한 문자열을 출력한다.

 

1. g가 더 많을 경우, '문자열 is GOOD'을 출력한다.

2. b가 더 많을 경우, '문자열 is A BADDY'를 출력한다.

3. 같을 경우, '문자열 is NEUTRAL'을 출력한다.


코드

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

int n;

void printgb(string str) {
	int cnt_g = 0;
	int cnt_b = 0;

	for (int i = 0; i < str.size(); i++) {
		if (str[i] == 'G' || str[i] == 'g') {
			cnt_g++;
		}
		else if (str[i] == 'B' || str[i] == 'b') {
			cnt_b++;
		}
	}

	if (cnt_g > cnt_b) {
		cout << str << " is GOOD";
	}
	else if (cnt_g < cnt_b) {
		cout << str << " is A BADDY";
	}
	else {
		cout << str << " is NEUTRAL";
	}
	cout << "\n";
}

int main() {

	cin >> n;
	cin.ignore(); // 버퍼에 모든 내용 삭제

;	for (int i = 0; i < n; i++) {
		string str;
		
		getline(cin, str);

		printgb(str);
	}
}

코드 설명

1. 문자열 str을 n번 입력 받는다.

 

2. str을 구성하는 문자를 하나씩 접근하여 g 또는 b라면 개수를 센다.

 

3. g와 b의 개수에 따라 알맞은 문자열을 출력한다.

 


고찰

getline을 그저 공백을 포함한 문자열을 입력 받기 위해 사용하는 함수라고 알고 있었다.

 

그러나, 추가적으로 주의해야할 점이 있다.

 

cin을 사용해 값을 입력받을 때, 사용자가 엔터(개행 문자)를 입력하면 버퍼에 개행 문자가 남아있다.

 

1. cin으로 다시 값을 입력받는다면, 버퍼에서 개행 문자를 읽고 버린 다음, 입력을 받는다.

=> 에러 발생 X

 

2. getline으로 다시 값을 입력받는다면, 버퍼에 남아있는 개행 문자를 무시하지 않고 문자열로 인식한다.

 => 에러 발생 O

 

< 에러 예시 >

int n;
string str;
cin >> n;
getline(cin, str);

 

 

위 코드에서 n을 입력 받은 후, getline으로 문자열을 입력 받으려고 한다.

 

이 때, 버퍼에 '\n'이 그대로 남아 았어 str에 포함되는 오류가 발생한다.

 

< 수정 예시 >

int n;
string str;
cin >> n;
cin.ignore();
getline(cin, str);

 

따라서 cin.ignore(); 을 작성하여 버퍼의 모든 내용을 제거해주어야 한다.

'Algorithm Problems > 구현' 카테고리의 다른 글

[백준/C++] 1251번: 단어 나누기  (2) 2024.10.11
[백준/C++] 4072번: Words  (0) 2024.06.12
[백준/C++] 1718번: 암호  (1) 2024.04.06
[백준/C++] 8989번: 시계  (1) 2024.02.29
[백준/Python] 17300번: 패턴  (1) 2024.01.06