헌법재판소의 만장일치 인용 결정은 예상대로였다. 탄핵소추안의 많은 부분이 탄핵의 요건이 될 수 없다는 설명으로 시작했지만 가장 마지막, 국정농단에 의한 국민주권주의 위배에 대해 엄정한 판단을 내린 것이다. 뿐만 아니라 이후의 대통령의 대응이 거짓(정규재 TV 인터뷰 등)과 불통(압수수색과 검찰 및 특검 조사 거부)으로 일관하고 있어 헌법을 수호할 의지가 없음을 정확하게 지적한 것이다. 재판관의 보수, 진보 성향은 아무런 의미가 없었다. 보수와 진보는 모두 헌법적 가치 아래에서 의미 있는 것이다. 헌법을 유린하는 것은 그 둘의 아무것에도 속하지 않는다.

박근혜 정부는 시작부터 헌법을 유린해왔다. 대통령 선거부터 이른바 셀프 감금사건으로 불리는 국정원 여론조작 사건이 있었고, 당시 국정원장은 아직까지도 재판 중에 있다. 시작부터 헌법적 근본을 의심받은 것이다. 이후 서울시 공무원 간첩조작 사건으로 다시 한 번 국민을 유린했다. 세월호 참사와 메르스 사태에 대해서는 방관자적 태도를 보였다. 참사 당시 청와대는 컨트롤 타워가 아니다라는 유명한 말은 이 정부의 태도를 명확하게 보여준다. 헌재는 탄핵 심판에서 이 정부가 생명권 보호 의무를 져버리지 않았다고 판단한 것이 아니라, 성실성이라는 추상적 개념이 탄핵 요건에 해당하지 않는다고 판단한 것일 뿐이다(일부 재판관은 성실한 직책 수행 의무를 다하지 않았다고 판단 했으나 이는 대통령을 파면할 만큼 중대한 위법 행위는 아니라고 보충 의견을 제시했다). 이후에도 끊임없는 위헌 행위를 자행해왔다. 국정원은 해킹프로그램을 이용하여 내국인을 사찰했다는 의혹, 시대를 역행하는 국정 교과서 강행, 그리고 블랙리스트와 국정농단 까지.

위와 같은 사건은 박근혜 전 대통령이 헌법에 대해 어떤 시각을 가지고 있는지 명백하게 보여준다. 사실 이것은 4년전 우리가 예견했던 일이다. 그가 이미 독재자인 박정희의 딸이며, 그 이후에도 박정희를 위시하는 세력에 비호를 받으며 우리나라 제 1당의 지도자로 영도 되었던 것이다. 그의 능력이나 민주주의에 대한 철학으로 지지를 받은 것이 아니라 단지 박정희라는 그의 핏줄이 주는 후광으로 지지를 받은 것이다. 이게 진정한 패권주의. 단지 박정희라는 이름의 권력으로 모든 것을 정당화 한 것이다. 친박 패권주의의 행패는 지난 총선에서 극에 달했다. 새누리당의 공천과정에서 단지 친박이라는 이유 하나만으로 공천과정을 방해했고, 그 결과 다수의 친박 세력이 당을 장악했다. 그리고 국민은 엄정한 심판을 내렸다. 새누리당은 총선에서 원내 제 2당으로 밀려날 수준으로 참패한 것이다.

