블로그 이미지
bro.Yobi

Rss feed Tistory
CSE/etcetera 2010.10.26 22:01

treebuilder


.
CSE/Problem 2010.04.04 11:50

Ploygons

http://uva.onlinejudge.org/external/1/137.html

기본적인 기하학적 지식과 Sort를 이용하면 풀 수 있는 문제.
(HINT : ConvexHull 과 ConvelHull의 overlap이 되는 도형은 ConvexHull이다)



Online Judge에서는 Submit한 코드가 만들어 내는 결과가 원하는 결과 완전히 같아야 한다.

Wrong Answer가 나왔었는데, 계산된 값이 잘못 된줄 알고 쓸데 없는 테스트만 했다.
알고보니 모든 출력 이후 "\n"을 넣지 않아서 그런것이었다. -_-;;
CSE/Problem 2010.03.06 10:18

다시 기름칠을 하다..



입사한지 1년째다.
머리가 굳어가는것이 아닐까..라는 염려와 혁이와 봉이 블록에서 보이는 재미난 문제의 펌프질 때문에 다시 문제들을 뒤적거려 봤다.

회사에서 딱히 바쁘지도 않고(2주째 놀고 있당 ^-^).. 적응도 다 된것 같고..

String computer(http://uva.onlinejudge.org/external/1/164.html)

DP문제다. C로 짜고 싶은데 요즘 안쓴지 1.5년이 되어서 모르겠다. printf밖에 기억 안난다.
CSE 2009.06.27 08:46

재밌는거..

VB : ActiveX Dll No transaction mode

Public Function ha(ByVal x As String) As Collection

    Dim row As Collection
    Dim rows As Collection
    Set row = New Collection
    Set rows = New Collection
   
    row.Add "sdfsl1"
    row.Add " asdf2"
    row.Add " asdf3"
   
    rows.Add row
   
    Set row = Nothing
    Set row = New Collection
    row.Add "134we"
    row.Add "234we"
    row.Add "334we"
   
    rows.Add row
   
   
    Set ha = rows
   
   

End Function


C# 위 DLL 참조

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Project1.Class1Class ttt = new Project1.Class1Class();

            VBA._Collection ret, ret2;

            ret = ttt.ha("aaa");

            int i,j;
                        
            int rows = ret.Count();

             for (i = 1; i <= rows; i++)
            {
                object I = (object) i;
                ret2 = (VBA._Collection)ret.Item(ref I);
                int cols = ret2.Count();

                for (j = 1; j <= cols; j++)
                {
                    object J = (object)j;
                    Console.Write(ret2.Item(ref J) + " ");
                }
                Console.WriteLine();
            }

           

 


            Console.Read();

        }
    }
}

CSE 2009.06.15 21:54

moving target

흔히 기업에서도 KPI와 같은 인덱스를 둬서 같은 노력에 최대한의 효과를 얻으려고한다.
요즘 하고 있는게 그와 비슷한 것이고, 그 효과도 바로바로 나타나서 기쁘기 그지없다.

1시간 이상 -> 50분 -> 10분 -> 2분 -> 5초 이하로  우하하
CSE 2009.06.11 19:56

10억 Tick Vs. 400만 Tick


ArrayList ar = new ArrayList();
//int[] ar = new int[50000000];

for (int i = 0; i < 50000000; i++)
{
        ar.Add(i);
        //ar[i] = i;
}


두가지 비교할때 ArrayList는 10억Tick걸렸고, 아래쪽은 400만 Tick 걸렸다.
0.4%면 약간의 메모리를 낭비해도 배열이 낫겠다.

CSE/Algorithm 2009.06.08 19:50

데이터가 많으면

학생때는 생각하지 못했던 문제들에 부닥치게 된다.

 최단경로 문제를 흔히 많이 쓰는 Dijkstra 알고리즘으로 구현하려고 했다.

하지만 Bellman Ford가 구현이 더 쉽기 때문에 1차적으로 벨만 포드로 구현했다. (또한 결과 값을 비교해보려고..)

그/런/데 Out of memory exception…

보통 그래프를 2차원 행렬로 표시한다. 하지만 노드의 개수가 10만개가 되어버리면..

Edge 정보를 1byte로만 잡아도 10의 10승(10기가) byte가 필요하다. ㅋㅋㅋ

 

그래서 대안적으로 리스트로 구현했다.

당연히 아주 느릴거란걸 예상하면서..

그런데 그 아주가 그렇게 아주인지…. 도무지 끝날 생각을 않는다.

 

그래서 리스트에 해시테이블까지 써가면서 복잡한 자료구조를 구현했다.

물론 많이 빨라졌다. 그래도 문제 푸는데 1시간 정도 걸린다.

 

