PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2010/04/14 20:39:00
Name 제로스
Subject C언어 질문입니다..
텍스트파일을 열어서 단어를 찾아주는 프로그램을 짜야하는데요.

단어는 a*b , a**b*c , *a?cde* , * , ?? , b??c*식으로 입력을 받고

예를들어서 *s*s* 식으로 사용자가 입력을하면

텍스트 파일에서 *s*s*해당하는 단어를 찾아서

line#1: essential, systems, systems
line#2: describes, successive, releases

이런식으로 출력을 해야하는데 어떻게 짜야할지 막막합니다 ..

어떤식으로 짜야하나요? 너무 어리석은 질문해서 죄송합니다..

그래도 물어볼 곳이 피쟐 밖에 없어서 이렇게 조언 구합니다 ..

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
도니..
10/04/14 20:49
수정 아이콘
문제에서 *s*s* 꼴로 입력하면 essential, describes, successive 가 출력이 되면 안되는거 아닙니까? systems 도 *s*s* 형태가 아니라 s*s 형태 아닌가요? 잘 이해가 안되는데요...
Je ne sais quoi
10/04/14 20:51
수정 아이콘
정규식에 대해서 이해를 하셔야 하는데 왠지 쓰신 걸 보니 정규식을 모르시는 거 같네요.
정규식 프로그래밍은 http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/regex를 보세요.
지구사랑
10/04/14 20:59
수정 아이콘
꼭 C로 짜야 하는 건가요, 아니면, 저런 기능이 있는 프로그램이 있으면 되는 건가요?
만일 후자라면, C보다는 정규 표현(regular expression)에 대한 라이브러리가 지원되는 언어를 쓰시는 게 낫습니다.
예를 들어, Perl 이나 Python 같은 언어가 있겠죠.
PS) 하긴, 위의 언어들을 쓰면 숙제가 너무 쉬워지겠네요.
WizardMo진종
10/04/14 21:00
수정 아이콘
유준범 교수님 프로그래밍 프로젝트군요;; 소프트웨어 검증시간에 들어오셔서 저걸 과제로 내려고 생각중인데 4학년들이
극구 말렸는데 진짜 내셨군요...

개인적으론 파일 입출력함수랑 문자열함수랑 알면 어느정도 모양새가 나올꺼 같긴한데 솔직히
말하면 저거 짜라 그러면 저도 막막합니다... 일단 행운을 빌구요;;;


그리고 교수님이 치팅 프로그램으로 소스 전부다 검사 한다그러니까 어지간하게 카피하면 거의다 카피로 나올껍니다;;;
도니..
10/04/14 21:02
수정 아이콘
C 프로그래밍 수업에서 저걸 작성하라고 하면 개인 역량으로 작성하는 학생들이 있나요???
10/04/14 22:35
수정 아이콘
*만 구현한 함수에요 어떻게 작동하는지 보고 ?도 추가로 구현하면 됩니다.
word에 단어를 넣고 exp에 표현식 넣으면 됩니다.

int check(char *word, char *exp)

if( strlen(word)==0&&
strlen(exp)==0 ) return 1;

if(word[0]==exp[0])
return check(word+1,exp+1);

if(exp[0]=='*')
return check(word+1,exp)||check(word,exp+1);

return 0;
azurespace
10/04/14 22:38
수정 아이콘
그런 거 몰라도 구현 가능합니다. 힌트를 드리겠습니다.
*와 ?를 기준으로 단어들을 분리합니다.

a?b 라면 a와 b가 되겠죠. a?b*b라면 a와 b와 b로 나뉘겠죠.

자, 이 패턴을 가지고 어떤 문자열이 패턴에 적용되는지를 검사하고 싶습니다. 어떻게 하느냐..
나뉘어진 각 단어들을 가지고 그 단어들이 어느 위치에 있는지를 모두 찾아내어 검사합니다.

e*s*se??al라는 패턴이 있다고 가정할까요?
essential 이라는 단어가 이 패턴에 들어맞는지를 검사하기 위해 다음과 같은 리스트가 만들어질 겁니다. 각 숫자는 해당 단어의 시작 위치를 나타내죠.

e: 0 3
s: 1 2
se: 2
al : 8

