자료구조&알고리즘/백준

[백준 c 1152] 단어의 개수

celinayk 2022. 11. 2. 23:11
반응형

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

접근

처음에 문제를 보고 strtok를 이용해서 문자열을 자른다음에 갯수를 세는 방법으로 구현을 했다.

근데 도저히 아닌것 같아서 찾아보니 "공백의 갯수"를 이용해서 대부분 풀었고 나도 공백의 갯수를 이용해서 다시 구현을 했다. 내가 문제를 볼 때 간과했던 점이 있는데 예제 입력을 제대로 보지 않았다는 것이다.

예제 입력2를 보면 맨앞부분이 공백이고 예제 입력3에는 맨 뒷부분이 공백이다. 그래서 공백의 갯수를 이용해서 문제를 해결하는 방향으로 구현했다

코드

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


int main() {
	
	char data[1000001];
	scanf("%[^\n]", data);

	int len = strlen(data);
	int cnt = 0; //공백의 갯수 카운팅 
	printf("%d\n", len);
	for (int i = 0; i < len; i++) {
		if (data[i] == ' ') { //공백일때
			if (i != 0 && i != len - 1) {
				cnt++;
			}
			if (len == 1) { //빈공백만 입력했을 때(입력의 길이가 1이고 그 입력이 공백일때)
				cnt = -1;
			}
		}
	}
 
	printf("%d\n", cnt + 1);
	return 0;
}

리뷰

1. 문자열을 입력받는다.

 

제일 처음에 나는

scanf("%s", data);

이렇게 코드를 짰다. 그런데 여기서는 이 방법을 사용해서는 안된다. 

이렇게 입력을 받는 것은 s에 공백 또는 엔터가 있을 때까지 입력을 받는다.라는 뜻이다

즉, 내가

The Curious Case of Benjamin Button

이라는 문장을 써도 The까지 밖에 입력이 되지 않는다.

 

이럴 때는 공백을 포함한 문자열을 입력받아야한다.

 

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

스캔셋(scanset)이라고 한다. 

 

'^'문자는 그 뒤에 나오는 문자들을 제외한다는 뜻이다. 그래서 줄바꿈 문자를 만나기전까지 입력을 받을 수가 있고

공백도 입력을 받을 수 있게 된다

 

2. 문자열의 길이를 strlen함수를 이용해서 구해준다.

 

3. 공백의 갯수를 카운트 해준다.

if (data[i] == ' ') { //공백일때
			if (i != 0 && i != len - 1) {
				cnt++;
			}
			if (len == 1) { //빈공백만 입력했을 때(입력의 길이가 1이고 그 입력이 공백일때)
				cnt = -1;
			}
		}

문자열을 반복문을 통해 스캔하면서 공백일 때 cnt를 늘려줌으로써 공백의 갯수를 카운팅하는 것이다.

이때 조건이 있다. 바로 예제입력2와 예제입력3이다. 

조건을 걸어서 맨앞에 공백이 생길때와 맨뒤에 공백이 생길때를 제외해줘야한다.

** i=0이 맨 처음 공백, len-1이 맨뒤에 공백이다

예를 들어 len의 길이가 30짜리인 문자열이 있을 때, 배열 인덱스로는 29번째가 마지막이니까 len(30)-1을 하면 29가 되므로 배열의 맨마지막을 가리키게 된다.

 

if (len == 1) { 
				cnt = -1;
			}

 이 조건을 걸어주는 이유는 내가 공백 하나만 입력했을때의 경우이다.

이럴때는 -1을 해준다. 나중에 +1을 할때 상쇄시킬수 있어서 최종적으로는 0이 출력되기 때문이다

 

4. +1을 해서 출력해준다

단어의 개수는 공백의 개수 +1개가 되어야하므로 +1을 더해서 출력을 해준다 

 

학습

내가 생각했던 것과 다른 관점에서 쉽고 간단하게 문제를 풀수 있었고 이렇게 풀 수도 있다는 새로운 관점을 깨닫게 되었다.

 

출처

1152번: 단어의 개수 (acmicpc.net)

 

1152번: 단어의 개수

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

www.acmicpc.net

 

댓글수0