퇴근 시간 조금전에 처음으로 돌아가서 Dijkstra로 해결해보려 Heap까지 만들어가면서 만들었다. 아주빨랐다. 파일로부터 데이터를 읽는 시간이 알고리즘 돌리는 시간보다 길었다.

하/지/만 결과가 Bellman Ford로 얻은 결과에 비춰볼 때 약간 이상한게 있었다.

"어디가 잘못됐을까나.." 생각하다가 집에 왔다.

밥먹으면서 생각났다.

ref를 빼먹었다는거..

CSE/etcetera 2009.04.16 00:59

com(com+), RDS 그리고 .NET에서의 SOAP,WSDL

오랜만에 CSE카테고리에 글을 쓰게 됐다.

코드의 재사용성과 interoperability를 위해서 COM이 개발된것 같다. 또 기존의 MTS가 제공했던 트랜잭션 관리와 풀링과 DCOM의 개념이 합체해서 COM+이 나왔다. 
수백 개의 아주 복잡한 비즈니스 로직들이 그물처럼 뒤엉켜 있고, 이들 관계내에서 트랜잭션 처리도 해야하는 상황에서 사실  COM+은 아주 편리한 도구이다. COM+가 없었다면 아마도 전체 비즈니스로직을 usecase별로 트랙잭션으로 만들어야 했을 것이다. 또한 이런 COM+는 전체 시스템을 3(or more) tier 구조로 만듦으로써 client는 아주 간단해 졌고, 이것은 또한 Client의 배포를 비교적 용이하게 만들었다.
COM+는 사실상 remote의 개념과 무관하다. MS에서는 원격에서 COM+를 사용하게 하기 위해서 RDS라는 놈을 제공한다. 이것은 사실 HTTP의 POST 메소드를 이용하는 간단한 놈이다. (이것을 몰라서 한 참을 삽질했다. COM+에서 기본적으로 remote서비스를 해주는 줄 알았으니깐.. 또한 COM과 COM+이 어떻게 레지스트를 이용해서 객체를 만들고, 이것이 RDS와 어떤 연관을 맺어가면서 원격에서 사용되는지는 며칠간의 삽질을 통해서 알게되었다.)

하지만 환경이 바뀌고 있다. 소위말하는 smartclient를 구현하는 실버라이트와 같은 것이 막강한 개발 인터페이스와 배포 기능을 하기면서 그것의 플랫폼이 되는 .NET환경이 비즈니스 로직과 연동되어야하는 상황이 발생한것이다. 소위 Language Interoperability를 지향하는 .NET에는 당연히 COM, COM+과의 연동을 쉽게 제공해준다. 하지만 이것은 로컬에서만의 이야기다...

사실 문제는 서로 복잡하게 뒤엉켜진 C++, VB로 만들어졌던 수백개의 비즈니스 로직들을 어떻게 .net 환경에서(원격에서) 호출하냐의 문제였다. 위에서 이야기한 바와 같이 로컬에서는 .net com+을 사용하기 쉽다. 이것을 원격에서 이용하기 위해서는 기존의 RDS와 거의 같은 서비스인 SOAP, WSDL을 사용해야한다. (이것때문에도 며칠 동안 삽질했다. 더이상 볼 페이지가 없을 정도로 구글에서 검색된 모든 자료와 MSDN의 관련된 자료는 다 봤다. 하지만 딱 맞는 자료는 없었다. .net에서 COM+원격 객체에 접근하는 방법으로 검색해도 없었고, RDS를 사용하는 방법도 없었다. 사실 웃긴 얘기지만 당연히 있을리가 없다. 사실 몇개가 있긴한데.. 다 안된다. 그저 자신들의 생각일 뿐.. 구글링으로 검색된 외국의 개발자들의 의견도 다들 찌질이 같다. -_-;; ) RDS는.. 특히 VB에서 사용하는 RDS는 컴파일타임에 객체의 타입과 메소드의 존재를 알지 못해도 컴파일되고 실행되는 다소 느슨한 놈이다. 하지만 .net에서는 모든것을 다 알아야 컴파일 된다. 원격객체를 late binding 할 때는 Type을 원격에서 가지고 와서 인스턴싱 하는 방법을 사용한다. .net remoting 서비스 같은 경우는 원격과 로컬에서 공유되는 데이타를 미리 정의해서 각기 컴파일 할때 참조해야한다. WSDL같은 경우에도 서버쪽 객체를 만들고 이것을 사용할 수 있게하는 proxy를 만들어 줘야한다(이것은 자동으로 된다 ㅎㅎ)

로컬에서는 .net이 com+ 객체에 접근할 수 있는 방법이 있고, 원격에서 WSDL을 통해서 객체에 접근할 수 있는 방법이 있기 때문에 이 두개를 결합하면 middle tier에서 .net환경에서 접근 가능한 com+객체를 재사용할 수 있다.
단지 데이터의 마샬링이 문제가 될 수 있긴하지만, WSDL에서 제공하는 몇가지 간단한 data type을 응용하면 어떠한 정보도 전송가능한 상태로 변형시킬 수 있다.