이러한 패권주의에 갇혀 박근혜 전 대통령은 유신적 사고(思考)에 머물러 있었던 것이다. 국민의 주권은 대통령의 권한 밑에 있다는 사고가 짙게 깔려있는 것이다. ‘박정희는 쿠데타로서 국민 주권과 상관 없이 권력을 장악했던 인물이기에 이러한 사고가 있었을 수도 있다. 허나 박근혜 전 대통령은 국민의 투표로 당선된 대통령이었다. 국민의 주권이 있었기에 당선 되었음에도 이러한 시각을 가지고 있다는 것은 그가 얼마나 시대착오적 인물인지 적나라하게 드러낸다. 유신적 사고에 머물러 있던 박근혜 전 대통령으로서는 모든 위헌적 행동이 자신에게는 선의였을 것이다. 애초에 사고 자체가 민주주의적이지 않은 생각에 기반한 선의였던 것이다. 안 지사의 말대로 이러한 탄핵 사태가 의도와 상관없이 결과가 문제였기 때문에라고 말할 수도 있지만, 애초에 박근혜 전 대통령은 사고 자체가 문제였다. 유신 독재자의 딸은 결국 민주적 절차에 의해서 역사적 심판을 받았다.

친박 패권주의에 경도된 사람들의 행동에도 이와 같은 시대착오적 사고가 나타난다. 태극기 집회의 정체성만 봐도 그러하다. 대통령을 지키는 것 만이 애국인 듯 착각하며 태극기를 흔드는 모습을 보며, 스스로 국민 주권을 인정하지 않는 모습에 한숨이 나올 뿐이다. 대통령은 잘못한 것이 없는데, 순수한 선의로 행동했을 뿐인데 하는 말은 진심이었을 것이다. 물론 위에서 말 한대로 유신적 사고 아래서 말이다. 사실을 왜곡하고, 폭력을 정당화하며, 스스로를 선동하는 모습이 유신적 사고, 그리고 지난 보수정권에서 창궐했던 일베적 사고이고 곧 친박 패권주의의 민낯이다.

헌법재판소의 판결로 드디어 친박정희 패권주의를 물리칠 시대가 왔다. 국민의 주권이 확고히 인정받는 진정한 민주주의 혁명이라 말할 수 있다. 민주화 이후에도 잔재하던 유신 잔재 세력을 말끔히 소탕할 기회가 온 것이다. 이제 대한민국의 역사적 흐름에 걸맞은 새로운 정권이 탄생해야 한다. 국민의 주권을 우선하고, 대한민국의 국익을 무엇보다 우선하는 제대로 된 정권을 간절히 바라는 바이다.

우연히 네이버 연예 기사를 통해 이와이 슌지 감독의 영화가 인터넷으로 개봉했다는 사실을 알게되었습니다. 촬영기간은 3일, 재밌게도 한국을 배경으로 배두나씨와 김주혁씨를 캐스팅 했더군요.


이와이 슌지 감독의 영화는 항상 챙겨보는 편입니다. 처음 그의 영화를 본 건 중학생때 일겁니다, 아마도. SBS에서 방영했었던 '러브레터'를 아주 푹 빠져 봤었던 기억이 납니다. 보통 영화관도 아니고 TV로 영화를 봤던 경험이 머릿속에 오래 기억되긴 쉽지 않은 일입니다. 하지만 그 '러브레터'를 아주 빠져들어서 봤다는 기억은 생생합니다. 가족들이 모두 거실에서 나란히 누워 자고 있고, 고요한 한 밤 중 그 옆에 저만 홀로 깨어 구식 브라운관 TV를 유심히 뚫어져라 보고 있는 장면이 사진처럼 머리에 남아있거든요. 가족들이 각자 방도 아니고 거실에 누워서 잤던걸 보니 이사온지 얼마 안된듯 합니다. 샷시도 없고, 새로산 침대도 아직 안들어와서 거실에 함께 누워 잤으니까요. 중학교 2학년때 이 집으로 이사왔으니 시기에 대한 기억은 확실할 겁니다, 아마도.

재밌는건 그때 '러브레터'를 본건 확실히 기억나는데 내용은 전혀 기억이 안난다는 겁니다. 확실히 전혀 졸지 않고 정말 재밌게 봤다는 기분은 나는데요. 이와이 슌지 특유의 아름다운 화면과 서정적인 음악이 계절적 분위기와 어울려 한 밤 중의 감성을 자극하지 않았나 생각해봅니다. 한창 사춘기였기에 그 감정은 더 풍부하게 다가왔을 지도요. 여튼 내용도 제대로 기억 안나는데도 아주 특별하고 긍정적인 기억으로 남아있습니다. 영화를 좋아하게 된 여러 계기중 하나의 사례로 꼽을수도 있겠네요.


