for textmining

Maximum Subsequence Sum Problem

|

이번 글에서는 순서가 있는 숫자들의 최대 부분합을 구하는 문제인 Maximum Subsequence Sum Problem 알고리즘에 대해 살펴보도록 하겠습니다. 이 글은 고려대 김황남 교수님 강의를 정리하였음을 먼저 밝힙니다. 네 가지 접근을 소개할 예정인데요, 계산복잡성이 차례로 줄어듭니다. 그럼 시작하겠습니다.

접근1

다음과 같은 리스트가 있다고 가정해 보겠습니다.

4, -3, 5, -2, -1, 2, 6, -2

이 문제를 가장 단순하게 푸는 방법은 모든 경우의 수를 하나하나 모두 따져보는 것입니다. $i$는 고려 대상 부분 리스트의 왼쪽 끝 인덱스, $j$는 오른쪽 끝 인덱스, Thissum은 고려 대상 부분 리스트의 합, Maxsum은 이 문제의 최종 결론입니다. 다음과 같습니다.

$i$ $j$ Thissum Maxsum
0 0 4 4
0 1 4+(-3) 4
0
0 7 4+(-3)+5+(-2)+(-1)+2+6+(-2) 11
1 1 -3 11
1 2 (-3)+5 11
7 7 -2 11

위 표를 말로 풀어 설명하면 우선 $i$, $j$, Thissum, Maxsum을 모두 0으로 초기화합니다. $i$는 고정시킨 채 $j$를 0부터 리스트 요소 전체 숫자($n$)만큼 훑어가면서 부분 리스트를 만들고 이 리스트의 합을 Thissum으로 정의합니다. 그리고 이를 Maxsum과 비교해 더 큰 값을 Maxsum에 저장합니다. 이를 $i$와 $j$가 모두 $n=7$이 될 때까지 반복합니다. 이 방식의 의사코드는 다음과 같습니다.

Maxsum = 0
for (i=0; i < n; i++)
  {
    for (j=i; j < n; j++)
      {
        Thissum = sum(A[i:j])
      	Maxsum = max(Thissum, Maxsum)
      }
  }

이 방식의 계산복잡성은 $O(n^3)$이 됩니다. $i$와 관련된 반복문은 $n$번, $j$와 관련된 반복문은 최대 $n$번, Thissum을 구할 때 최대 $n$개의 요소를 계산해야 하기 때문입니다.

접근2

접근1보다 계산복잡성을 낮추는 방법은 Thissum을 구할 때 중복을 좀 피하는 것입니다. 예제 리스트와 그 방식을 나타낸 표는 다음과 같습니다.

4, -3, 5, -2, -1, 2, 6, -2

$i$ $j$ Thissum Maxsum
0 0 4 4
0 1 4+(-3) 4
0 2 1+5 6
0 3 6+(-2) 6
0
0 7 11+(-2) 11

표에서 접근1과의 차이가 느껴지실 지 모르겠습니다. 접근1에서는 Thissum을 구할 때 sum(A[i:j])을 취하여 매번 새로 구하다시피했습니다. 하지만 접근2에서는 직전 계산 결과를 재활용합니다. 예컨대 $i$가 0, $j$가 3일 경우 접근1에서는 4-3+5-2를 계산했다면, 접근2에서는 직전 계산결과인 6에 $j$번째 요소인 -2를 더해 Thissum을 구합니다. 의사코드는 다음과 같습니다.

Maxsum = 0
for (i=0; i < n; i++)
  {
    for (j=i; j < n; j++)
      {
        Thissum = sum(A[i:j])
      	Maxsum = max(Thissum, Maxsum)
      }
  }

이 방식의 계산복잡성은 $O(n^2)$이 됩니다. $i$와 관련된 반복문은 $n$번, $j$와 관련된 반복문은 최대 $n$번, Thissum을 구할 때는 $O(1)$의 계산만 하면 되기 때문입니다.

접근3

접근3은 분할정복(divide-and-conquer)을 활용한 방식입니다. 분할정복이란 원 문제를 작은 부분문제로 나눠 푼 뒤 그 결과를 합쳐서 문제를 해결하는 알고리즘의 한 종류입니다. 접근3은 분석 대상 리스트를 절반씩 두 부분으로 나눕니다. 다시 예제 리스트를 보겠습니다.

4, -3, 5, -2, -1, 2, 6, -2

위 리스트를 두 부분으로 나누면 [4, -3, 5, -2], [-1, 2, 6, -2]가 됩니다. 왼쪽 리스트의 최대 부분합은 6(4-3+5), 오른쪽 리스트의 최대 부분합은 8(2+6)이 됩니다.