그럼 뭐.. 이 위치들 가지고 잘 가지고 놀면 됩니다. e의 끝 위치와 s의 시작 위치는 최소한 1만큼 차이가 나야 할 것이고, 반면 se의 끝 위치(이건 시작 위치에 길이를 더하면 나오겠죠?)와 al의 시작 위치 사이의 거리는 물음표가 두개이므로 최소 3의 차이가 나야 할 겁니다. 이러한 관계를 가지고 저 정보들 사이에 그래프를 만들 수 있는데, 맨 처음 단어로부터 시작해 마지막 단어까지의 경로가 존재한다면(이건 알고리즘 책 보면 있을 겁니다.), 그리고 그게 검사하는 문자열의 범위를 완전히 커버한다면 패턴을 만족하는 것이죠.
MoreThanAir
10/04/15 02:29
수정 아이콘
제가 생각하는 방식으로는 가장 본질적인 접근이 낫다고 봅니다.
일단 입력 식을 받아들인 후에 Start state에서 시작하여 DFA(Deterministic Finite Automaton)를 만듭니다 A 다음에 ?가 있는 경우는 next state로 transition *가 있는 경우는 자기 자신으로 transition을 합니다. 입력식의 끝에서 End state를 넣어주면 DFA가 만들어집니다. 이 DFA는 linked list나 그 외에 적당한 자료구조로 만들어주면 됩니다. 그리고 테스트 할 문장을 이 DFA로 검사를 해줍니다. Accept state에서 멈춘다면 조건에 맞는 문장이 되는거겠죠-
아이온
10/04/15 08:07
수정 아이콘
저도 MoreThanAir님의 의견에 동의합니다. '추상적인' 얘기가 어려워 보여도 진입 장벽이 약간 있을 뿐 문제를 가장 쉽게 푸는 방법입니다.

처음부터 구현의 디테일까지 한꺼번에 생각하면 안 됩니다. 최대한 구현과 분리된, 추상 수준이 높은 문제부터 풀어야 합니다. 이 문제는, 주어진 정규표현식 패턴에, 문자열이 일치하는지 검증하는, 검증기를 생성하는 문제입니다. 프로그램을 한다고 생각하지 마시고, 그냥, 사람이 직접 같은 문제를 푼다고 상상해 보세요. 대신 ad hoc하게 푸는 게 아니라, 거기에 의지하면 항상 이 문제를 풀 수 있는, 기계적인 방법을 만들어낸다고 생각하시면 될 것 같습니다. 쉽지 않다는 걸 발견하시게 될 것 같고요.

일반적으로 automata를 만들어서, 그 automata의 입력으로 판별할 대상인 문자열을 주게 됩니다. 오토마타 책을 보시면 어떻게 정규표현식을 판별하는 오토마타를 만드는지 아마 잘 나와 있을 것 같습니다. 저의 경우엔 컴파일러 책 앞부분에서 봤습니다. 먼저 구현은 잊고 오토마타를 익히신 다음, 오토마타 생성기를 구현하고, 그 다음에 문자열을 그 오토마타로 판독하는 루틴을 만드시면 됩니다.

이 문제는 실생활에서 만나게 될 문제들에 비해 "아주 쉬운" 문제입니다. 이런 문제를 쉽게 풀 수 있는 방법론을 갖고 계시지 않으면 안 되는 것 같습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
79223 아이팟 와이파이 [9] 공부해서남주2318 10/04/15 2318
79222 좀 긍정적인 발라드 없을까요? [13] 써니3640 10/04/15 3640
79221 다시 한번 질문하겠습니다.. 제로스2089 10/04/15 2089
79220 컴퓨터 견적 검토 부탁드리겠습니다. & 동원훈련 관련 질문입니다. [3] lotte_giants2271 10/04/14 2271
79219 네오스타리그 안하나요?? [1] Kaga2181 10/04/14 2181
79218 첫 전세를 알아보는데 초보자가 알아야할 것들이라면? [2] 배려2180 10/04/14 2180
79217 c언어 기초계산문제 질문인데요, [2] sherry1942 10/04/14 1942
79216 동영장 재생시 가만히 있으면 음소거 되는 현상 꼬꼬마리더2103 10/04/14 2103
79215 마우스질 별로 필요없는 시뮬레이션 게임 추천해주세요. [15] 로트리버4919 10/04/14 4919
79214 결혼 축가 무엇이 좋을까요? [15] Blazing Souls3454 10/04/14 3454
79213 수학 질문있습니다. [2] tnpfpr2111 10/04/14 2111
79211 공대 대학원생분들께 질문 좀 드립니다.. [6] greensocks2354 10/04/14 2354
79210 특정 사이트에서 다운로드가 되지않을때? [1] 사랑의바보2406 10/04/14 2406
79209 파폭에서 주소창 열기 단축키? [3] 강나라2306 10/04/14 2306
79208 컴퓨터 견적? 혹은 추천 좀 부탁드립니다. (고사양) [9] videodrome2036 10/04/14 2036
79207 CPU를 사서 교체하려 합니다. [7] 허느님맙소사2320 10/04/14 2320
79206 타블렛 사려는 데,,, 어떤 게 좋을까요? 카이토z1931 10/04/14 1931
79205 이승만 대통령의 학력에 대하여. [6] 논트루마5454 10/04/14 5454
79204 C언어 질문입니다.. [25] 제로스2121 10/04/14 2121
79203 좀 무겁지만 -_-; 남북관계 + 대북정책 질문.... [2] FastVulture2074 10/04/14 2074
79202 생으로 먹으면 좋은 것들 뭐가 있을까요? [40] marine2642 10/04/14 2642
79201 대학물리학때문에 힘들어요....어떻게 해야하죠?? [12] 깐따삐야6323 10/04/14 6323
79200 공익에 대한 질문입니다 [6] Hybrid2989 10/04/14 2989
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로