맛있는물회

[맛있는 물회] 컴퓨터윤리 <JAVA> 코드 표절 체크기 구현 본문

IT/포트폴리오

[맛있는 물회] 컴퓨터윤리 <JAVA> 코드 표절 체크기 구현

맛있는물회 2018. 7. 4. 19:29

컴퓨터윤리 <코드 표절 체크기 구현> 

컴퓨터학부라는 전공때문에..... (교양인데 ㅎㅎ  과제가 ㅎㅎㅎ 너무.. ㅎㅎㅎ) '컴퓨터 윤리'라는 수업에서 코드끼리 비교를 하여 표절 체크기를 구현하는 과제를 수행했다. 


구현방법에 있어서는 그렇게 복잡하지 않았다.


Original 코드와 비교 할 코드의 유사도를 측정하는 것이다.




처음에 교수님이 '해시 테이블' 이라는 자료구조를 사용하면 쉽게? 구현 가능하다고 하셨다.


또한 diff 같은 외부 라이브러리 및 툴을 사용하지 않는 범위에서 구현하도록 했다. 



해시 테이블이란 간단하게 말하면 


데이터를 담을 테이블을 크게 확보한 후 입력받은 데이터를 해시하여 테이블 내의 주소를 계산하고 이 주소에 데이터를 담는 것이라고 할 수 있다.


해시테이블에 대해 아직 확실하게 공부해보고 구현해보지 않아서 잘 모르겠는 부분이긴 하다. 그래서 사용하지 않았다.. ㅎ


검색을 계속해보니 유사도를 추출하는 아주 잘 되어있는 외부 라이브러리가 상당히 많이 있었다. 

입 출력 형태는 대충 이런식이었다. org소스와 비교할 소스의 유사도를 비교한후 다시 여러개의 유사도를 sorting해서 출력하는 프로그램이다.



생각을 해보다가 나는 두개의 코드파일에서 문장끼리 비교를 해보자 라는 생각을 하게 되었다.

(제일 간단한 방법인 것 같다 ㅎㅎ)

먼저 org.c  파일과 비교당할 Lab01.c 파일을  받아 한줄씩 ArrayList<String>에 각각 받기로 하였다.


그렇게 큰 틀을 잡아서 대충 만들어보니 유사도가 개판이었다. ㅎㅎㅎㅎㅎ



그 이유는! 


이렇게 나처럼 하는 사람도 있고!


이렇게 한줄 띄우는 사람도 있다.

코드마다 스타일이 다르고 탭 문자나 띄어쓰기, 개행문자가 다르다!


이러한 것들이 유사도에 적지 않은 영향을 끼치는 것이다.



그래서 ArrayList에 한줄씩 받을 때 탭, 개행문자, 띄어쓰기 를 포함하는 /s를 ""로 바꾸도록 했고, { 와 } 또한 ""로 바꾸어서 지워주었다.





이 코드의 구현에서 원하는 입력 값이 orginal 소스의 이름과, 비교당할 Lab.c의 디렉토리 였기 때문에 나는 메서드를 


이렇게 구현하였다.



그래서 cmpdir라는 디렉토리를 입력받아 ArrayList에 한줄씩 받는 것을 구현한 것이다.


orginal소스를 한줄씩 받는 것도 동일하게 한 메서드 안에서 구현하였다.




good이라는 메서드 안에서 String 끼리 비교해서 ++시키는 메서드도 따로 만들어서 사용하였다. 



compare라는 메서드이다.


이렇게 유사도를 비교하는 매서드는 완성!





main에서는 간단하게 org.c 파일과 Lab01.c, Lab02.c, Lab03.c, Lab04.c, Lab05.c 끼리 비교를 하여서 출력을 하였다.



오름차순 sorting은 간단하기 때문에 그냥 생략하도록 하겠다.


그렇게 하여서 나오는 출력값은!



넹.. 이렇게 나옵니다.


뿌듯하네요



org.c 와 Lab.c 의 파일을 대충 보여주자면



org.c


Lab05.c



네 끗입니다.


Comments