그런데 고려해야 하는 경우의 수가 이것만 있는 것은 아닙니다. 예컨대 [5, -2, -1]처럼 자른 곳(-2와 -1 사이)를 포함하는 부분 리스트도 얼마든지 존재할 수 있기 때문입니다.

중간에 존재하는 케이스의 경우 1)왼쪽 리스트의 마지막 요소(left ending)를 끝으로 하는 부분 리스트의 최대 부분합 2)오른쪽 리스트의 첫 요소(right starting)를 시작으로 하는 부분 리스트의 최대 부분합을 각각 구해 이를 더하면 구할 수 있을 것입니다.

1)에 해당하는 수는 4(-2+5-3+4), 2)는 7(-1+2+6)이므로 중간 케이스의 최대 부분합은 11이 됩니다. 결과적으로는 8, 6, 11 가운데 최대값을 취한 것이 접근3의 결과물이 되겠습니다. 접근3의 의사코드는 다음과 같습니다. left와 right는 각각 고려 대상 리스트의 왼쪽 끝, 오른쪽 끝의 인덱스입니다.

Maxsubsum(A[], left, right)
  {
  	// 종료 조건
    if (left == right)
      {
        maxsum = max(A[left], A[right])
        return maxsum
      }
  	// divide&conquer
  	Center = (left+right)/2
    // [1] 왼쪽
    maxleftsum = Maxsubsum(A[], left, center)
    // [2] 오른쪽
    maxrightsum = Maxsubsum(A[], center+1, right)
    // [3] 중간
    maxleftbordersum = 0
    leftbordersum = 0
    // 1) left ending을 끝으로 하는 부분 리스트의 최대 부분합
    for (i=center; i>=left; i--)
      {
        leftbordersum += A[i]
        maxleftbordersum = max(maxleftbordersum, leftbordersum)
      }
    // 2) right starting을 시작으로 하는 부분 리스트의 최대 부분합
    for (i=center+1; i<=right; i++)
      {
        rightbordersum += A[i]
        maxrightbordersum = max(maxrightbordersum, rightbordersum)
      }
  	// [1], [2], [3] 가운데 최댓값을 취함
  	return (max(maxleftsum, maxrightsum, maxleftbordersum+maxrightbordersum))
  }

그럼 이 코드가 어떻게 작동하는지 예제 리스트를 기준으로 설명해보겠습니다. 다음 그림과 같습니다.

우선 예제 리스트를 $A$, left는 0, right는 7로 정의해 Maxsubsum 함수에 넣어 실행합니다. 종료조건(0≠7)을 만족시키지 못했으므로 $A$를 반으로 나눠 Maxsubsum 함수를 다시 호출합니다. 두 개 리스트 가운데 왼쪽 [4, -3, 5, -2] 또한 종료조건(0≠3)을 만족시키지 못했으므로 이를 다시 반으로 나눠 Maxsubsum 함수를 다시 호출합니다. 나눠진 왼쪽 리스트인 [4, -3] 또한 종료조건(0≠1)을 만족시키지 못했으므로 이를 다시 반으로 나눠 Maxsubsum 함수를 다시 호출합니다.

[4]가 되어서야 비로소 종료조건(0=0)을 만족하므로 4를 반환합니다. 마찬가지로 [-3]은 -3이 반환될 겁니다.

이번엔 [4, -3]을 볼 차례입니다. 왼쪽 [4]의 최대 부분합은 4, 오른쪽 [-3]은 -3, 중간 최대 부분합은 1입니다. 이 가운데 최댓값 4가 [4,-3]의 결과로 반환됩니다. 동일한 과정을 거쳐 [5, -2]는 5가 반환됩니다.

이번엔 [4, -3, 5, -2]를 볼 차례입니다. 왼쪽 [4, -3]의 최대 부분합은 4, 오른쪽 [5, -2]는 5, 중간 최대 부분합은 6입니다. 이 가운데 최댓값 6이 [4, -3, 5, -2]의 결과로 반환됩니다. 동일한 과정을 거쳐 [-1, 2, 6, -2]는 8이 반환됩니다.

마지막으로 전체 리스트를 고려할 차례입니다. 왼쪽 [4, -3, 5, -2]의 최댓값은 6, 오른쪽 [-1, 2, 6, 2]는 8이며 중간의 최댓값은 11이므로 전체 최댓값을 11이 됩니다.

접근3의 계산복잡성을 따져보겠습니다. 리스트의 요소 수가 $n$이라 할 때 이를 절반씩 나눠 재귀함수를 다시 호출하고, 중간 결과를 계산할 때 $n$개 요소 전체에 대해 따져보게 되므로 다음과 같은 식이 성립합니다. ($c$는 컴퓨터 파워 등에 영향을 받는 상수값)

