본문 바로가기

코드103

Number of Islands 행렬에 있는 1의 뭉치를 세는 문제. 너비 우선 탐색을 쓰면 쉽게 해결된다 https://leetcode.com/problems/number-of-islands/ class Solution: def numIslands(self, grid: List[List[str]]) -> int: visited = set() count = 0 rowCount = len( grid ) if not rowCount: return 0 columnCount = len( grid[ 0 ] ) if not columnCount: return 0 for row, rowList in enumerate( grid ): for column, v in enumerate( rowList ): if v == '1': if self.__pai.. 2019. 11. 4.
Design Circular Queue 마지막 원소를 구하면 다시 첫 원소를 탐색하는 링 버퍼를 구현하는 문제 https://leetcode.com/problems/design-circular-queue/ class MyCircularQueue: def __init__(self, k: int): """ Initialize your data structure here. Set the size of the queue to be k. """ self.__queue = [ None ] * k self.__queueSize = k self.__head = 0 self.__tail = -1 self.__count = 0 def enQueue(self, value: int) -> bool: """ Insert an element into the circu.. 2019. 11. 1.
Unique Binary Search Trees II 정수 n이 주어질 때 1~n까지의 수로 이진 트리를 구성할 경우의 수를 얻는다. 역시 동적 프로그래밍 기법으로 같은 해를 반복하지 않도록 해야 한다 https://leetcode.com/problems/unique-binary-search-trees-ii/ # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # Definition for a binary tree node. class TreeNode: def __init__( self, x ): self.val = x self.left = None self.right =.. 2019. 10. 25.
K-th Symbol in Grammar 0부터 시작한다. 다음 줄부터는 0은 01로 1은 10으로 바꿔나간다. 이 때 줄의 개수 N이 주어질 때, K번째 항목이 뭔지 알아맞춰야 한다. 인덱스가 1부터 시작하니 주의. 트리의 깊이에 따라 패턴이 발견된다. 즉 왼쪽 노드는 부모와 값이 같고 오른쪽 노드는 반전된다. 이 점을 이용한다. # https://leetcode.com/problems/k-th-symbol-in-grammar/discuss/113710/Python-simple-solution-to-understand-with # -explanations class Solution: def kthGrammar( self, N: int, K: int ) -> int: if N == 1: return 0 return self.__kthGramme.. 2019. 10. 24.
Merge Two Sorted Lists 두 개의 연결 리스트를 정렬해서 하나로 합치는 문제 https://leetcode.com/problems/merge-two-sorted-lists/ # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def mergeTwoLists( self, l1: ListNode, l2: ListNode ) -> ListNode: if l1 is None: return l2 elif l2 is None: return l1 else: if l1.val < l2.val: head = l1 l1 = l1.next else: head = l2 l.. 2019. 10. 24.
Pow(x, n) x의 n제곱을 구하는 코드를 작성하는 문제. 빌트인 라이브러리로 너무나 쉽게 풀리는 문제지만, 그건 문제의 취지에 어긋나니 직접 풀었다. 너무 방심하다가 시간 초과로 고생... 캐시 적중율을 높이기 위해 최대한 짝수로 제곱하도록 나누었다. https://leetcode.com/problems/powx-n/ class Solution: def myPow(self, x: float, n: int) -> float: if not x: return 0 if 0 > n: x = 1 / x return self.__myPow3( x, abs( n ), { 0 : 1, 1 : x } ) def __myPow3( self, x, n, cache ): if n in cache: return cache[ n ] else:.. 2019. 10. 24.
Maximum Depth of Binary Tree 2진 트리의 깊이를 재는 문제. 깊이 우선 탐색을 쓰면 간단히 풀린다 https://leetcode.com/problems/maximum-depth-of-binary-tree/ # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def maxDepth(self, root: TreeNode) -> int: if root is None: return 0 else: return self.__maxDepth( root, 1 ) def __maxDepth(self, root, count) -> int.. 2019. 10. 24.
Climbing Stairs https://leetcode.com/problems/climbing-stairs/ Climbing Stairs - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 계단을 올라갈 때 하나 혹은 둘씩 올라간다고 할 때 경우의 수가 몇이나 되는지 헤아리는 문제. 필연적으로 말단으로 갈 수록 경우의 수가 겹친다. 따라서 동적 프로그래밍 기법으로 계산을 반복하지 않도록 해야 한다. class Solution: def climbStairs(self, n: int, cach.. 2019. 10. 24.
Fibonacci Number 제목이 곧 내용... https://leetcode.com/problems/fibonacci-number/ class Solution: def fib(self, N: int, cache = None) -> int: if N == 0: return 0 elif N == 1: return 1 else: if cache is None: cache = {} if N in cache: return cache[ N ] else: result = self.fib( N - 1, cache ) + self.fib( N - 2, cache ) cache[ N ] = result return result 2019. 10. 24.
Reverse Linked List 단방향 연결 리스트를 뒤집는 문제 https://leetcode.com/problems/reverse-linked-list/ # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def reverseList( self, head: ListNode ) -> ListNode: if head is None: return head else: reversedHead, _ = self.__reverseListIteratively( head ) head.next = None return reversedHead def __reverseList.. 2019. 10. 24.
Swap Nodes in Pairs https://leetcode.com/problems/swap-nodes-in-pairs/ 인접한 두 개의 노드를 서로 바꾸는 문제 # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def swapPairs(self, head: ListNode) -> ListNode: if head is None: return head nextHead = head.next if nextHead is None: return head nextNextHead = nextHead.next nextHead.next = head if nextNextH.. 2019. 10. 24.
Reverse String 최근에 프로젝트가 폭파된 관계로 한가해졌다... 간만에 코딩 문제를 풀어보기로 했다. 처음이니 아주 간단한 문제로 시작... 릿코드의 explorer 항목을 해보고 있다. https://leetcode.com/problems/reverse-string/ class Solution: def reverseString(self, s, i = None) -> None: """ Do not return anything, modify s in-place instead. """ if not s or len( s ) == 1: return elif i is None: i = len( s ) // 2 - 1 elif i == -1: return # 양 끝의 문자를 교환한다 s[ i ], s[ -i - 1 ] = s[ -.. 2019. 10. 24.
랜덤 던전 생성 https://bitbucket.org/ehei/dungeon-old/ ehei / dungeon-old / wiki / Home — Bitbucket dungeon-old / Home Welcome to your wiki! This is the default page we've installed for your convenience. Go ahead and edit it. This wiki uses the Markdown syntax. The MarkDownDemo tutorial shows how various elements are rendered. The Bitbucket documentation bitbucket.org 본래 네이버 오픈프로젝트에 올린 소스. 그런데 2016년 말에 거기가 망했는.. 2019. 9. 10.
ACM 674, Coin Change 마지막으로 ACM 문제를 풀어본 지가 2006년이니까 정말 많은 세월이 지났네. 이제 다시 풀려니까 다시 시작하는 것하고 똑같군... 괜히 공부는 꾸준히 해야한다고 하는 게 아니군. 어쨌건 동전 문제를 푼 기념으로 ACM 문제를 찾아보니 뭐 완전 똑같네. 코드를 살짝 고쳐서 올려서 Accepted. 처음에는 멍청하게 값을 입력받을 때마다 계산해서 시간 초과... 생각해보니 결과는 미리 정해진 거 잖아. 상위권에 엄청난 속도로 푼 기록들이 있는데 미리 계산된 테이블을 사용한 듯 싶더라구. 나는 이걸 템플릿으로 만들어보려고 하는데 흠... 고민 중. 그것도 그렇고 다른 사람들이 푼 걸 봤는데 내 것보다 메모리 사용이 1/5 밖에 안 쓰더라구. 헐. // ACM 674 #include #.. 2013. 1. 9.
다시 해본 동전 문제 책장 한 켠에 오랫동안 꽂혀있는 출력물이 있어. 무엇인가 하면은 어느 회사에 입사하기 위해서 꼭 풀어야하는 문제 목록이야. 간만에 봤는데 동적 프로그래밍으로 해결해야 하는 문제 같더군. 그건 풀면 올려보기로 하고. 어쨌거나 회사 생활 동안 공부를 게을리했더니 이런 문제가 낯설고 힘들더군... 암튼 다시 공부했는데 개념은 쉬워보이지만 이해하는데 꽤 시간이 걸려버렸네. 이 바닥에서 기본적인 동전 문제를 다시 풀어보기로 했는데 우와 어렵다... 예전에는 어떻게 풀었을까. 이해하는데 3일은 걸린 것 같아. 코딩하는데도 3일? 흑... 부끄럽네. 그래도 스스로 해결했다는데 만족하고. 일단 예전 코드와 비교하니 라인 수는 줄어든 것 같아. 그나마 자기 만족꺼리는 생겼어 흐.... 알고리즘은 정말 모든 곳에 필요한데.. 2013. 1. 9.
파이썬에서 A = [1,2,3]와 A[:] = [1,2,3]의 차이 회사에서 파이썬을 사용한다. 덕분에 파이썬 고수들이 많다. 그 덕에 찾아도 못 찾는 지식들의 해답을 찾을 수 있어서 좋다. 이번 것도 그 중의 하나이다. A = [1, 2, 3]과 A[:] = [1, 2, 3] 은 어떤 차이가 있을까. 한 동안 나는 이것이 어째서 다른지 이해되지 않았다. 그렇다고 검색 엔진에 조회하기도 애매한 질문이다. 내게 알려준 분은 예제 코드를 제시하면서 설명해줬는데, 백문이 불여일견이었다. 이 둘은 사실 용법 차이이며, 왜 다른지 인식하려면 그 편이 명확하다. 좌측은 객체가 생성되었다. 우측은 참조의 값을 바꾼 셈이 되었다. 파이썬의 디스어셈블리 모듈(dis)을 사용하면 좀더 확연히 알 수 있다. 아래 그림에서 31 STORE_FAST를 보자. a에 새로운 주소가 할당되었다. 이.. 2012. 3. 13.
회문 숫자 식별하기 회문 숫자인지 알아내기 위해 숫자를 뒤집는 코드를 짜다가 밤을 새버렸네... 메타템플릿 버전을 짜려다 보니 이렇게 되버렸다. 후헐... 얼랭 책을 읽고 있는데, 덕분에 재귀에 빠져버렸다... ^^ 이러다 스택 오버플로 나야 정신을 >_ struct ReverseMeta { enum { value = ReverseMeta::value }; }; template struct ReverseMeta { enum { value = result }; }; template struct IsPalindromeMeta{ enum { value = (i.. 2012. 1. 14.
셀프 넘버들의 합 구하기 오밤중에 심심해서 이런 일을 했다. 퀴즈를 푸는 일. 1번 설명 어떤 자연수 n이 있을 때, d(n)을 n의 각 자릿수 숫자들과 n 자신을 더한 숫자라고 정의하자. 예를 들어 d(91) = 9 + 1 + 91 = 101 이 때, n을 d(n)의 제네레이터(generator)라고 한다. 위의 예에서 91은 101의 제네레이터이다. 어떤 숫자들은 하나 이상의 제네레이터를 가지고 있는데, 101의 제네레이터는 91 뿐 아니라 100도 있다. 그런데 반대로, 제네레이터가 없는 숫자들도 있으며, 이런 숫자를 인도의 수학자 Kaprekar가 셀프 넘버(self-number)라 이름 붙였다. 예를 들어 1, 3, 5, 7, 9, 20, 31 은 셀프 넘버 들이다. 1번 문제 1 이상이고 5000 보다 작은 모든 셀프.. 2012. 1. 14.
던젼 생성 2/2 https://docs.google.com/present/view?id=dgf2n8vp_241fqsbgff3 결과적으로 문을 만들지 못해서 실패. 그러나 더 이상 코드 수정은 의미가 없다고 판단했다. 자료를 보면 알겠지만, 근본적인 한계를 극복하기가 어렵기 때문이다. 간만에 나를 위한 코딩을 하면서 배운점이 많았다. 효과적인 시간 분배도 그 중의 하나. 틈틈이 꾸준히 하는 것이 무엇보다 중요하다. 여기서 배운 교훈으로 다시 도전할 예정. 2010. 8. 16.
던젼 생성 1/2 https://docs.google.com/present/view?id=dgf2n8vp_237dr8hs4fb 랜덤 던젼을 만들어보려 하고 있다. 구글신의 도움을 받아 아래 사이트를 찾았고, 그 내용을 학습하고 있다. 덧붙여, 아래 사이트는 정말 훌륭하다. 나같이 처음 랜덤 던젼을 어떻게 만들까 고민하는 자에게는 천국이라 할 수 있다.http://dirkkok.wordpress.com/dungeon-generation-article-series/현재 1~5장까지 학습했고, 그 결과물이다. 아래 파일에는 소스 및 실행 파일이 포함되어 있다. 원래 튜토리얼은 C#과 단위 테스트가 포함되어 있다. 편의상 단위 테스트를 생략했고, 코딩은 C++로 했다. 또한 생성 과정을 시각적으로 볼 수 있도록 처리했다. 파일을.. 2010. 8. 6.
googletest 사용하기 멋진 C++ 기반의 유닛테스트 도구인 googletest에 대한 소개 및 간략한 튜토리얼을 작성해봤자. 스터디 활동을 좀더 열심히 해야함을 느낀다. 크롬에서는 보이는데 익스플로러 브라우저에서는 임베드한 문서가 보이지 않는다. 아래 링크를 클릭해야한다. http://docs.google.com/present/view?id=dgf2n8vp_218d43rcthp 2010. 6. 29.
libcurl 정적 링크 오류 해결하기 상당히 유용하고 편리한 libcurl 라이브러리. cURL 7.20.1 소스를 내려받아 직접 컴파일했다. 그러나 웬일인지 정적으로 라이브러리를 링킹하면 오류가 발생한다. 해결책은 매우 간단하다. 다음 라이브러리 파일을 포함시킨다 ws2_32.libwinmm.libwldap32.lib 그래도 링크 오류가 발생하면 다음 전처리기도 써준다 #define BUILDING_LIBCURL출처 http://bobobobo.wordpress.com/2008/11/08/working-with-curl-getting-started-the-easy-way-on-win32/ 2010. 5. 20.
클래스 멤버 함수 포인터 사용 예제 검색을 통해 발견할 수 있다. 그러나 워낙 힘들게 찾았기에 다른 사람들도 그러지 않을까 생각한다. 나만 해도 최근에 쓸 일이 있었는데, 일전에 정리한 샘플이 있었는데도 힘들었으니... 그나저나 정말 간만의 프로그램 글 업데이트다... 그 동안 얻은게 없는 건 아닌데. 예전에 오우거 공부할 때를 생각하면서 정리해봐야겠다. //#include "stdafx.h" #include #include class Test { public: // 꼭 클래스 내부에 타입 정의를 해야한다 typedef void (Test::*FunctionPointer)(int); Test() : _total(0) {} void Add(int value) { _total += value; } vo.. 2010. 5. 13.
CQ: Calculation Quotient 포트폴리오로 만든 3D 퍼즐 게임. 자세한 설명은 생략한다 아래 링크로 가면 게임 개요, 소스, 실행 파일 등을 다운받을 수 있다. 관련 링크CQ 웹사이트 바로 가기스테이지 에디터문서 및 소스 게임 파일(실행이 안되면 호환성 모드로 해서 XP 선택)설치 파일 연산 DLL 소스(작성자 이준호: http://blog.daum.net/idzuno) 이제 만든 이야기나 해야겠다. 여름 방학 내내 학교 나오면서 개발하는 것이 쉽지 않았다. 하필 학과가 방학 때 이사를 하는 바람에 실습실을 못 써서 도서관을 애용했다. 그런데, 멀티미디어 실습실은 6시까지만 가능하다. 이후는 오프라인으로 작업해야 한다. 덕분에 인터넷없는 환경의 개발이 얼마나 힘든지 뼈와 살이 분리되도록 느꼈다. 경쟁할 동료 없이 작업하는 것이 얼마.. 2006. 11. 19.
V Player 멀티미디어 강의에서 수행한 프로젝트. DirectShow를 이용한 적당한 작품을 만드는 것이 임무였다. 기존 플레이어에서 불편한 부분을 생각해보았다. 지금 플레이되고 있는 부분이 아닌 곳을 싶을 때가 있다. 잠깐 앞의 내용을 기억한다는가 하고 싶을 때. 그럴려면 현재 보고 있는 부분에서 이동해야 한다. 그리고 다시 봤던 부분을 찾아서 이동해야 한다. 그 점을 개선해보고 싶었다. 나는 Video Mixing Renderer(이하 VMR)의 Windowless 모드를 사용하여 트랙바에 커서를 올려놓는 것만으로 쉽게 탐색할 수 있도록 했다. 커서를 위치시키면 해당 부분이 재생된다. 이동시키면 역시 그 부분이 재생된다. 기대했던 것 이상으로 편리하다. 자화자찬 그러나... 기술적 어려움으로 Renderless .. 2006. 11. 19.
easyVNC 프로토타입 아직도 유명한 WinVNC와 같은 기능을 하는 프로그램(기본적인 것만)이다. 물론 많이 부족하다. 누군가의 의뢰로 처음 짜본 프로그램. 덕분에 부담도 많았다. VNC 처럼 원격의 화면을 보여만 주면 된다고 해서 별 것 아니라고 생각했으나... 추석 때도 이것 때문에 부담을... 실행하려면 Visual C++ Distributable Package를 설치해야 한다 // 소스 // 실행 파일처음으로 클라이언트 서버 기반의 프로그램을 하느냐 참 용썼다. 그러나, 이번 기회에 네트워크 프로그래밍에 대해 이모저모 알게된 기회였다. 물론 아직도 태부족이다. 그래도 쓰기 쉽게 해준다고 라이브러리로 만들고 이름도 멋있게 easy~를 붙였는데 쩝... 많은 시행착오를 겪었다. 여러 네트워크 라이브러리를 테스트했다. 최종.. 2006. 10. 18.
OpenTNL API를 이용하여 메모리 데이터 전송하기 http://www.opentnl.org/ 네트워크 API인 OpenTNL로 테스트를 진행했다. RFC(Remote Function Call) 방식이 특징이라, 원격지의 기능을 쉽게 동작시킬 수 있다. 예술적인 매크로를 감상할 수 있다. 이 라이브러리를 이용하여, 원격지로 메모리의 데이터를 보내기 위한 테스트를 진행하려고 했다. 일단 OpenTNL 샘플을 컴파일시켰다. 샘플을 동작시켜본 후, 이제 약 60K~130K에 이르는 메모리 데이터를 보내려고 했다. TCP 방식으로 직접 전송하는 방법을 찾지 못하여, RFC를 연속으로 사용했다. 그래서인지 전송이 엄청나게 느리다... JPG로 압축해서 전송60K 보내는데 거의 5초는 걸리는 것 같다. 게다가 loopback인데 말이다. 쩝, 꽤 유명한 API인데도.. 2006. 10. 4.