본격적으로 그의 작품을 보게된 건 대학이후입니다. 그 때의 '러브레터'에 대한 내용이 무엇이었을까 하는 궁금증에 늦가을 즈음 날씨가 쌀쌀함을 넘어 추워질 무렵 대학 기숙사에서 혼자 봤었습니다. 아직 더위가 가시지도 않았는데 눈내리는 배경의 영화를 보기엔 뭔가 이상하니까요. 그리고 이후 그

의 주요 작품들은 거의 봤습니다. 하나와 앨리스, 4월 이야기, 스왈로우테일 버터플라이, 릴리슈슈의 모든것, 립반윙클의 신부까지.

그의 작품은 완전히 밝거나 혹은 어둡거나 둘 중 하나로 나뉘는 경우가 있는데 전 밝은쪽의 이야기를 더 좋아합니다. 밝은 영화에서 특히 이와이 슌지의 미적감각이 더 풍부하게 살아나는것 처럼 보이기 때문이죠. 특히 그의 영화에서 '따뜻한 빛'의 사용은 정말 포근하고 아늑한 느낌마저 주곤합니다.


4월 이야기



러브레터


소설을 보는 듯한 느낌도 좋습니다. 전형적인 기승전결의 영화지만 식상하지 않고, 자연스럽게 감정이 고조되는 그 부드러움 또한 좋습니다. 콕 집어 말하긴 어렵지만 그의 영화에선 일상의 복잡한 마음이 진정되고 감정이 해소되는 경험을 하게됩니다. 그래서 그의 영화는 챙겨보려 하는 편입니다.




'장옥의 편지'는 유투브의 '네슬레 시어터'라는 채널을 통해 개봉되었습니다. 아마도 커피를 만드는 네슬레 사에서 후원하는 채널이겠지요. 일본인을 주로 타겟으로 하는 채널로 보이는데 한국을 배경으로 한 영화를 만든것 부터 어떤 의미를 담고 있을지 사뭇 궁금해졌습니다.



영화는 15분에서 20분 가량의 4개의 이야기로 나눠져 있습니다. 내용은 한국의 며느리, 아내, 어머니로 살아가는 것에 대해 이야기를 하고자 하는 것 같습니다. 일본 또한 가부장적인 문화를 가진 사회임에도 한국을 배경으로 한 것은, 한국과 일본의 동질감과 국가적 경계를 넘어 해결해야 할 공동의 문제를 일본인들에게 이야기 하고자 하는게 아닐까 싶습니다. '장옥의 편지'는 극중에서도 등장하는 소재지만, 극 밖으로 나와 한국에서 일본으로 전하는 편지이기도 하지 않을까 생각해봅니다. 아마도 이러한 내용으로요.

"한국에서도 여성들은 힘든 삶을 살고 있습니다. 시어머니의 소유물이 되고, 남편의 소유물이 되는 것 말이지요. 커피 한 잔의 여유라도 갖는 꿈을 꾸었지만, 현실은 그러한 여성적 삶을 포기하고 며느리가 되고 아내가 되어라 합니다. 하지만 차츰 변하고 있어요. 가부장적인 사회는 점차 자기 반성을 통해 천천히 바뀌어 나가고 있습니다. 아직 직접적으로 사과의 말을 하지 못하고, 여성을 위한 도움이 아직 미숙하지만 그래도 차츰 더 바뀌어 나가겠지요. 일본은 어떠하신지요?"