여기에서 $n/2^i$가 1이 될 때까지 반복해야 하므로 로그의 정의에 따라 $i$는 $\log_2n$이 됩니다. 식은 다음과 같이 다시 쓸 수 있습니다.

접근4

접근4는 부분 합이 음수가 될 경우 그 값은 논리적으로 최대값이 될 수 없다는 점에 착안해 계산량을 확 줄인 방법입니다. 복잡하고 현란한 기법을 쓰는 것보다 문제를 잘 이해하고 정의하는 것이 해결의 첫걸음이라는 교훈을 줍니다. 의사코드는 다음과 같습니다.

summax = 0
sum = 0
for i from 0 to n-1
{
  sum = sum + a[i]
  if sum < 0 then sum = 0
  if summax < sum then summax = sum
}

접근4의 계산복잡도는 $i$에 대해 반복 횟수가 $n$이고, 1회당 연산은 $O(1)$이므로 전체적으로는 $O(n)$이 됩니다.

한국어의 인용 표현

|

이번 글에서는 한국어의 인용 표현에 대해 살펴보도록 하겠습니다. 이번 글은 고려대 정연주 선생님 강의와 ‘한국어문법총론1(구본관 외 지음, 집문당 펴냄)’을 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.

인용절이란

남의 말이나 글, 말하는 사람의 생각, 판단 등을 나타내는 주술관계가 있는 절을 인용절이라고 합니다. 인용절에는 직접인용절간접인용절 둘로 나뉩니다.

직접인용절

본래의 언어형식을 바꾸지 않고 그대로 표현하려는 인용절을 직접인용절이라고 합니다. 대개 ‘-(이)라고’, ‘-하고’로 표시됩니다. 다음 예문과 같습니다.

어떤 사람이 “동사무소가 어디입니까?”라고 물었다.

나는 속으로 ‘이건 너무 어려워’라고 되뇌었다.

진이가 “얘들아, 어서 돌아와!”하고 소리쳤다.

간접인용절

본래의 언어 형식을 화자의 관점에 따라 내용 중심으로 바꾸어 표현하는 인용절을 가리킵니다. 다음과 같습니다.

나는 진이의 말이 옳다가 생각했다.

나는 진이에게 학교에 갈 거냐고 물었다.

의사가 환자에게 담배를 끊으라고 충고했다.

진이가 공원에 놀러 가자고 했다.

예시에서도 알 수 있듯 간접인용절은 화자의 현재 관점에서 기술되는 것이기 때문에 본래 발화로부터 인칭 대명사나 시간 표현, 지시 표현이 달라질 수 있습니다.

직접인용 간접인용
진이는 “가 직접 그 사람을 만나고 싶어.”라고 말했다. 진이는 자기가 직접 그 사람을 만나고 싶다고 말했다.
나는 어제 진이에게 “내일 갈 거니?”하고 물었다. 나는 어제 진이에게 오늘 갈 거냐고 물었다.
미국에 간 진이는 “이곳이 맘에 들어”라고 했다. 미국에 간 진이는 그곳이 맘에 든다고 했다.

또한, 간접인용절로 내포될 경우 상대경어법은 별로 중요하지 않은 요소가 됩니다. 아래처럼 단지 문장의 종류에 따라서만 어미 선택이 달라집니다.

문장 종류 어미 예문
평서문 -다고, -(이)라고 나는 진이의 말이 옳다고 생각했다. 나는 진이가 천재라고 생각했다.
의문문 -냐고 나는 진이에게 학교에 갈 거냐고 물었다.
명령문 -라고 의사가 환자에게 담배를 끊으라고 충고했다.
청유문 -자고 진이가 공원에 놀러 가자고 했다.

‘생각의 인용’과 ‘간접 인용’

영문법의 영향인지 화자가 직접 말하는 것은 직접 인용, 말로 내뱉지 않고 생각만 하는 것을 간접 인용, 이렇게 구분하는 경향이 있습니다. 물론 한국어에서도 머릿속에 있는 생각을 인용할 때에는 다음과 같이 간접인용을 하는 것이 더 자연스럽습니다.

우리는 선생님께서 건강을 곧 회복하실 것이라고 생각했다.

하지만 한국어에서는 밖으로 나온 말이나 글을 직접 인용하는 경우도 있고 간접 인용을 하는 경우도 있습니다. 또한 구어에서는 생각이라고 하더라도 직접 인용을 하는 경우도 적지 않습니다. 다음과 같습니다.

우리는 ‘선생님께서 건강을 곧 회복하시겠구나.’라고 생각했어요.

한국어의 이중주어문

|

이번 글에서는 한국어의 이중주어문에 대해 살펴보도록 하겠습니다. 이번 글은 고려대 정연주 선생님 강의와 ‘한국어문법총론1(구본관 외 지음, 집문당 펴냄)’을 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.

