반응형

문제링크

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

 

소스코드 (C++)

#include<iostream>
#include<string>

using namespace std;
int main(void) {
	int result = 0;
	string str;

	getline(cin, str);

	// 문자의 갯수를 세기, 조건1: 현재 문자고, 뒤가 공백인 경우
	int len = str.length();
	for (int i = 0; i < len - 1; i++) {
		if (str.at(i) != ' ' && str.at(i + 1) == ' ') {
			result++;
		}
	}
	// 마지막이 문자인 경우 ++ (무조건 ++임. 왜냐면, 그 앞이 문자가 있어도 더해야하고, 없어도 더해야하기 떄문)
	if (str.at(len - 1) != ' ') {
		result++;
	}
	
	cout << result;
	return 0;
}

 

 

설명

- 어떻게 풀건지 전략을 짜는게 중요.

- 어떻게 단어를 구분지을까?

  -> 현재 위치가 문자이고, 뒤가 공백인 경우 현재 위치의 문자는 단어에 속한 단어이다. 그러기에 단어 카운트 증가.

  -> 마지막 번지가 문자라면 당연히 그것은 단어이기에, 단어 카운트 증가.

 

- 새로알게된것: 공백 포함에서 입력받고 싶으면 getline(cin, <string 변수>)로 입력받으면 된다.

 

 

 

다른 풀이법

그냥 공백의 갯수를 세서 풀이하는 방법도 있다.

#include <stdio.h>
#include <string.h>

char s[1000001];

int main() {
	int result = 1;

	scanf("%[^\n]", s);

	if (strlen(s) == 1 && s[0] == ' ') {
		printf("0");
		return 0;
	}

	for (int i = 1; i < strlen(s) - 1; i++) {
		if (s[i] == ' ') result++;
	}
	printf("%d", result);
    
	return 0;
}

 

참고: scanf의 %[^\n]는 엔터를 만날때 까지 읽기에, 공백 포함에서 읽을 수 있다.

반응형