사회적 이슈를 이야기하지만 그 것을 분노와 슬픔의 감정으로 연결시키기 보다는 희망과 즐거움으로 연결할 수 있음에 다시 한 번 고마움을 느낍니다. 비록 짧은 영화였지만 이와이 슌지만의 서정적인 메시지와 그만의 영상을 느낀 즐거운 한 시간이었습니다. 조만간 또 그의 영화를 볼 수 있길 간절히 바래봅니다.


장옥의 편지: https://www.youtube.com/watch?v=nzNl9MJjUMU&list=PLA_eLxzJ5UOnR8TtfkG82n39EtkRlvQSg&index=1

키를 비교하여 정렬하는 알고리즘

2차시간 정렬 알고리즘: 삽입정렬(Insertion Sort), 교환정렬(Exchange Sort), 선택정렬(Selection Sort)

Θ(n lg n) 정렬 알고리즘: 합병정렬(Merge Sort), 빠른정렬(Quick Sort), 힙정렬(Heap Sort)


키를 비교하지 않고 정렬하는 알고리즘: 기수정렬(Radix Sort)




기수정렬(radix sort)

순서를 매길 수 있다는 것 이외에 키에 대한 정보가 없는 경우, 앞서 알아본 키를 비교하는 방법 이외에 할수 있는 정렬방법은 없다.

기수 정렬은 키가 음이 아닌 10진수 정수라는 것을 알 때 사용할 수 있다. 자리수(digit)를 따라 분배하여 정렬하는 알고리즘이다.

정렬하려 하는 숫자가 3자리 숫자라 가정하면, 100의 자리에서 0..9까지 더미로 숫자를 분배할 수 있다. 이 안에서 다시 10의 자리에서 0..9까지 분배 하고 마지막으로 1의 자리에서 0..9까지 분배하면 자동적으로 정렬이 되게 된다.

따라서 이 알고리즘은 분배에 의한 정렬(sorting by distribution)이다.

숫자가 아니라 알파벳 또한 분배할 수 있다. 이 경우에는 0..9까지의 10개 더미가 아니라 a..z까지의 26개의 더미로 나눠서 분배해야 한다.


http://rightwayman2013.blogspot.kr/2010/09/algo-83-radix-sort.html



C++ 스타일 수도코드

// 아래는 연결된리스트의 구현에 필요한 노드의 선언이다.
struct nodetype
{
	keytype key;
	nodetype* link;
};

typedef nodetype* node_pointer;

// 아래는 알고리즘이다.
void radixsort ( node_pointer& marsterlist, int numdigits )
{
	index i;
	node_pointer list[0..9];

	for ( i = 1; i <= numdigits; i++ ) {
		distribute ( masterlist, list, i );
		coalesce( masterlist, list );
	}
}

void distribute ( node_pointer& masterlist, node list[], index i )
{
	index j;
	node_pointer p;

	for ( j = 0; j <= 9; j++ )
		list[j] = NULL;
	p = masterlist;
	whild ( p != NULL ) {
		j = p->key에서 i자리 값;
		p를 list[j]의 끝에 링크;
		p = p -> link;
	}
}

void coalesce ( node_pointer& masterlist, node list[] )
{
	index j;

	masterlist = NULL;
	for ( j = 0; j <= 9; j++ )
		list[j]에 있는 마디들을 masterlist의 끝에 링크;
}


Java 구현 코드

import main.Print;

public class Radix {

	public static node radixsort(node masterlist, int numdigits) {
		
		node[] list = new node[10];
		
		for (int i = 1; i <= numdigits; i++) {
			distribute(masterlist, list, i);
			
//			for(int j = 0; j < list.length; j++) {
//				node temp = list[j];
//				System.out.print(j + ":");
//				while (temp != null) {
//					System.out.print(" [" + temp.key + "]");
//					temp = temp.link;
//				}
//				System.out.println();
//			}
			
			masterlist = coalesce(masterlist, list);
//			int[] arr = masterlist.getResult();
//			Print.printArray(arr);
		}
		
		return masterlist;
	}
	