현상 관찰

한국어에는 한 문장에 주격 명사구가 두 번 나타나서 주어가 두 번 실현되는 것처럼 보이는 문장이 흔하다고 합니다. 예를 들어보겠습니다.

(1) 토끼가 앞발이 짧다.

(2) 이 집안이 딸이 귀하다.

(3) 진이가 의사가 되었다.

(4) 진이가 의사가 아니다.

(5) 학생이 세 명이 왔다.

위 예시 문장을 세 가지 유형으로 나누어 살펴보도록 하겠습니다.

1유형

다음 예시는 두번째 명사구만 서술어와 관련되고, 첫째 명사구는 둘째 명사구와 관계를 지니는 경우입니다.

(1) 토끼가 앞발이 짧다.

(2) 이 집안이 딸이 귀하다.

(1)에서 ‘짧다’라는 서술어는 ‘앞발이’라는 명사구와만 관계를 가집니다. (‘토끼가 짧다’는 의미상 성립하지 않습니다.) 그런데 토끼는 앞발보다 넓은 범위를 포괄하는 개념으로 ‘대(大)-소(小)’의 의미관계를 보입니다.

(2)에서 ‘귀하다’라는 서술어는 ‘딸이’라는 명사구와만 관계를 가집니다. ‘집안’은 ‘딸’이 사는 장소를 가리키며, 첫째 명사구가 의미상 장소, 방향 등의 관계를 나타냅니다.

1유형과 관련해 국어학계에 다양한 견해가 존재합니다.

우선 둘 모두 주어로 보는 입장입니다. 이 견해에 따르면 (1), (2) 예시는 주어가 2개이고 서술어가 하나인 단문에 해당합니다. 그러나 주어 사이의 관계를 명쾌하게 설명하지 못한다는 단점이 있습니다.

주제-평언 구조로 보는 입장도 있습니다. 이 견해에 따르면 앞의 명사구를 주제, 뒤의 명사구를 그 주제에 대한 설명을 나타내는 문장의 주어로 봅니다. 따라서 위 예시를 [주제 + [주어 + 서술어]] 구조로 분석할 수 있습니다. 그러나 이 견해는 문장 분석시 정보구조통사구조 개념이 혼재돼 있다는 단점이 있습니다. 정보구조와 주제와 관련해서는 이곳을 참고하시면 좋을 것 같습니다.

마지막으로 서술절을 가진 안은 문장으로 보는 입장입니다. 학교문법이 이 견해를 채택하고 있습니다. 이 견해에 따르면 (1)의 ‘앞발이 짧다’는 주어와 서술어를 가지는 절이면서, 동시에 선행하는 주어 명사구 ‘토끼가’를 서술해주는 서술절로 쓰였다고 분석할 수 있습니다. 즉 [토끼가 [앞발이 짧다]]의 구조를 가진 것으로 보는 것입니다. 마찬가지로 (2)에서 전체 문장의 주어는 ‘이 집안이’이고, 그것의 서술어는 ‘딸이 귀하다’라는 절 형식입니다. ‘딸이 귀하다’에서의 주어는 ‘딸이’이고, 서술어는 ‘귀하다’입니다.

2유형

2유형은 서술어 자체가 두 개의 논항(서술어가 요구하는 필수성분)을 요구하여 두 명사구가 실현되며, 그 두 명사구가 서로 다른 의미역(명사구 논항이 서술어와 관련하여 지니는 의미 기능)을 갖는 경우를 가리킵니다. 논항과 관련해서는 이곳을, 의미역과 관련해서는 이곳을 참고하시면 좋을 것 같습니다.

(3) 진이가 의사가 되었다.

(4) 진이가 의사가 아니다.

(3)에서 ‘되다’라는 서술어는 행위주역(Agent)결과상태역(Resultant State)을 요구합니다. 각각 ‘진이’, ‘의사’가 여기에 해당합니다. 다시 말해 ‘되다’라는 서술어는 ‘진이가’와 관계를 가지며, ‘의사가’와도 관련을 맺고 있습니다.

(4)에서 ‘아니다’라는 서술어 또한 서로 다른 의미역의 두 개 논항을 요구합니다. ‘아니다’라는 서술어는 ‘진이가’, ‘의사가’ 모두 관련을 맺고 있습니다.

3유형

3유형은 2유형처럼 첫번째, 두번째 명사구 모두 서술어와 관련을 맺고 있지만, 첫째 명사구와 둘째 명사구의 의미역이 동일해보이는 경우입니다.

(5) 학생이 세 명이 왔다.

(5)에서 ‘학생이’와 ‘세 명이’가 둘 다 행위주역으로서 동사 ‘오-‘와 관련되는 것으로 보입니다.

