** 이 글을 읽음에 앞서 포스팅 된 소스가 100% 정답은 아님을 밝힙니다.
더욱 유능한 분께서 클린 / 최적의 소스를 짜셨을 가능성이 높습니다.
기록용으로 남기며, 참고만 부탁드립니다.
** 백준 알고리즘은 직접 풀이를 해보시는 것을 권장합니다.
● 문제
난이도[티어] : 브론즈 2
백준 알고리즘 2217번 문제 로프
https://www.acmicpc.net/problem/1152
● 풀이 방법
사용자로 부터 문자열을 받고, 해당 문자열에서 ' ' 를 기준으로 단어들을 strtok를 통해 단어를 구분지어 개수를 카운트 하면 된다.
● 소스 코드
#include <iostream>
#include <string.h>
int main()
{
// var 선언
char text[1000000]={0,};
char* cut_text;
int cut_cnt = 0;
//입력받기 [ %[^/n]s의 의미는 문자열에서 개행문자를 제외한 모든 문자를 읽는 다는 뜻.]
scanf("%[^\n]s", text);
cut_text = strtok(text," ");
while(cut_text){
cut_text = strtok(NULL," ");
cut_cnt++;
}
printf("%d",cut_cnt);
}
띄어쓰기가 포함된 것 까지 text에 담고, strtok를 통해 단어를 추출+카운팅.
카운트 된 단어의 개수를 출력함으로 써 소스는 끝이난다.
문자열안에서 구분자를 찾아 값을 도출해 내는 strtok의 경우 종류가 두 가지가 있다.
프로젝트 진행 중, 멀티스레드를 사용하는 환경에서 strtok를 사용하였던 적이 있는데 의도치 않는 결과값이 나왔을 때가 있었다. 멀티스레드 환경에서 사용시 strtok_r를 사용하는 것을 추천한다.
strtok()의 경우 내부적으로 사용된 문자열의 위치를 기억하고 있어서 반복문을 통해 추출하였던 문자열을 통해 다음 값을 추출하는 형식을 가지고 있다.
즉 다른 쓰레드에서 strtok를 쓰게 되면 이미 쓰고 있던 문자열에서의 다음 결과값을 도출해 내기 때문에 의도치 않는 결과값을 낼 수 있다.
strtok_r()의 경우는 strtok()와 달리 버퍼를 사용하여 여러개의 문자열을 동시에 처리할 수 있다. 대신 버퍼를 명시적으로 전달해야하는 점이 특이점이다.
멀티스레드 환경에서는 유의하면서 어느 것을 사용할 지 잘 선택을 하자.
#include <string.h>
char *strtok(char *string1, const char *string2);
#include <string.h>
char *strtok_r(char *string1, const char *string2, char **lasts);
● 결과
** 코드 길이가 상이 할 수 있습니다! 그러나 내용물은 같습니다.
이유) 주석 및 더미 소스 유무
'백준 알고리즘' 카테고리의 다른 글
[백준 알고리즘 C/C++] 1008번 문제 풀이 : A/B (0) | 2024.03.29 |
---|---|
[백준 알고리즘 C/C++] 1463번 문제 풀이 : 1로 만들기 (0) | 2024.03.28 |
[백준 알고리즘 C/C++] 1027번 문제 풀이: 고층 건물 (2) | 2024.03.24 |
[백준 알고리즘 C/C++] 1018번 문제 풀이: 체스판 다시 칠하기 (1) | 2024.03.24 |
[백준 알고리즘 C/C++] 1011번 문제 풀이: Fly me to the Alpha Centauri (0) | 2024.03.24 |