태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

나도 반드시 맞춤법이나 용례를 올바르게 사용한다고 할 수 없고, 인터넷에서 사용하는 언어의 특성을 이해하지 못하는 바도 아니지만 너무 심한 예가 있어 소개한다. 아래는 디시갤의 모 미드 게시판에서 퍼온 문장이다. 디시갤의 특성상 '띄워 쓰기 무시'라든지 '과도한 축약형 사용' 등은 너그러이 이해하고 넘어가자. 

A) 이번시즌근데 저번시즌보단 낮지않나요?-_- 

곧이곧대로 해석하면 이 문장의 뜻이 뭘까? 수학식으로 표시하면 이해하기 쉬운데, '이번시즌 < 저번시즌'이라는 말이다. 이제 위 문장에 바로 이어지는 다음 문장을 보자. 신기하게도
앞선
앞선 문장의 주장을 부정한다. 

B) 저번시즌 초반에만 재밌고 후반갈수록 지루하던데-_-

결국 '낮지'가 아니라 '낫지'라고 써야 A는 옳은 문장이 된다. '낫다'와 '낮다'를 잘못 사용하는 것은 의미를 완전히 반대로 만들기 때문에 반드시 주의해야한다. 사실 ‘낮다’를 두 가지를 단순 비교하는 단어로 사용하는 것 자체도 무리가 있다. ‘수준이 낮다’ 정도로 비교 대상을 명확하게 해줄 필요가 있다.

나는 네이버 댓글을 자주 본다. 기사를 보지 않고 댓글만 보는 경우도 있다. 기사가 지적하지 못한 문제점들을 댓글에서 발견하는 경우도 많고, 공들여 쓴 댓글은 기자(?)들이 쓴 원문보다 더 좋은 내용을 담고 있기도 하기 때문이다. 하지만 수많은 네이버 찌질이 댓글을 보면, '낳다'라는 말을 '낫다' 대신 사용하는 오류를 범한다. 뭐 이런 식이다.

C) 지뚫킥에서 세경신이 낳냐? 황정남이 낳냐?

낳기는 뭐를 낳나? '낳다'라는 말은 주로 아기를 '낳다'라든지 결과를 '낳다'와 같은 경우에 사용하는 단어이다. 물론 키보드에서 'ㅅ'과 'ㅎ'의 위치가 가깝기 때문에 오타일 가능성도 있지만, 대개 이런 사람들의 글에서 이러한 오류는 무수히 반복된다. 

'낳다'가 나온 김에, 나조차 헷갈리게 만드는 말이 있는데, '놓다'라는 말이다. 물건을 어디에 '놓다'로 많이 사용된다. 

D) 아기 놓고 잘 살아야지.

TV에서도 너무 많이 나오기에 이게 표준어인가 싶었다. "아기를 '낳고' 잘 살아야지"라고 생각했는데 너무 많은 사람들이 이런 말을 사용했다. 사실 '아기 놓다'는 경상도 방언이라고 한다. 사투리의 고유 가치를 생각해도 TV등에서 무분별하게 '놓다'라는 말을 사용하는 것은 문제가 있다. 댓글에도 재미가 아닌 이상 사투리로 댓글을 다는 사람은 별로 없는 것으로 안다. 즉, '놓다'가 사투리라는 사실을 알지 못하고 잘못 사용하는 것이다. 적어도 '표준어'가 뭔지는 제대로 알고 사용해야 한다는 점에서 반드시 시정해야 할 사항이다.

예전에도 블로그에 언급했던 '다르다'와 '틀리다'를 또 언급하고 싶다. '다르다'는 '같지 않다'이고, '틀리다'는 '옳지 않다'이다. 우리나라 사람들은 TV에서도 아나운서를 제외하고는 모두 '틀리다'라고 말한다. 물론 자막으로 '다르다'라고 지적하는 경우도 간간이 있다. 나도 내가 이 단어들을 잘못 사용한다는 사실을 지적받기 전까지는 모두 '틀리다'라고 사용했기 때문에, 지금 잘못 사용하는 사람들을 비난할 입장은 되지 못한다. 하지만, 제발 이제부터라도 제대로 알고 사용하자. 

개인적으로 이 오류는, 우리나라 사람들이 다른 사람과의 '차이점' 혹은 '다양성'을 옳지 않음으로 인식하는 경향이 있어 보여 더 싫다. '그는 나와 달라'이지, '그는 나와 틀려'가 아니다. 그 사람이 나와 같지 않은 것이지, 그 사람이 옳지 않은 것은 아니라는 말이다.

