본문 바로가기
Programming/PS

[백준/BOJ] C언어/C++ 1152번 단어의 개수 문제풀이

by yoiii 2021. 2. 24.

#1 문제

www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한

www.acmicpc.net


#2 info

카테고리 : 단계별로 풀어보기 - 문자열 파트

난이도 : BRONZE2

사용언어 : C언어/C++

메모리 : 1980KB

시간 : 8ms


#3 소스코드

/* omyo(yomo) develop */ 
/* blog : https://omyodevelop.tistory.com */

#include <stdio.h>
#include <string.h>
#define LEN 1000001

int main(void){
	char str[LEN];
	fgets(str,LEN,stdin);
	
	int cnt = 1;
	
	for(int i=0; i<strlen(str); i++){
		if(str[i] == ' ' && str[i-1] == ' ')
			continue;
		else if(str[i] == ' ')
			cnt++;
	}
	
	if(str[0] == ' ') cnt--;
	if(str[strlen(str)-2] == ' ') cnt--;
	
	printf("%d",cnt);
	
	return 0;
}

#4 풀이

간단한 문제 이지만 자칫 실수하기 쉬운 문제이기도 합니다. 

BOJ 1152 단어의 개수 문제는 다음 항목들만 조심하면 됩니다.

 

1. 공백이 연속해서 나오는 케이스

2. 문자열 처음에 공백이 나오는 케이스

3. 문자열 마지막에 공백이 나오는 케이스

 

for(int i=0; i<strlen(str); i++){
		if(str[i] == ' ' && str[i-1] == ' ')
			continue;
		else if(str[i] == ' ')
			cnt++;
	}

 

1번 케이스 (공백이 연속해서 나오는 케이스)를 고려한 코드 입니다.

공백이 하나만 나오는 문자열이라면 상관 없겠지만, 공백이 연속해서 나오는 문자열 (예를들어 hello  c 같은 경우는 공백이 2번 나오기에 cnt의 값이 2번 증가됩니다.)을 고려해서, i번째 인덱스가 공백인데 i-1번째 인덱스 또한 공백이라면 cnt의 값을 증가시키지 않고 continue 하도록 코드를 짰습니다.

 

if(str[0] == ' ') cnt--;

 

2번 케이스 (문자열 처음에 공백이 나오는 케이스)를 고려한 코드 입니다.

문자열 맨 처음에 공백이 나오면, cnt의 값이 증가하기에 이를 방지하기 위해, 입력 받은 문자열 배열(str)의 첫 번째 인덱스 값이 공백이라면 cnt 변수의 값을 1 감소 시키도록 코드를 짰습니다.

 

if(str[strlen(str)-2] == ' ') cnt--;

 

3번 케이스 (문자열 마지막에 공백이 나오는 케이스)를 고려한 코드 입니다.

마찬가지로 문자열 마지막에 공백이 나오면 , cnt의 값이 증가하기에 이를 방지하여 입력 받은 문자열 배열의 마지막에서 2번째 인덱스가 공백이라면 cnt 변수의 값을 1 감소 시키도록 코드를 짰습니다.

(fgets함수를 이용해 문자열을 받으면 마지막에 NULL 문자가 자동으로 추가되기 때문에 1이 아닌 2를 감소 시켰습니다.)


댓글