예를 들어 "" ∈ S, "0101" ∈ S, "1100" ∈ S 고, "001" ∉ S, "11100" ∉ S 임.
S는 다음과 문맥 자유 문법 E에 대응이 됨.
E ::= ε | 0 E 1 | 1 E 0 | E E
Backus-Naur 표기법이 익숙하지 않은 사람을 위해서 설명을 하자면
```
어떤 문자열 x가 E에 매칭된다는 것은:
- x가 빈 문자열 ε 이거나
- x가 '0 y 1' 꼴의 문자열이고 y가 E에 매칭되거나
- x가 '1 y 0' 꼴의 문자열이고 y가 E에 매칭되거나
- x가 'y z' 꼴의 문자열이고 y, z가 각각 E에 매칭 된다
```
그러면 주어진 이진문자열에서 0과 1의 갯수가 같은지 판별하고, 같은 경우 위 문법에 대응되는 파스 트리를 생성하는 프로그램을 만들 수 있음.
아래는 하스켈 구현임. 이진문자열은 그냥 Bool의 리스트로 만들었어.
(사실 이것 보다는 더 효율적으로 구현할 수 있음. 어차피 문제는 이게 아니니 대충 보세요)
========================== 여기부터 진짜 문제 ==========================
사실 0과 1의 갯수가 같은 문자열에 매칭되는 더 간단한 문법이 있음
F ::= ε | 0 F 1 F | 1 F 0 F
아까 문법은 branch가 4개인데 이건 3개라서 조금 더 간단함.
이 문법도 마찬가지로 프로그램으로 구현할 수 있음. 아래는 하스켈로 구현한 decode 함수임 (파스트리의 타입 Exp를 다시 이진문자열 [Bool] 로 만드는 함수)
문법 F에서의 encode 함수를 구현하는게 문제야.
주어진 이진문자열이 0과 1의 갯수가 같은지 판별하고, 같은 경우 문법 F의 파스 트리를 구하는 프로그램을 만들면 됨.
프로그래밍 언어는 자유임
* E, F 모두 ambiguous한 문법임. 그러니까 같은 문자열에 대응되는 파스 트리가 여러개일 수 있음. 아무거나 하나 구하면 됨.
* 0과 1의 갯수가 같은 모든 문자열이 F에 매칭된다는게 별로 자명하지 않음. 일단 왜 되는지 알아야 구현이 수월할 것임.
* 코드 예시를 하스켈만 제공해서 미안하지만, 어차피 글만 읽어도 문제는 이해할 수 있음.
?? 뭔 규칙임? - dc App
그냥 원하는 언어로 문제 조건에 맞는 프로그램 구현하면 됨
문제가 이해가 안 돼 - dc App
첫줄부터 뭐가 뭐에 대응되는건지 모름 - dc App
설명 추가해올게 ㄱㄷ
0과 1의 갯수가 같다는건 비트가 기준인지 문자열의 문자가 기준인지 두번째 문장의 0과 1이 같다고 말해서 혼동 초래 하스켈 모르면 코드 못읽음 문법이라는 표현이 모호해서 혼동을 초래. 첫번째 문법과 두번째 문법이라고 말한게 뭔지 이해하기 힘듬 한 다섯번 읽으니까 이해가 된다ㄷ
다시 보니까 이진문자열이라 했구나
모호해서 수정했음. 피드백 감사
무슨 소리지? 결과는 언제쯤 볼 수 있나?
이거 학부 수준은 아닌 거 맞지?
학부 수준이라고 생각하는데,,
학부 3~4학년 수준 - dc App
학부수준 아님? 오토마타~프로그래밍언어에서 주로 다루는 내용인데
ㅜ.ㅜ
그냥 E ::= ε | 0 E 1 | 1 E 0 는 안됨?
0110 같은 반례 있음
형식언어 멈춰
E는 문자열 앞뒤만 자르면 되서 구현하기 쉬워보이는데 F는 고민이 좀 필요할거같네
아 걍 얘도 맨앞에 자르고 가운데 기준으로 슬라이스해서 앞뒤가 같은지랑 가운데 문자가 맨 앞이랑 다른지만 체크하면 되겠네
포스가 갱장합니다 !!!
독해 공부해여겠다..
0과 1을 반전시킨 애도 같이 생각하면 효율적일 듯
문제부터가 무슨 말인지 모르겠다.. 문과는 웁니다 ㅠㅠ