	private static void distribute(node masterlist, node[] list, int i) {
		
		int j;
		node p;
		
		for(j = 0; j <= 9; j++) {
			list[j] = null;
		}
		p = masterlist;
		while (p != null) {
			j = (int) ((p.key % Math.pow(10, i)) / Math.pow(10, (i-1)));
			node temp;
			
			if (list[j] == null) {
				temp = p;
				list[j] = temp;
			} else {
				temp = list[j];
				while(temp.link != null) {
					temp = temp.link;
				}
				temp.link = p;
				temp = temp.link;
				
			}
			
			p = p.link;
			temp.link = null;
		}
	}
	
	private static node coalesce(node masterlist, node[] list) {
		
		masterlist = null;
		node temp = null;
		for (int j = 0; j <= 9; j++) {
			if (list[j] != null) {
				if (masterlist == null) {
					masterlist = list[j];
					temp = masterlist;
				} else {
					temp.link = list[j];	
				}
				while (temp.link != null) {
					temp = temp.link;
				}
			}
		}
		
		return masterlist;
	}
	
	public static class node {
		public int key;
		public node link;
		
		public int[] getResult() {
			
			int[] result;
			int size = 1;
			
			node temp = link;
			while (temp != null) {
				temp = temp.link;
				size++;
			}
			
			result = new int[size];
			
			temp = link;
			for (int i = 0; i < size; i++) {
				if (temp != null) {
					if (i == 0) {
						result[i] = key;
					} else {
						result[i] = temp.key;
						temp = temp.link;
					}
				}
			}
			
			return result;
		}
	}
}

https://github.com/Stardust-kr/algorithm/blob/master/src/sort/Radix.java


중간에 주석은 테스트를 위한 출력 코드이다. 출력에 필요한 관련 클래스는 github에서 나머지 코드를 찾아보시라.


모든 경우 시간복잡도

단위연산: 비교연산이 없기 때문에 다른 연산을 찾아야 한다. coalesce에서 masterlist의 끝에 노드를 추가하는 연산, distribute에선s while루프의 일부 또는 전체를 단위연산으로 취급할 수 있다. 

입력크기: masterlist에서 정수의 개수 n, 각 정수에서 십진숫자의 최대 개수 numdigits

masterlist 전체를 처음부터 차례로 따라가려면 항상 distribute의 while루프를 n번 수행해야 한다. masterlist에 리스트를 모두 추가하려면 항상 coalesce의 for 루프를 10번 수행해야 한다. (여기서는 마지막 포인터도 두어, 위의 java 코드와는 달리 while루프 없이 한번에 저장할 수 있는 더 효율적인 알고리즘이라 하자)

이 프로시저는 radixsort에서 numdigits번 for문에 의해 호출된다.

따라서,

numdigitsn을 기준으로 한계값을 표현하기 때문에, 이 알고리즘은 Θ(n)이 아니다. numdigits값을 임의로 크게 하여 n을 기준으로, 임의로 큰 시간복잡도를 만들 수 있다. 10억 자리(numdigits)의 숫자 10개(n)을 정렬한다고 고려 하면 Θ(n^2) 시간이 걸린다. 보통은 numdigits이 훨씬 작다. 최선의 경우 시간 복잡도는 Θ(n lg n)이고, 보통은 최선의 경우에 수렴한다.


추가적인 저장장소 사용

masterlist와 더미를 나타내는 리스트에서 새로운 노드를 만들지 않는다. masterlist의 노드가 더미 리스트로 이동하고, 다시 masterlist로 정렬되는 방식이다. 다만 노드에서 key와 쌍이되는 link가 사용되기 때문에 Θ(n) 링크 만큼 추가 공간을 필요로 한다.




내용 출처

Foundations of Algorithms Using C++ Pseudocode 3rd Edition 알고리즘; Richard Neapolitan, Kumarss Naimipour; 도경구 역; 사이텍미디어



+ Recent posts