[백준BOJ1152 C++] 단어의 개수
[백준BOJ1152 C++] 단어의 개수
문제
https://www.acmicpc.net/problem/1152
풀이
다음은 본인의 풀이 방법이다.
- cin.getline(c, sizeof(c)) 형식으로 공백 문자를 포함한 문장의 한 줄을 읽어 c 배열에 저장하도록 했다.
- strtok(c, “ “) 함수로 통해 문자열을 공백을 기준으로 1번 분리하고 단어 개수를 세는 작업을 시작한다.
- strtok 함수를 받은 포인터 ptr이 nullptr이 아닌 동안 작업을 반복한다.
- 공백을 기준으로 분리된 단어가 발견될 때마다 a 변수를 증가 시킨다.
- 다음 단어를 찾기 위해 strtok 함수를 호출한다.
제출
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
char c[1000001];
char* ptr;
int a = 0;
cin.getline(c, sizeof(c));
ptr = strtok(c, " ");
while (ptr != nullptr) {
if (ptr != nullptr) a += 1;
ptr = strtok(nullptr, " ");
}
cout << a;
return 0;
}
메모
해당 코드가 메모리 사용이 비효율적으로 나타나는 것 같아 질문게시판에 올려보았는데, 문자열을 문자열로 받지 않고 stdin에서 문자 하나씩 가져와서 판단하는 것이 좋다는 조언을 들었다. 본인은 이 댓글을 fgets(c, sizeof(c), stdin)을 이용하라는 말씀인지 아직 제대로 이해 못한 상태이며, 비슷하게 작성해본 결과 아직까진 메모리 사용이 2876KB으로 똑같이 나와서 잘 모르겠다. 나중에 더 공부해볼 필요가 있어 보인다. (^^ ;)
-
cin.getline() 활용
기본 형식은 istream& getline(char* s, streamsize count, char delim)로 한 줄을 읽어와서 문자열에 저장하는 함수이며 ‘\n’을 기준으로 입력을 구분한다.
-
strtok() 함수 활용
기본 형식은 char *strtok(char *str, const char *delimiters)로 str은 분리할 대상의 문자열, 첫 호출 시에 대상 문자열을 받아 첫 번째 토큰(분리된 문자열)을 반환한다. 다음 호출부터는 NULL을 전달하여 다음 토큰을 찾는 것을 반복한다.
strtok 함수는 각 토큰의 시작 위치를 찾아서 NULL을 반환해야 하기 때문에 char *ptr라는 포인터 변수로 선언하여 사용한다.
This post is licensed under CC BY 4.0 by the author.