이진탐색(binary search)

|

이번 글에서는 이진탐색(binary search) 알고리즘에 대해 살펴보도록 하겠습니다. 이 글은 고려대 김황남 교수님 강의를 정리하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.

개요

이진탐색 알고리즘이란 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘입니다. 알고리즘 특성상 정렬된 리스트에만 사용할 수 있다는 단점이 있지만, 검색이 반복될 때마다 탐색 대상 데이터 수는 직전의 절반이 되므로 속도가 빠르다는 장점이 있습니다.

이진탐색 알고리즘을 직관적으로 나타낸 그림은 다음과 같습니다(그림 출처 : 영문 위키). 아래와 같이 17개 요소로 이뤄진 리스트에서 7의 위치를 찾는 이진탐색 알고리즘은 화살표 방향처럼 수행이 됩니다.

수행방식

위 그림 예시 기준으로 이진탐색 알고리즘 수행방식을 살펴보겠습니다. 우선 리스트의 중앙을 찾습니다. 요소가 17개이므로 중앙값은 여덟번째(리스트 요소가 $n$개라면 $n/2$를 내림한 값)에 있는 요소(14)가 됩니다. 이 중앙값과 찾고자 하는 값(7)의 크기를 비교합니다. 여기서 찾고자 하는 값이 중앙값보다 작으므로 중앙값보다 큰 값(18, 19, 21, 24, 37, 40, 45, 71)들은 탐색 대상에서 제외합니다.

이번엔 [1, 3, 4, 6, 7, 8, 10, 13, 14]를 새로운 리스트로 보고 같은 작업을 반복 수행합니다. 리스트 중앙을 찾습니다. 새로운 리스트의 요소가 9개이므로 중앙값은 새로운 리스트의 네번째 요소(원래 리스트의 네번째 요소)이며 그 값은 6이 됩니다. 이 중앙값과 찾고자 하는 값(7)의 크기를 비교합니다. 여기서 찾고자 하는 값이 중앙값보다 크므로 중앙값보다 작은 값(1, 3, 4)들은 탐색 대상에서 제외합니다.

이번엔 [6, 7, 8, 10, 13, 14]를 새로운 리스트로 보고 같은 작업을 반복 수행합니다. 리스트 중앙을 찾습니다. 새로운 리스트의 요소가 6개이므로 중앙값은 새로운 리스트의 세번째 요소(원래 리스트의 여섯번째 요소)이며 그 값은 8이 됩니다. 이 중앙값과 찾고자 하는 값(8)의 크기를 비교합니다. 여기서 찾고자 하는 값이 중앙값보다 작으므로 중앙값보다 큰 값(10, 13, 14)들은 탐색 대상에서 제외합니다.

이번엔 [6, 7, 8]을 새로운 리스트로 보고 같은 작업을 반복 수행합니다. 리스트 중앙을 찾습니다. 새로운 리스트의 요소가 3개이므로 중앙값은 새로운 리스트의 두번째 요소(원래 리스트의 다섯번째 요소)이며 그 값은 7이 됩니다. 이 중앙값과 찾고자 하는 값(7)의 크기를 비교합니다. 같으므로 이 중앙값의 위치(원래 리스트의 다섯번째)를 최종 산출물로 반환합니다.

의사코드

이진탐색 알고리즘의 의사코드(pseudo code)는 다음과 같습니다. 아래 코드에서 num은 찾고자 하는 값, A는 주어진 정렬된 리스트, left는 리스트의 왼쪽 끝 인덱스, right는 오른쪽 끝 인덱스를 의미합니다.

Binary_Search(num, A[], left, right)
{
  if (left == right)
  {
    if (A[left] == num)
    {
      return(left) and exit;
    }
    else
    {
      conclude NOT PRESENT and exit;
    }
  }
  center = (left + right)/2
  if (A[center] < num)
    {
      Binary_search(num, A[], center+1, right)
    }
  if (A[center] > num)
    {
      Binary_search(num, A[], left, center)
    }
  if (A[center] == num)
    {
      return(center) and exit;
    }
}

계산복잡도

이진탐색의 계산복잡도 $T(n)$을 따져봅시다. 의사코드를 보면 재귀적으로 자신을 호출하는 부분을 제외하면 상수배 복잡도를 가집니다. left와 right가 같은지, A[left]가 num과 같은지, A[center]가 num과 같은지 등을 따져보고 그 조건에 맞는 몇 가지 기본 연산을 수행하면 되기 때문입니다. 아울러 이진탐색이 반복될 때마다 고려 대상이 되는 리스트의 요소 수는 절반씩 줄어듭니다. 이를 식으로 나타내면 다음과 같습니다.

