반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
12-01 10:12
관리 메뉴

ImJay

[C언어] 백준 1152번 : 단어의 개수 본문

백준 - C, C++/07. 문자열

[C언어] 백준 1152번 : 단어의 개수

ImJay 2020. 10. 21. 00:00
반응형

백준 1152번 : 단어의 개수

- 사용언어 : C언어

www.acmicpc.net/problem/1152

1. 문제

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

2. 코드

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

int main(void) {
	
	char voca[num];
	char* tmp;
	
	gets(voca);
	
	int count=0;
	
	tmp = strtok(voca, " ");
	
	while(tmp != NULL) {
		count++;
		tmp = strtok(NULL, " ");
	}
	
	printf("%d", count);
	
}

3. 풀이

새로 사용하는 함수들이 많습니다. 차근차근 설명하겠습니다.

 

먼저 char* tmp 입니다.

 

말그대로 문자열 선언 방식입니다.

 

char tmp 에서는 문자를 하나밖에 넣지 못하지만,

 

char* tmp 는 문자를 여러개 넣을 수 있습니다.

 

gets() 함수는 scanf의 문자열 방식입니다.

 

문제에서 띄어쓰기로 단어를 구분하므로, strtok 함수를 사용합니다.

 

strtok 함수는 문자열에서 원하는 문자가 나올 때 문자열에 NULL 값을 저장해 구분해주는 함수입니다.

 

예제를 예시로 들어보면,

 

input : The Curious Case of Benjamin Button

 

tmp = strtok(voca, " "); // tmp = The , voca = \0(NULL)Curious Case of Benjamin Button

 

tmp = strtok(NULL, " "); // tmp = Curious , voca = \0(NULL)Case of Benjamin Button

 

strtok를 사용하려면, 처음에는 구분을 원하는 문자열을 넣고, 그 다음 순서에서는 NULL을 넣습니다.

 

맨 앞에 NULL이 입력되있기 때문이고, strtok를 사용할 때의 약속이기도 합니다.

반응형
Comments