여담으로, 블로그에 한글 워드나 MS 워드 수준의 맞춤법 검사/교정 기능을 넣어주면 좋겠다는 생각이 든다. 나는 대부분 블로그에 글을 올리기 전에 한글에서 맞춤법 검사를 한다. 물론, 영어는 MS 워드를 사용한다. 완벽하지는 않겠지만 적어도 내가 쓴 글에서 명백한 오류를 많이 발견해준다. 맞춤법 검사도 안하고 기사를 올리는 인터넷 기자(?)들을 볼 때, 이것이 최소한의 예의라고 생각한다.
저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
Given
two
two strings, s1 and s2, write a program to check if s1 is a rotation of s2. But you can use strstr() only once. (abcdef = cdefab)

간단해 보이는데 방법이 잘 떠오르지 않았다. 침대에 엎드려서 생각해낸 방법으로 열심히 코딩을 한 후 답안을 확인해보니 2줄이면 끝난다. 

내가 사용한 방법은 s1의 맨 끝단어(s1[n])와 맨 앞단어(s1[0])를 붙여서 이 문자열(t)이 s2에 존재하는 위치를 먼저 구한다. t가 s2에 존재하면 t가 존재하는 위치 뒷부분, s2의 맨 앞에서 t가 존재하는 부분 직전까지의 문자열이 각각 s1에 존재하는지를 적절하게 체크한다. 다만, t가 s2에 존재하지 않는 경우 중에 s1=s2인 경우가 있으니까 주의하여 체크한다. 

 s[0]{ A }{ B }s[n] -> { B }s[n]s[0]{ A }

정답에서 사용한 방법은 s1+s1인 문자열을 만들고, s2가 그 안에 존재(strstr)하면 된다. 간단하다. 결과적으로는 s1을 순환하는 문자열로 생각한다는 점은 비슷했는데 내가 쓴 방법은 아주 지저분하고, 정답은 깔끔하다. 문제는 인터뷰를 할 때 나처럼 푼다면 짧은 시간 내에 오류 없이 소스를 완성 시키지 못할 것이 분명하기 때문에 정답과 같은 접근이 반드시 필요하다. 아흥!

소스보기

저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)
Write a program to extract the longest repeated substring in a given string.

주어진 문자열에서 반복되는 가장 긴 문자열을 추출하자. 문자열의 길이를 n이라고 했을 때 가장 무식한 방법은 모든 가능한 문자열을 다 구해서 반복되는 문자열을 찾고 긴 문자열을 출력하면 된다. 비교 대상인 두 문자열의 시작점을 i, j라고하고 문자열의 길이를 k라고 하고, 비교할 수 있고 문자열을 비교하는 것 또한 k만큼 필요하므로 대략 O(n^4)이 나온다. 어쨌든, 좋지 않다.

이 문제에 접근하기 위해서 사용되는 것이 suffix array라는 것이다. 문자열에서의 각 시작점들의 인덱스를 값(element)으로 가지는 배열을 말한다. 말로 써놓으면 이해하기 어렵고 간단하게 예를 들면 'banana'라는 문자열이 있을 때 'banana'는 0번 인덱스부터 시작한 것이고, 'anana'는 1번 인덱스부터 시작한 것이다. 또한 'na'의 경우 4번 인덱스부터 시작한 것이다. 이러한 0, 1, 4 등의 값을 가지는 배열을 suffix array라고 한다.

a[] = {"banana", "anana", "nana", "ana", "na", "a"}

위와 같은 식으로 값을 가리키는 셈인데, 이것을 정렬하면

a[] = {"a", "ana", "anana", "banana", "na", "nana"}

와 같은 꼴이 된다. 이제 앞뒤 문자열만 비교하면 순서대로 몇 개의 문자가 일치하는지 쉽게 구할 수 있다. 이 경우 "ana"와 "anana"에서 3자리 문자열 "ana"가 가장 긴 반복되는 문자열이 된다. 이제 시간 복잡도는 O(n*nlogn)이 된다. n은 문자열 비교에서, nlogn은 정렬에서 온 수치이다.

소스 코드 상에서는 compare 함수에서 *(char**)a 를 사용하는 부분이 까다로왔다. 포인터에 대해서 좀 알게 되었나 싶었더니 여전히 잘 모르는 것 같다. 좀 더 알아봐야겠다. Programming Pearls에서 보고 감탄했는데, 알고랭이 좀 했다하는 애들은 중학생들도 아는 알고리즘이라는 것을 알고 나니 부끄럽다. -_-;

소스열기

저작자 표시 비영리 변경 금지
이올린에 북마크하기(0) 이올린에 추천하기(0)