위 계산식에서 $\log_2n$이 도출되는 이유는 이렇습니다. 최악의 경우를 고려하면 $n/2^i$가 1이 될 때까지 이진탐색을 수행해야 합니다. $n/2^i=1$이므로 로그의 정의에 따라 $i=\log_2n$이 됩니다. big O 표기법에 관련해서는 이곳을 참고하시면 좋을 것 같습니다.

한국어의 부사절 내포

|

이번 글에서는 한국어의 부사절 내포에 대해 살펴보도록 하겠습니다. 이번 글은 고려대 정연주 선생님 강의와 ‘한국어문법총론1(구본관 외 지음, 집문당 펴냄)’을 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.

부사절 내포

부사절이란 부사 역할을 하는 절이 내포된 경우를 가리킵니다. 예문을 보겠습니다.

부사 부사절
빙수가 매우 차갑다. 빙수가 [이가 시리게] 차갑다.

주어+서술어 형태의 ‘절’처럼 보이진 않지만 다음과 같은 예문도 부사절 내포 구성이라고 볼 수 있습니다.

꽃$i$이 [$e_i$ 아름답게] 피었다.

위 예문은 (1) 꽃이 아름답다 (2) 꽃이 피었다 두 문장이 합쳐진 형태라고 볼 수 있습니다. 여기에서 ‘꽃이’가 공통 명사로 생략되었습니다. 내포절 ‘아름답게’가 문장 전체에서 부사 역할을 하므로 부사절이라고 볼 수 있습니다.

이 글에서는 한국어의 부사절 내포를 부사형 전성어미의 종류와 관련지어 설명하겠습니다.

개괄

부사형 전성어미와 그 문법적 기능을 정리한 표는 다음과 같습니다.

문법적 기능 부사형 전성어미
동시적 사건 -으면서, -으며
계기적 사건 -자, -자마자, -고(서), -어(서)
사건의 전환 -다가
이유, 원인 -어(서), -으니까, -느라고, -다가, -기에, -길래
조건, 가정 -으면, -거든, -어야
인정, 양보 -어도, -을지라도, -더라도, -어야, -은들, -을망정
목적 -으려고, -고자
배경 -는데, -으니

-게

부사형 전성어미 ‘-게’는 다음과 같이 쓰입니다.

의미 예문
성질, 상태, 방식 그는 [고독하게] 살았다.
결과적 한계 나는 [발에 피가 나게] 뛰었다.
목적 나는 [진이가 집중해서 공부할 수 있게] 방에서 나갔다.

-도록

부사형 전성어미 ‘-도록’은 다음과 같이 쓰입니다.

의미 예문
시간적 한계 나는 [밤이 새도록] 시험공부를 했다.
결과적 한계 나는 [발에 피가 나도록] 뛰었다.
목적 나는 [진이가 집중해서 공부할 수 있도록] 방에서 나갔다.

-게 vs -도록

‘-게’와 ‘-도록’은 결과적 한계, 목적 등 많은 면에서 그 의미가 유사합니다. 하지만 성질, 상태, 방식에 대해선 ‘-게’를, 시간적 한계에는 ‘-도록’을 씁니다.

그는 [{고독하게, *고독하도록}] 살았다.

나는 [밤이 {*새게, 새도록}] 시험공부를 했다.

-이, -을수록, -듯(이)

부사형 전성어미 ‘-이’는 결합하는 서술어가 ‘다르다, 같다, 없다’로 한정됩니다.

[미국과 달리] 한국 여성들은 결혼 후에도 본래의 성을 쓴다.

우리는 [돈 없이] 1주일을 더 견뎌야 한다.

아이가 [꽃과 같이] 예쁘다.

‘-을수록’은 점차 심해짐의 의미를 나타냅니다.

[날이 갈수록] 취업이 어려워지고 있습니다.

‘-듯(이)’는 유사한점을 비유적으로 표현할 때 씁니다. 앞 절의 내용이 뒤 절의 내용과 거의 같음을 나타냅니다.

나그네가 [달이 구름에 가듯(이)] 걸어간다.

-으면서, -으며

이들 어미는 동시에 발생하는 사건을 나타냅니다.

진이가 노래를 들으면서 밥을 먹는다.

-자/자마자 vs -고(서)/어(서)

이들 어미는 연이어서 나타나는 사건을 뜻하는 계기적 사건을 가리킵니다. 아래 (가)는 선행절이 나타내는 사건과 후행절의 사건이 거의 즉시 발생하는 경우를, (나)는 시간차가 있는 경우를 의미합니다.

진이가 학교에 가자/가자마자 친구들이 환호성을 질렀다. (즉시)

종이배를 접어서 시냇물에 띄웠다. (시간차)

-자마자 vs -자

