minimimi

[백준] 2902 KMP는 왜 KMP일까? 본문

프로그래밍 공부/알고리즘

[백준] 2902 KMP는 왜 KMP일까?

99mini 2019. 7. 31. 09:05
반응형

문제링크] https://www.acmicpc.net/problem/2902

 

2902번: KMP는 왜 KMP일까?

문제 KMP 알고리즘이 KMP인 이유는 이를 만든 사람의 성이 Knuth, Morris, Prett이기 때문이다. 이렇게 알고리즘에는 발견한 사람의 성을 따서 이름을 붙이는 경우가 많다. 또 다른 예로, 유명한 비대칭 암호화 알고리즘 RSA는 이를 만든 사람의 이름이 Rivest, Shamir, Adleman이다. 사람들은 이렇게 사람 성이 들어간 알고리즘을 두 가지 형태로 부른다. 첫 번째는 성을 모두 쓰고, 이를 하이픈(-)으로 이어 붙인 것이다. 예

www.acmicpc.net


문제요약

Knuth-Morris-Pratt 와 같이 긴 형태를 KMP 처럼 이니셜의 짧은 형태로 변환하는 문제입니다.

풀이

문제 해결을 위해서는 문자열 처리에 대해서 알아야 합니다.

 

오늘 사용할 함수는 strtok() 함수입니다.

strtok(대상문자열, 기준문자);
    - char *strtok(char *_String, char const *_Delimiter);
    - 자른 문자열을 반환, 더 이상 자를 문자열이 없으면 NULL을 반환

strtok 함수는 char* 형태의 문자열과 기준 문자를 매개변수로 받습니다. 그리고 char 포인터를 반환하기 때문에 char 포인터를 선언하여 while문을 돌면서 갱신해주면서 이용하면 됩니다.

 

char *tok = strtok(str, "-");
	while (tok != nullptr) {
		printf("%c" ,tok[0]);
		tok = strtok(nullptr, "-");
	}

 

문제에서 하이픈("-")을 기준으로 문자열이 나뉘니 char *tok = strtok(str,"-"); 으로 char 포인터 tok 를 선언과 초기화해줍니다. 그 후 tok 가 nullptr를 가르킬 때까지 반복해줍니다. 이 때 while 문 안에서 tok = strtok(nullptr, "-");으로 초기화 해주는 데 그 이유는 strtok 함수가 기준문자를 만났을 때 기준문자를 NULL로 대체하기 때문입니다. 

 

strtok 함수 동작 그림

 

또한 tok가 포인터이기 때문에

printf("%c", tok[0]);

다음과 같이 인덱스를 통한 접근이 가능합니다.

 

strtok 함수를 이용할 때에 "기준문자가 NULL로 대체" 된다는 것을 꼭 기억해야 됩니다.


소스코드는 C/C++로 작성되었습니다.

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

int main() {
	char str[101];
	
	scanf("%s", &str);

	char *tok = strtok(str, "-");
	while (tok != nullptr) {
		printf("%c" ,tok[0]);
		tok = strtok(nullptr, "-");
	}

	return 0;
}
반응형

'프로그래밍 공부 > 알고리즘' 카테고리의 다른 글

[백준] 10845 큐  (0) 2019.08.06
[백준] 10773 제로  (0) 2019.08.06
[백준] 2798 블랙잭  (0) 2019.07.30
[백준] 2231 분해합  (0) 2019.07.30
[백준] 11727 2 x n 타일링 2  (0) 2019.07.30