결국은 소위 .net에서 말하는 unmanaged code에서는
client - RDS - IIS - MSADC(RDS) - COM+(server) 의 단계를 거쳐야함에 비해서

.net의 managed code에서는
client - WSDL(proxy?) - IIS - WSDL - COM+(server) 의 단계를 거친다.

결국은 RDS를 WSDL로 바꿔주고 데이타의 마샬링 문제만 풀면 될것이다. 이렇게 되면 기존의 모든 컴포넌트를 100% 변형없이 재사용 가능하다.

개념이 잘 잡히지 않은 상태에서 패킷잡아가면서.. com+ 만들고 설치하고 RDS와 IIS와 연동하면서..(결국 삽질해가면서) 알게된 간단한 구조다.

###
나와 같은 목적을 가진 사람들이 좀 있드라..
그런 사람들의 글에  Activator.GetTypeFromProgID()란 메소드를 이용하면 원격의 객체에 접근할 수 있다고 많이 나와있는데, 사실 안된다. 무조건 로컬의 레지스트만 검색한다. (그리고 익셉션이 발생하는데 이 익셉션이 원격의 문제인지 로컬의 문제인지를 판단할 수 없다. 이것 때문에 네턱 패킷을 모니터링하면서 결국에는 위 메소드가 로컬의 레지스트리만 검색한다는 것을 알게됐다.)이 문제로 고민하는 사람들이 아주(?) 많은것 같드라. 그들이 한국어를 배우면 이 글을 읽겠지...



CSE/etcetera 2008.10.17 00:18

사용자 인증

http://www.nic.com/~dave/SecurityAdminGuide/SecurityAdminGuide-9.html

http://www.virusexperts.com/xbi/programming/md5-crypt


결국은 DES,MD5 둘 다 맞네.. 다만 요즘엔 MD5를 쓴다.

이것도 맞지 않았고 저것도 맞지 않았지만, 이것도 맞았고 저것도 맞았다.

항상 정보들이.. 부분적으로만 존재해서 많은 의문점을 남기고.. 조사하게 만든다. >.<

이제는 DES를 one-way function으로 사용하는 법이 궁금하구나..


CSE/etcetera 2008.10.06 19:20

순봉에게

순봉아.. 아까 내가 준 해법은 잘못된거다.
n명의 순열을 생각못했다. 그렇다고 순열대로만 경우의 수를 곱해주면 중복이 발생해서 문제가 굉장히 복잡해져..

그래서 좀 다른 해법을 찾아야되

T(x) : x번째 내에서 모두 1이 1회 이상 나오는 확률. 따라서 x=3이면 1번째 2번째 3번째 모두 포함.
이렇게 정의하자. 구하고자하는 F(x) 는 x번째에서 모두 1이 1회 이상 나오는 확률.. 이렇게 정의하면
F(x) = T(x) - T(x-1) 이렇게 된다.

이제 T(x)를 구하면되니깐..
T(x)는 n명 모두가 x번째내에서 적어도 1번이상 1이 나오는 확률. 한명이 x번째 내에서 적어도 1번이상 1이 나오는 확률은 1-(1-p)^x   (p : 1이 나올확률=1/6)
따라서
T(x) = (1-(1-p)^x)^n  임..
결론 F(x) = (1-(1-p)^x)^n  - (1-(1-p)^(x-1))^n

예>  2명일때..2번째에 모두 1이 나오는 경우.. 문제의 조건에 대당하는 경우는 총 5가지 (1은 1이 나온는것.. 0은 나머지것..)
1>             2>           3>       4>          5>
봉 : 1, 1     봉: 0,1     봉:1,0    봉:0,1     봉:0,1
엽 : 0, 1     엽: 1,1     엽:0,1    엽:1,0     엽:0,1
--------------------------------------------
1>과 2> 의 확률:p^3*(1-p)
3> 4> 5> 의 확률 : ((1-p)p)^2
따라서 모두 합하면 p^4 - 4p^3 +3p^2

위에서 구한 공식으로 풀면,
(1-(1-p)^2)^2  - (1-(1-p))^2
= (2p-p^2)^2  - p^2
= p^4 -4p^3 + 4p^2     -  p^2 
= p^4 -4p^3 + 3p^2 (위와같음.)

이거 기대값 구하려면 식이 좀 복잡한데... 적분 이용하면 될것 같은데 어렵네..

엑셀로 노매너 5명이 주사위 놀이 할때.. 구해봤는데..



기대값은 13.0xx 정도 나오니깐..
평균적으로 14번 던지면 노매너 모두 1이 1번 이상씩 나온다. ㅋㅋㅋ



 

TOTAL 238,851 TODAY 2