‘-자마자’와 ‘-자’는 모두 앞 절의 동작이 이루어진 후 바로 뒤이어 다음 절의 사건이나 동작이 일어남을 나타냅니다. ‘-자마자’는 뒤 절에 명령문이나 청유문이 올 수 있고, 앞 절 주어와 뒤 절 주어가 같아도 되고 달라도 됩니다. 반면 ‘-자’는 뒤 절에 명령문이나 청유문이 올 수 없고, 앞 절 주어와 뒤 절 주어가 같을 때 제약이 있습니다.

-자마자 -자
회의가 끝나자마자 연락하세요. *회의가 끝나자 연락하세요.
나는 집에 오자마자 손을 씻었다. *나는 집에 오자 손을 씻었다.
내가 집에 도착하자마자 강아지가 달려 나왔다. 내가 집에 도착하자 강아지가 달려 나왔다.

-어서 vs -고서

‘-어서’와 ‘-고서’는 동사 뒤에 결합하여 행동의 시간적 순서를 나타냅니다. ‘-어서’의 경우 앞 절은 뒤 절의 조건이 되며 서로 밀접한 관계를 가집니다. 앞 절의 동작이 없이는 뒤 절이 이뤄질 수 없습니다. 반면 ‘-고서’는 끝점이 있는 타동사와 결합하여 앞 절 동작의 결과가 지속되면서 뒤 절의 내용이 진행될 때 사용할 수 있습니다. 예문을 보겠습니다.

(A) 숙제를 해서 오세요.

(B) 숙제를 하고서 오세요.

(A)는 숙제를 한 다음 그 숙제를 가지고 오라는 느낌이 약간 강합니다. (B)는 숙제를 마치고, 오라는 느낌이 있습니다. 다른 예문을 보겠습니다.

-어서 -고서
도서관에 가서 공부했어요. 진이는 친구를 만나고서 학교에 갔다.
돈을 모아서 여행을 했어요. *배가 고프고서 밥을 먹었다.
어제 책을 사서 읽었어요. 언니가 새 정장을 입고서 면접을 보러 나갔다.
*어제 책을 사서 친구를 만났어요. 배를 타고서 제주도에 갔어요.

-다가

‘-다가’는 선행절이 중단되고 다른 상황이 이어짐, 즉 사건의 전환을 나타냅니다. 다음 예문과 같습니다.

진이가 운동을 하다가 쓰러졌다.

앞 절의 행동이 계속되면서 추가로 뒤 절의 행동이 일어나는 경우에도 사용할 수 있습니다.

잠을 자다가 무서운 꿈을 꿨어요.

-어(서)

필연적인 인과관계가 있을 때 ‘-어(서)’를 쓰면 자연스럽습니다. 따라서 일반적인 자연의 현상이나 사물의 변화로 발생한 결과를 설명할 때 ‘-어서’를 주로 사용합니다. 예문을 보겠습니다.

비행기가 추락해서 사람들이 많이 죽었다.

비가 많이 내려서 홍수가 났다.

진이가 아들만 셋을 ?낳아서 이번에는 딸을 낳을거야.

마지막 문장은 조금 부자연스럽습니다. 아들 셋을 낳은 사실과 딸을 낳을 거라는 추측에 필연적인 인과관계가 있지 않기 때문인듯합니다. 다음 예문처럼 ‘-어(서)’ 앞에 오는 말은 새로운 정보(주제)인 경향이 있습니다.

Q: 어머니가 걱정을 하시지?

A: 진이가 아파서 걱정을 하셔.

‘-어(서)’ 뒤 절에는 청유문과 명령문을 사용할 수 없습니다.

*시간이 없어서 서두르세요.

*시간이 없어서 서두릅시다.

-으니까

화자 나름의 주관적인 이유를 제시할 때나, 주관적인 추론의 전제를 제시할 때 ‘-으니까’가 주로 쓰입니다. 다음 예문과 같습니다.

집에서 책만 읽으니까 친구가 없지.

진이가 아들만 셋을 낳았으니까 이번에는 딸을 낳을거야.

대문 앞에 신문이 쌓여 있으니까 집 안에 사람이 없는 게 틀림없어.

위 예문에서 두번째, 세번째 문장에 ‘-어(서)’를 넣어서 비교해보면 그 뉘앙스 차이를 느낄 수 있습니다. 다시 말해 아들 낳은 사실, 대문 앞에 신문이 쌓여있는 사실은 각각 딸을 낳는 것과 집안에 사람이 없다는 사실과 직접적인 관련이 없습니다.

‘-으니까’ 뒤에 오는 말이 새로운 정보인 경우가 많습니다.

Q: 장마 기간인데 물가가 어때?

A: 장마 기간이 되니까 채소 값이 올랐어.

-어(서) vs -으니까

아래 예문에서 ‘피곤해서’와 ‘피곤하니까’의 뉘앙스 차이에 주목해 봅시다.

A: 나 오늘 일찍 퇴근해야겠어.

B: 왜?

A1: 피곤해서.

A2: 피곤하니까.

‘피곤하니까’는 ‘피곤해서’에 비해 약간 짜증스러움이 묻어난다는 게 느껴집니다. 다시 말해 ‘당신도 내가 피곤하다는 사실을 이미 알고 있으면서 왜 굳이 다시 물어보느냐’라는 어감이 나타난다는 것입니다. 이는 ‘-어(서)’와 ‘-으니까’ 앞에 오는 말이 각각 신정보, 구정보에 해당하기 때문이라고 설명을 할 수 있겠습니다. 다음 예문에서 (2)가 비문이 되는 이유도 이의 연장선상에 있습니다.

(1) 배가 아파서 어제 결석했습니다.

(2) 배가 *아프니까 어제 결석했습니다.

앞에 어떤 이유를 제시하고 그로 인해 뒤따르는 새로운 상황을 명령문이나 청유문의 형태로 제시할 때는 ‘-으니까’만이 쓰입니다.

아기가 {자니까, *자서} 조용히 해라.

-으면

앞 말이 조건, 가정일 때 ‘-으면’을 씁니다. 뒤 절 문장 유형에 제약이 없습니다.

내일 날씨가 화창하면 소풍을 {갑니다., 갑니까? 갑시다., 가십시오.}

-거든

앞 말이 조건, 가정이면서 전체 문장이 명령문, 청유문일 때 대개 ‘-거든’이 쓰입니다.

가는 길에 진이 만나거든 전화 좀 하라고 해.

손님이 오시거든 먹겠니?

*호랑이도 제 말을 하거든 온다.

-어야

앞의 내용이 조건, 가정이면서 뒤에 오는 내용의 필수 조건임을 나타냅니다. 명령문, 청유문에서는 쓰일 수 없습니다.

윗물이 맑아야 아랫물이 맑다.

*비가 와야 우산을 가지고 가라. (명령문)

*호랑이를 만나야 혼내주겠다. (필수 조건 아님)

-어도, -을지라도, -더라도, -어야, -은들, -을망정

‘-어도’, ‘-을지라도’, ‘-더라도’, ‘-어야’, ‘-은들’, ‘-을망정’은 내포절을 양보의 기능을 하도록 만드는 부사형 전성어미입니다. 양보란 종속절의 사태로 인하여 논리적으로 도출되는 사태가 주절에 이어지는 것이 아니라, 일반적으로 예상되는 것과는 반대되는 결과가 주절에 이어지는 걸 말합니다. 다음 예문과 같습니다.

(가) 아무리 바쁘더라도 차 한잔 마실 시간은 있다.

(나) 비가 와도 여행을 갈 거야.

(가)의 경우 종속절의 사태로 논리적으로 도출되는 사태는 ‘아주 바쁘면 차 한잔 마실 시간도 없다’가 됩니다. 하지만 이와 반대되는 내용이 주절에 언급이 되면서 ‘-더라도’가 쓰였습니다. 마찬가지로 (나)에선 ‘비가 오면 여행을 가지 않는다’가 예상됐는데 여행을 간다고 언급이 되면서 ‘-어도’가 쓰였습니다.

-으려고

앞의 내용이 목적이면서 앞 절과 뒤 절에 오는 동사에 제약이 없습니다.

진이는 머리를 자르려고 미용실을 예약했다.

하지만 뒤 절에 청유문과 명령문이 올 수 없습니다.

*고기를 잡으려고 바다로 가자.

-고자

앞의 내용이 목적이면서 주로 격식을 갖춘 말이나 공식적인 장소에서의 대화, 글에서 많이 사용되는 부사형 전성어미입니다.

이 논문에서는 한국어의 중국어의 부정법을 대조하고자 한다.

-으러

앞의 내용이 목적이면서 선행절의 서술어가 동작동사이고 후행절의 서술어가 이동동사일 때만 쓸 수 있습니다.

진이는 머리를 자르러 미용실에 갔다.

*예뻐지러 미용실에 갔다.

*지이는 나를 안 만나러 서울로 갔다.

*파마를 하러 미용실을 예약했다.

명령문과 청유문에서 쓰일 수 있습니다.

고기를 {잡으러/*잡으려고/*잡고자} 바다로 가자.

-는데, -으니

‘-는데’와 ‘-으니’는 앞 절이 뒤 절의 배경이나 상황일 때 씁니다.

집에 가는데 소나기가 내렸다.

서울역에 가 보니 사람이 정말 많았다.