재미있는 글을 보고서.. 나도 포스팅

알다시피, 비트연산자 << n 은 n 비트 만큼 왼쪽으로, >> n 은 n 비트만큼 오른쪽으로 비트를 이동(shift) 한다는 의미이다.

예를 들어,
int n = 1;
n =<< 1;
위와 같이 하면 n 의 값은 1 비트씩 왼쪽으로 밀려서 답이 2 가 된다.
( 일반적으로 2^n 값을 곱하거나 나눌 때, 비트 연산자를 종종 활용한다. 비트연산의 장점은 비트 단위에서 직접 조작하므로 일반 사칙연산보다 더 빠르다는 것.. 단, 이러한 연산법은 양수일 경우에만 제대로 동작한다. 자세한 내용은 아래 다시 설명 )

그러다면 아래와 같은 비트 연산의 결과는 어떻게 될까?
( 테스트 환경은 Intel 계열 CPU )

Quiz 1)
int n = 1;
n =<< 31;
cout << n << endl   // n 은 얼마??

Quiz 2)
int n = 1;
n =<< 32;
cout << n << endl   // n 은 얼마??

Quiz 3)
int n = 1;
n =<< 33;
cout << n << endl   // n 은 얼마??

Quiz 4)
int n = -2;
n =<< 31;
cout << n << endl   // n 은 얼마??

Quiz 5)
int n = -256;
n =>> 31;
cout << n << endl   // n 은 얼마??

Quiz 6)
int n = -256;
n =>> 33;
cout << n << endl   // n 은 얼마??

Quiz 7)
int n = 1;
n <<= -123;
cout << n << endl   // n 은 얼마??


 C99 표준문서 의 6.5.7 Bitwise shift operators 를 보면 다음과 같이 정의되어 있다.
If the value of the right operand is negative or is
greater than or equal to the width of the promoted left operand, the behavior is undefined.

The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated bits are filled with
zeros. If E1 has an unsigned type, the value of the result is E1 * 2^E2, reduced modulo
one more than the maximum value representable in the result type. If E1 has a signed
type and nonnegative value, and E1 * 2^E2 is representable in the result type, then that is the resulting value; otherwise, the behavior is undefined.

The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2^E2. If E1 has a signed type and a negative value, the
resulting value is implementation-defined.

우측 피연산자 값이 음수이거나 좌측 피연산자의 범위보다 큰 경우의 행위는 정의되지 않았다 (undefined)

E1 이 양수인 경우에는 E1 << E2 는 E1 을 E2 비트만큼 왼쪽으로 이동, 이 것은 E1 에 2^E2 을 곱한 것과 같다. E1 이 음수인 경우의 동작은 정의되지 않았다.
E1 이 양수인 경우 E1 >> E2 역시 E1 을 E2 비트만큼 오른쪽으로 이동, 이것은 E2 를 2^E2 를 나눈 것과 같다. 그러나, E1 이 음수인 경우, 결과는 구현에 따라 달라진다 (implementation-defined)

결국, C99 표준에 정의되지 않은 사항은 CPU 명령어 정의에 따라 달라지게 되는데... Intel CPU 에서의 동작은 다음과 같다.

우선, << , >> 연산자의 오른쪽 피연산자는 short 일때 4 자리(0 ~ 15까지), int 일때 5 자리(0 ~ 31 까지), 64 비트형인 long long 일때 6 자리 (0 ~ 63 까지) 의 범위에 대해서만 유효하다. 다시 말하면 오른쪽 피연산자는 short 일때 하위 4 비트만 사용하며, int 일때 하위 5 비트만 사용하며, long long 일때 하위 6 비트만 사용한다. 쉬프트 연산은 왼쪽 피연산자 값의 범위 (비트 길이) 내에서만큼만 쉬프트 연산이 이루어진다. 즉, Quiz 2 의 n <<= 32 에서 32 는 100000 이 되고, 하위 5 비트는 00000 이므로 n <<= 32 는 n <<= 0 과 같다. Quiz 3 의 n <<= 33 는 33 이 100001 이며 이중 하위 5 비트는 00001 이므로 n <<= 33 은 n <<= 1 과 같아지는 것이다.

n << x 이면 일반적으로는 n 이 2^x 만큼 곱한 것과 같아지게 되는데, Quiz 1 의 경우는 1 << 31 의 답이 1 * 2^31 이 아닌 -2147483648 ( -1 * 2^31 ) 이 된다. 이렇게 되는 이유는 int 의 경우 최상위 비트가 부호 비트가 되어 부호 비트가 0 에서 1 로 바뀌면서 음수값을 취하게 되기 때문이다. ( 최상위비트 참고 )

Quiz 1 의 결과
00000000 00000000 00000000 00000001 // 1 을
10000000 00000000 00000000 00000000 // 31 만큼 좌측을 이동, 부호 비트가 1 이 되며 답이 -2147483648
만약 n 이 unsigned int 였다면, 답은 양의 정수 2147483648 이 된다.

Quiz 2 의 결과
00000000 00000000 00000000 00000001 // 1 을
00000000 00000000 00000000 00000001 // <<= 32 는 <<= 0 과 같으므로, 결과는 변함 없어 답은 1

Quiz 3 의 결과
00000000 00000000 00000000 00000001 // 1 을
00000000 00000000 00000000 00000010 // <<= 33 는 <<= 1 과 같으므로, 결과는 1 비트 좌측이동하여 답은 2

Quiz 4 의 결과
11111111 11111111 11111111 11111110 // -2 을
00000000 00000000 00000000 00000000 // <<= 31 로 31 만큼 좌측 이동. 결과는 0 이 된다.

왼쪽 피연산자가 음수인 경우에 << 의 경우는 왼쪽으로 비트를 이동하면서 0 으로 채운다. 그런데, implementation-defined 되 있는 >> 연산자는 동작방식이 다르다.
 << 연산자의 경우 양수/음수 모두 이동한 자리를 0 으로 채운다. 반면에 >> 연산자의 경우 양수일 경우에는 오른쪽으로 비트를 이동하면서 이동한 자리는 0 으로 채우는데, 음수일 경우에는 이동한 자리를 1 로 채우게 된다. 그래서 Quiz 5 의 경우 오른쪽으로 이동하고 난 후의 남은 31개 비트를 모두 1 로 채우므로 답은 -1 이 된다.

Quiz 5 의 결과
11111111 11111111 11111111 00000000  // -256
11111111 11111111 11111111 11111111  // 31 만큼 우측 이동, 음수의 경우 이동한 자리는 1 로 채워짐. 답은 -1

Quiz 6 의 결과
11111111 11111111 11111111 00000000  // -256
11111111 11111111 11111111 10000000  // 33 만큼 우측이동, >> 33 은 >> 1 과 같아서 답은 -128

>> 연산자 역시 << 연산자와 마찬가지로 int 의 경우 오른족 피연산자의 하위 5 비트에 해당하는 값만큼만 이동을 한다. 그러므로 int n 의 경우 n =>> 33 은 n=>> 1 과 같아진다.

음수일 경우 >> 연산을 하여 이동한 자리를 0 이 아닌 1 로 채우는 이유는 아마도 n =-2, n  >>= 1 일때  n = -1 이 되는 것과 같이 음수인 경우 나눗셈 연산이 정상적으로 동작하도록 하게 하려는 의도였을 것이다.
하지만 음수는 2 의 보수로 계산되기 때문에 음수인 경우에는 n 비트 쉬프트 연산의 결과가 2^n 곱셉/나눗셈의 결과와는 동일하게 동작하지 않는 경우도 종종 생긴다. ( 2^n 꼴의 수가 아닌 경우 이러한 경우가 발생 )
예를 들면 n = -10 일때 n =>> 3; 의 결과는 n /= 8; 과는 다른 결과가 나온다. 
( n =>> 3 이면 n = -2, n /= 8 이면 n = -1 )

11111111 11111111 11111111 11110110   // -10
11111111 11111111 11111111 11111110   // 우측으로 3 비트 이동한 후의 결과, -2 가 됨

끝으로, Quiz 7 과 같이 쉬프트 연산에 있어서 오른쪽 피연산자의 값이 음수일 경우 역시 오른쪽 피연산자의 하위 5 개 비트의 값에 해당하는 크기만큼만 비트 이동을 하므로, -123 이 11111111 11111111 11111111 10000101 이며 이중 하위 5 비트는 00101 이므로 결국 n <<= -123 은 n <<= 5 와 같다.
그러므로 1 <<= 5 한 결과는 32.

비트연산은 다양한 최적화 테크닉에 있어 중요한 부분을 차지하고 있고, 의외로 많은 사람들이 헷갈려 하는 부분이당( 나 포함 )...
이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/263 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지



Problem Solving 의 정수론 분야 중 두 수의 최대공약수최소공배수를 이용한 문제들은 매우 자주 등장하는 편이다.
구하는 방법은 여러가지가 있는데...


방법 1) 소인수 분해 (Prime Factorization)
중학교 때 배우게 되는 소인수 분해를 이용한다
어떤 수의 모든 소인수를 구하는 방법은 소수구하기 알고리즘을 이용한다.

소인수분해는, a 와 b 를 소수로 나눌 수 있는 만큼 인수분해하여, 최대공약수는 두 수의 공통된 소인수들 중에서 차수가 최소인 값들의 곱이 되며, 최소공배수는 두 수의 모든 소인수들 중에서 차수가 최대인 값들의 곱이 된다.


이 방법은 수학시간에 배운 직관적인 방법이고, 많은 이들에게 익숙하지만 위에서 보듯이 코딩으로 옮기기에는 꽤나 귀찮다는 단점이 있다. 또한 두 수 a, b 의 모든 소인수를 구해서 저장해 놓아야 하므로 별도의 메모리를 필요로 한다. ( 위의 코드는 10000 까지의 소인수에 대해서 구현한 코드 )


방법 2) Brute force
최대공약수의 정의를 이용하여, brute force 방법으로 직접 구한다.
즉, 두 수 a, b 를 나누어서 나머지가 0 이 되는 수들 중에서 가장 큰 숫자를 구하면 이 숫자가 최대공약수가 되며, 두 수 a, b 의 배수를 구하여 공통된 배수 중 가장 작은 숫자를 구하면 이 숫자가 최소공배수가 된다.

위의 코드에서 만약 a, b 간의 공약수가 존재하지 않는 경우는 두 수의 최대공약수는 자연스럽게 1이 되며, a, b 간의 최소공배수 중 가장 클 가능성이 있는 수는 a*b 가 되므로 a*b 까지만 검사를 하면 된다.

이 방법은 최대 a*b 번의 연산을 해야 하므로,  a 와 b 가 커질수록 수행시간이 급격히 늘어난다.


방법 3)
Euclid's algorithm - Using Recursion
사실 최대공약수와 최소공배수를 구하는 것은 고대 그리스의 수학자, 유클리드가 고안한 "유클리드 알고리즘"(Euclid's algorithm) 을 쓰면 간결하게 해결할 수 있다. 이 방법은 The Art Of Computer Programming 의 제 1장에도 소개된 바 있다.
a, b 중 큰 수를 a, 작은 수를 b 라 하자. 이 두 수의 최대공약수를 구하려면 a 를 b 로 나눈다. 이 연산을 한 후에 b 와 a%b 를 갖고 어느 한쪽이 0 이 될때까지 이 과정을 계속 반복한다. a%b 가 0 이 될 때의 b 가 바로 최대공약수가 된다. 이를 코드로 옮기면 다음과 같다.


최대공약수와 최소공배수의 성질을 이용하면 아래와 같이
최소공배수 = (a*b) / 최대공약수
최대공약수 = (a*b) / 최소공배수
가 되므로, 최대공약수나 최소공배수 둘 중 하나만 구하면 나머지 하나는 쉽게 구할 수 있다.


방법 4) Euclid's algorithm - Using Iteration
방법 3 은 매우 간결한 코딩이 가능하지만, 재귀호출을 이용한다는 단점이 있다. 재귀호출은 상당히 비싼 작업이므로 이를 좀더 효율적인 iteration 버전으로 바꿀 수 있다. 실제로 방법 3은 a, b 가 매우 큰 서로소일 경우 답을 얻는데 꽤 오랜 시간이 걸리게 된다.



방법 5) Euclid's algorithm - Using Iteration, Original Version
유클리드가 처음 이 알고리즘을 제안했을때 사실은 modular 연산을 사용하지 않고, 아래와 같이 뺄셈 연산을 이용했다 한다.
 
방법5 는 방법 4와 비교하여, tmp 변수를 사용하지 않아도 되므로 메모리를 약간 절약한다는 장점이 잇다 ^^

유클리드 알고리즘의 증명 = 자세한 설명은 생략한다 Wikipedia 참고
유클리드 알고리즘의 시간복잡도 = O(n^2), n = length of integer bits, 그 이유는 n-bit 숫자 나눗셈 연산의 시간복잡도가 O(n(m+1)) 이기 때문이다 ( m 은 몫의 길이 )

3개 이상의 수에 대해 최소공배수와 최대공약수를 구할 때는, 두 수의 최소공배수와 최대공약수를 구한 후, 이 수와 나머지 수들에 대해 최소공배수와 최대공약수를 구하면 된다.

유클리드 알고리즘을 처음 보았을 때 무릎을 쳤던 기억이 난다. 그래서 최대공약수와 최소공배수에 대해서 글을 반드시 함 써보려 했는데... 위키피디아에 유클리드 알고리즘이 깔끔하고 멋지게 정리가 되어 있었다 ㅋ

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/261 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon 김경태 2008/10/19 00:04  댓글주소  수정/삭제  댓글쓰기

    오 알고리즘 정리 해놓으시는 카테고리도 있네요. 가져가도 될까요? 후배들 교육용으로? 발행 안하고 내부 문서로만 쓸 예정입니다.

  2. BlogIcon hyperdash 2008/10/21 01:19  댓글주소  수정/삭제  댓글쓰기

    출처 안밝히고 막 써도 되는 자료지? ㅋㅋㅋ

  3. mosaick 2009/08/11 16:55  댓글주소  수정/삭제  댓글쓰기

    지나가다 하나 추가하면 좋을 것 같아서, ^^a


    방법5 는 방법 4와 비교하여, tmp 변수를 사용하지 않아도 되므로 메모리를 약간 절약한다는 장점이 잇다 ^^
    => 방법4는 modular연산을 통해 방법5에 비해서 순회횟수를 줄인다.

  4. BlogIcon 연꿈 2009/11/20 16:30  댓글주소  수정/삭제  댓글쓰기

    와 정말 잘 정리해놓으셨네요
    출처밝히고 참고해도 괜찮을까요

이름 암호 홈페이지



문제

- 모 웹사이트에서 다른 사람이 올린 내가 찍힌 사진을 다운받을 일이 생겼다.
그런데 사진의 장수가 한두장이 아니었다...

더구나 주인장은 센스넘치게 -0- 사진들을 압축으로 묶어서 올려 놓은게 아니고, 아래와 같이 한장 한장을 일일이 따로따로 서버 폴더에 걍 넣어놓고 링크만 걸어놨다.

http://a/1.jpg
http://a/2.jpg
http://a/3.jpg
...

Firefox 의 DownloadThemAll 과 같은 플러그인을 쓸수도 없었다. 왜냐하면 저 사진들이 링크걸린 페이지에는 썸네일만 올라가 있고, 해당 썸네일을 클릭해야 비로소 원본 사진이 리다이렉트로 보여지는 형태로 링크가 걸려있었기 때문이었다. ( 그래서 DownladThemAll 로 다운받으면 썸네일만 다운로드된다 )

수백장 되는 사진을 처음에는 "브라우저로 경로 실행" - "이미지 우클릭" - "다른이름으로 저장" 을 통해서 한장씩 다운받다가... 이 짓을 하고 있는 나 자신이 한심해졌다 -0-

그래서 구글링으로 뒤지다가... URLDownloadToFileA 라는 쌈박한 함수를 찾았다.

해결

URLDownloadToFileA 를 이용해서 아래처럼 특정 URL 의 연속된 파일들을 일괄적으로 다운받는 간단한 프로그램을 만들었다.


예외처리도 하나도 안되어있고 단순하게 만들었지만 내 요구사항은 완벽히 충족시켰다.  ㅋ
URLDownloadToFileA  이 함수만 잘 활용하면...
파이어폭스의 DownloadThemAll 과 같은 플러그 인도 쉽게 제작이 가능할 것 같다.

어쨌든 노가다 할 뻔한 일을 코딩으로 줄여서 흐믓 ㅋ

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/259 관련글 쓰기
  1. FlashGet v1.96.1073 : 최고의 다운로드 가속기

    FROM 동해랑: 동해바다의 파도... 浪 2008/10/12 08:55  삭제

    FlashGet v1.96.1073.exe 본 프로그램은 사용에 아무런 제한이 없는 쉐어웨어입니다. 하나의 파일을 여러개로 나누어 다운로드를 받음으로써 전송속도를 증가시키는 원리를 사용하여 매우 많은 인기를 얻고 있는 "FlashGet" 입니다. ☞ 개선사항 ㆍ BT 모듈 최적화 ㆍ 그외 소소한 버그 수정 및 개선 "Download Accelerator", "GetRight" 와 같은 성격의 프로그램으로 다운로드 속도 증가와 더불어 여러 개의 다운로..

  2. Firefox3 Add-on: DownThemAll!: 대량 다운로드용

    FROM 동해랑: 동해바다의 파도... 浪 2008/10/12 08:55  삭제

    소개처 : https://addons.mozilla.org/ko/firefox/addon/201 제작처 : http://www.downthemall.net/ 용도 : 대량 다운로드 도구 Flashget의 그것과 꽤나 비슷해보인다... 현재 탭/모든 탭 또는 드래그(drag)한 부분에 있는 링크로 연결된 것을 다운로드 받게 해준다. 굳이 자신이 지금껏 다운로드했던 DB[각주:1]를 계속 이어나가고자 한다면.. 굳이 이 플러그인을 쓸 필요는 없겠지만....

댓글을 달아주세요!
  1. BlogIcon hyperdash 2008/10/13 17:21  댓글주소  수정/삭제  댓글쓰기

    후웃~~~ 100번정도라면 코딩할만 한데???

    나름 뿌듯했겠는걸~~ ㅋㅋㅋ

    • BlogIcon soyoja 2008/10/13 19:30  댓글주소  수정/삭제

      100번이면 그냥 손으로 했겠지..
      사실 저건 예제로 대강 저렇게 했다고 쓴거고...
      사진이 총 1600 장이야.. -_-;;

  2. 김준형 2008/10/20 15:30  댓글주소  수정/삭제  댓글쓰기

    http://www.hira.or.kr/rdc_hospsearch.hospsearch.do?method=hospital&pgmid=HIRAA030101000000
    죄송합니다만 위 주소에서 검색결과를 다운받거나 엑셀파일로 변환할 방법은 없을까요?
    치과만 다운받을려는데 너무 노가다네요
    검색결과랑 링크되어있는 2단게페이지까지만 좀 받고싶은데 죽을맛입니다.
    부탁드리겠습니다.
    우편물 발송목적으로 정보를 옴겨야되는데 암담하네요 ㅠㅠ

    • BlogIcon soyoja 2008/10/20 16:17  댓글주소  수정/삭제

      죄송합니다만 해당 사이트는 서버에서 처리된 검색결과를 웹 페이지에 뿌려주는 방식이니 제가 했던 서버에 올라가있는 파일을 자동으로 다운받는 것과는 상황이 다르군요..
      별다른 도움을 드릴수 없겠네요 -0-

  3. BlogIcon 임수창 2008/10/22 01:59  댓글주소  수정/삭제  댓글쓰기

    질문이 있습니다.

    어떻게 웹페이지에 서류파일을 걸어놓고 사람들이 클릭하면 다운로드 받게할수 있냐요?

    contact@gorillapaper.com

    • BlogIcon soyoja 2008/10/22 11:12  댓글주소  수정/삭제

      그냥 링크걸듯이
      <a href="test.doc">download</a>
      이렇게 하시면 됩니다.
      test.doc 위치는 실제 서버에 존재하는 상대경로로..

  4. BlogIcon 임수창 2008/10/23 23:12  댓글주소  수정/삭제  댓글쓰기

    감사합니다.

  5. 디믹 2008/11/17 02:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다. :)
    언젠가 블로깅하다 이포스트를 지나치듯 보고 다시 기억을 떠올려 겨우겨우 검색해서 찾아왔어요 -ㅅ-;;;

    구글에서 "1.jpg 이미지 일괄 다운" 로....
    1.jpg 라는 단어가 큰 역활을 흐흐;;;

    • BlogIcon soyoja 2008/11/17 13:46  댓글주소  수정/삭제

      사실은 저도 acm.kaist.ac.kr 사이트에서 사진들을 일괄 다운받을 목적으로 뚝딱뚝딱 만든겁니다 ^^

  6. BlogIcon 임수창 2009/02/27 02:16  댓글주소  수정/삭제  댓글쓰기

    혹시 제 웹사이트는 미국에서 종이류를 판매하는 웹스토어인데 Google, Yahoo Sitemap submission과 SEO ranking 에 대해 잘 아시는 분은 저에게 연락 좀 부탁드립니다. contact@gorillapaper.com

이름 암호 홈페이지



2001 년부터 ACM-ICPC(세계 대학생 프로그래밍 경시대회) 아시아지역 대회와 겸해서 치뤄지는 전국 대학생 프로그래밍 경시대회, 올해도 어김없이 개최된다.

2008 년 11월 6일 - 11월 7일, 백범 김구 기념관.

새정부 들어 정보통신부가 없어져서, 그 전까지 본 대회를 주관하던 정부 주무부서가 정보통신부에서 행정안전부로 바뀌었다. ( 개인적으로는 교육과학기술부가 담당하는 것이 맞지 않나 싶었지만... 알아보니 정부부처가 통폐합되면서 기존에 정보통신부에서 맡아오던 IT 관련 업무가 행정안전부로 이관되었다고. )

주최는 행정안전부, 대회 메인 스폰서는 IBM. ( IBM 은 Regional Contest 에서는 별 존재감이 없긴 하지만... )

Secondary 스폰서는 예년과 마찬가지로 NHN 이 맡고 금년들어 Nexon 이 새로 스폰싱을 한다.
이런면을 보면 알고리즘 문제풀이 경시대회의 가치에 대해서 IT 기업체들도 그 중요성을 공감하는 분위기가 확산되는 듯 하여 흐믓하다.

 
사용자 삽입 이미지

올해의 경우 대회 포스터가 꽤나 맘에 들게 나왔다. 
C / C++ / Java 라는 대회 사용언어와 "Think / Create / Solve" 라는 대회의 슬로건을 잘 형상화 한 듯.

한편, 본 대회와 관련해서는 2 가지 article 에 대해서 써야 하는데...

2008 년 IT 대학생 프로그래밍 경시대회 ( 교내대회 )  2008/09/20

전국대학생 프로그래밍 경시대회 및 ACM-ICPC Asia Regional Contest 의 국내 예선,
ICPC Korea National Programming Contest, 2008/09/27

포스팅 거리가 자꾸 밀리는 군.. -0-

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/255 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지



요즘 재미있게 하는 것 중 하나가 바로 Google Code Jam 이다.
구글에서 개최하는 프로그래밍 경시대회라 할 수 있는데, 세계 각국의 프로그래머들과 경쟁하면서 나 자신을 돌아볼 수 있는 좋은 기회가 된다 할 수 있다. ^^

구글 코드잼에 대한 소개는 여기를 참조...

지난 7월 16일 예선전 격인 Qualification Round 가 열렸고, 7월 26 - 27일 양일에 걸쳐 1차 예선인 Round1 이 열렸다. 대략 7 천명이 참가하여 ( 실제 대회 등록한 사람 숫자는 이보다 많을 듯.. Qualificaiton Round 에서 한번이상 submit 을 한 사람 숫자가 7천이다 ) Qualification Round 을 6800 명 정도가 통과했고, Round1 을 2520 명이 통과했다. Round 2 에서는 다시 상위 1000 명이 Round 3 에 진출하며, Round3 에서 상위 500 명이 Semi-Final 인 온사이트 Local Contest 에 출전해서 세계 각국의 구글 지사에서 지역예선 최종전을 치룬다. 그리고 여기에서 선발된 최종 100 명은 11월 14일 캘리포니아 마운틴 뷰의 구글 본사에서 결승전을 치룬다.

2008 Google Code Jam Qualification Round 후기
2008 Google Code Jam Round1C 후기

원래 목표가 2 라운드 진출이었는데 목표 달성은 한 셈. ;)

올해의 Google Code Jam 은 어떤 개발 환경이든, 어떤 프로그래밍 언어를 사용하건 전혀 제약을 두지 않는 점이 특징이다. 참가자는 문제에서 주어지는 Input 에 대해서 올바른 Output 만 제출하면 된다.
또 한가지 재미있는 것은, 같은 문제에 대해 Small Input 과 Large Input 으로 나누어 문제 스펙을 달리 한다는 것. Small Input 에서는 Brute Force 로 그냥 풀수도 있는 문제를 Large Input 에서는 제한시간이 초과 되도록 디자인 되어 있다. 이런 부분은 정말 문제 디자인을 잘한것 같다. 알고리즘과 문제해결에 대해 해박한 지식이 없으면 Large Input 에서 제시하는 대용량 인풋 처리가 불가능해 진다. brute force 로 풀릴 수 있는 간단한 문제라 할지라도 입력 횟수가 커지면 새로운 방식으로 접근해야 한다는 것을 몸소 보여주는 좋은 문제들이다.

구글 코드잼 로고도 재미있다. 리프레시 할때마다 하단의 hello world 코드가 조금씩 달라지는데, 다양한 언어로 코드 잼에 참여할 수 있다는 것을 상징적으로 보여준다.

재미있게! 즐겁게! 달려보자 ;)

사용자 삽입 이미지

Perl / Python
사용자 삽입 이미지
C
사용자 삽입 이미지
C++
사용자 삽입 이미지
Java


이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/233 관련글 쓰기
댓글을 달아주세요!
  1. 지나가던행인 2008/07/29 09:52  댓글주소  수정/삭제  댓글쓰기

    와! 2라운드 진출 축하드려요
    멋진데요ㅋ
    연습문제에서 좌절한 한 고등학생이었습니다 ㅠㅠ

  2. zf 2008/09/23 11:31  댓글주소  수정/삭제  댓글쓰기

    정말 이런분야에서 뛰어난인재들 많은데 민폐끼치거나 별로 생각이없어서 안하는 사람이 많을거라본다.
    정말 숨은재야의 고수들이 얼마나많은데

이름 암호 홈페이지



구글에서 전세계 프로그래머들을 대상으로 주최하는 프로그래밍 경시대회, Google Code Jam (이하 GCJ) 이 오늘 (7월 17일) 시작되었다.

구글 코드 잼 홈페이지

구글 코드 잼 2008 개최 - 구글코리아 공식 블로그의 소개글

구글 코드 잼 2008 임박... 전세계 프로그래머들의 경연장


2007 년에는 Google Code Jam - Latin America 대회만 열렸는데 ( 라틴 아메리카 국가의 사람들만 참가가 가능한 지역 대회 ), 구글은 이 대회를 끝으로 더이상 기존의 TopCoder 플랫폼을 이용한 GCJ 는 열지 않고, 구글에서 자체적으로 개발한 대회 플랫폼을 통해 대회를 치루겠다 공언한 바 있다.

그간 몇번의 알려지지 않은 Beta 대회와 정식으로 열린 Beta 대회 와 Practice Contest 를 통해 공개된 GCJ 의 새로운 대회 방식은 TopCoder 와 ACM-ICPC 의 장점들을 섞어놓은 듯한 모습이다.

우선 각 문제마다 배점이 다르다는 점이 ACM-ICPC 와 다르다. ACM-ICPC 에서는 모든 문제가 같은 비중을 갖고 있으며, 문제를 푼 횟수로 등수를 산정하기 때문에 쉬운 문제부터 찾아서 빨리 푸는 전략이 당연한 정석으로 되어 있다. 반면 TopCoder 에서는 문제의 난이도에 따라 배점 차이가 커서 ( 250, 500 ,1000 점... 문제의 난이도에 따라 배점이 2 배씩 차이가 난다! ) 어려운 문제를 먼저 푸는 전략을 쓰기도 한다. 그리고 쉬운 문제는 틀려도 어려운 문제를 맞춰서 등수가 뒤바뀌는 경우도 많이 발생한다.

GCJ 에서는 문제 별로 배점이 다르며, 같은 문제마다 Input case 의 Boundary 가 다른 2 가지 Input 이 주어진다는 점이 특이하다. 즉, Small Input 과 Large Input 의 두가지가 제공되는데, Small Input 은 검사할 범위가 작으므로 쉽게 해결할 수 있으며, 맞는지 틀리는지 여부를 바로 알 수 있다.

Large Input 은 Small Input 보다 입력값의 범위도 더 크며, 실행 결과는 TopCoder 처럼 대회가 종료된 이후에 알려주기 때문에 스스로 생각하기에 완벽하다고 생각되는 솔루션을 충분히 테스트를 거친 후에 제출해야 한다.

Qualification Round 의 경우 Small Input 은 문제당 5점, Large Input 은 문제당 20 점이었다.
주어진 모든 Test Case 를 통과해야만 점수를 받을 수 있으며, 테스트 케이스에 대해서 하나라도 틀릴 경우 0 점이다. ( All or Nothing 방식. 부분점수란 없다. ) 그리고 ACM-ICPC 와 마찬가지로 점수 ( 문제푼 횟수) 가 같을 경우에는 빨리 푼 순으로 시간이 산정되며, Small Input 문제를 틀리는 경우 Penalty Time 이 추가된다.

GCJ 는 TopCoder 와는 달리 별도의 플랫폼이 필요없이 웹 브라우저만 가지고 대회를 치룰 수 있었다. 플랫폼에 자유롭게 한 것은 많은 참가자들을 배려한 부분으로 보여진다. 또한, 개발 언어에 대해서도 특별한 규정이 없었다. Input 에 대해서 원하는 Output 만 출력한다면 어떤 개발 언어를 사용하든지 문제가 될 것은 없다는 의미인 것 같다.

GCJ 는 7월 17일 시작하여 4 번의 온라인 라운드와 준결승 오프라인 라운드로 나누어 치뤄지며, 최종 결선에 오르는 100 명은 미국 마운틴 뷰의 구글 본사에서 최종 결승전을 치룬다.

대회 상금

총 상금은 8 만달러 규모...  우승상금 1 만달러.

재미있는 것은 우승자에게 부상으로 전세계 어느곳이든 구글의 사무실에서 식사를 10 번 할수 있는 기회를 제공해 준다는 것이다. ( 최대 10 명까지 친구를 데리고 갈 수 있다 한다! ) 직원에게 무료로 제공하는 맛있고 럭셔리한 식사로 유명한 구글의 근무환경에 대한 자부심이 엿보인다.

PS) 아직도 참가 신청과 참여가 가능하므로 관심있는 분들은 참가를...
이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/229 관련글 쓰기
댓글을 달아주세요!
  1. Radiant 2008/07/20 09:15  댓글주소  수정/삭제  댓글쓰기

    맨날 눈팅만 하다가 실제로 덧글 남겨봐요 ㅎㅎ
    SRM에서 오타로 Radient를 사용중인 유저입니다 ㄱ-

    사실 코드잼도 관심 많았는데, 지난번 TCO '08의 쓰라린 추억때문에 그냥 접어버렸습니다.. ㅠㅠ
    역시 세계 레벨의 벽은 높은것 같아요 ㅠㅠ

  2. Radiant 2008/07/21 00:23  댓글주소  수정/삭제  댓글쓰기

    일단 참가는 할 예정인데, Internet Competition 날에 너무 중요한 면접이 겹쳐서
    완전 곤란한 상황이 되었습니다 ㅠㅠ

    그래도 다행히 면접은 오전이라 어떻게든 양립이 가능할 것 같기는 한데,
    혹시라도 곤란한 상황이 생길까봐 불안하네요;;;

이름 암호 홈페이지



아주 좋은 글을 읽었다.

C++ 과 C# 의 차이점 정리

이분, 개발/개발언어 관련해서 꾸준히 좋은 글들을 많이 쓰신다. 저분의 블로그는 2007 년 Tistory 100 대 블로그에 오르기도 했더군.. (부럽다 ㅋ)

마이크로소프트에서 C++ 는 Naive Language 라 하고, C# 을 Managed Language 라고 표현한 것을 읽은 적이 있다. 분명 C# 은 개발자 입장에서 더 강력한 기능을 손쉽게 제공하고, 또 버그가 날 가능성을 줄여주는 파워풀한 현대적인 개발언어임에는 분명하다.

하지만 글에서 언급한 것과 같이 컴파일 한 바이너리가 커지는 문제, C++ 에 비해 느린 실행속도 등을 고려해 볼때 임베디드 시스템 개발용 언어로는 부적합 하다고 생각된다. 아무리 임베디드 시스템의 하드웨어 성능이 점점 좋아지고 있다고 해도... 리소스를 1byte 라도 절약하고 속도를 1milli sec 라도 줄여야 하는 상황에서 소프트웨어 개발 레벨에서 부터 이런 방식으로 리소스를 갉아먹는 건 매우 좋지 않다고 본다.

내가 아는 어느 팀에서는 임베디드 시스템의 OS 로 Windows CE 를 쓰고, 개발 언어로 C# 을 쓰는데,  여러가지 고민 끝에 선택한 결과겠지만, 내가 볼때 이 결정은 개발자가 편할수는 있지만 소비자나 회사의 입장에서는 불리하다고 판단된다.

Windows CE 라는 플랫폼 자체가 제품 당 OS 라이센스를 지불해야 하는 금전적 부담이 있으며, Windows CE 가 Linux 에 비해 갖는 장점은 개발자에게 친화적이고 소프트웨어 호환성이 좋다는 점 등인데, 진지하게 원가를 고려해 보고, 또 소프트웨어 변화가 적은 임베디드 환경을 생각해 본다면 좀 힘들더라도 Linux 에서 사용자가 편리한 UI 를 개발해서 서비스 하는 것이 맞다고 생각된다.

개발언어 역시 마찬가지로, C# 으로 개발을 하게 되면 개발자 입장에서 최신 언어를 사용한다는 만족감과 개발의 편리성은 증대되겠지만 제품 입장에서 보면 리소스와 퍼포먼스 측면에서 손해를 보게 된다. 추가로, 디바이스 드라이버나 연동부분의 legacy code 는 대개 C/C++ 로 되어 있어 호환성에도 문제가 생기게 된다.

결론은... 상용화 과제에 있어서는 개발자가 유리한 방향으로 개발을 해서는 안되고 사용자가 유리한 방향으로 개발이 진행되어야 하는데... 그것이 사실 쉽지 않다.  사실, 만약 Windows 개발에 익숙한 나에게 Linux 환경에서 개발해야 하는 과제가 주어지면 나 역시 불평 불만이 많을 것이다... ㅋㅋ

사실, 개발 난이도의 증가에 따른 개발비용과 리스크의 증가등도 분명 중요한 고려사항이 될 수 있다. 하지만 기술적인 어려움을 논외로 하고, 비지니스 측면을 진지하게 고려한다면 힘들더라도 항상 사용자 위주로 생각하면서 개발을 해야 할 것이다.
이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/227 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon hyperdash 2008/07/13 21:15  댓글주소  수정/삭제  댓글쓰기

    C/C++이 최고지....

    VC8.0이 되면서 안전한 API들도 추가되었고

    다른 언어로 대체하는 것보다는 한차원 높은 개발 방법론이 더 중요하지 않을까?

    • BlogIcon soyoja 2008/07/14 00:33  댓글주소  수정/삭제

      주력언어가 있어야겠지만 일하다 보면 다른 언어들도 알아두는 것이 유용한 경우가 많더군...

  2. BlogIcon blueecho 2008/07/15 04:28  댓글주소  수정/삭제  댓글쓰기

    개인적인 생각으로도 아직은 C#은 무리인거 같아. 하지만 뭐... 혹시 알아?
    시스템의 발전 속도가 너무 빨라서 말야.. -_-;;

    나같은 경우도 예전에는 메모리를 줄이면서 성능을 포기하는 경우가 많았는데 요즘은 메모리 많이 쓰더라도 최대한 성능 좋은 쪽 아니면 전력소모 작은 쪽으로 가는걸로 봐서 개발에도 트랜드가 있지 않을까 싶네 그랴.. ^^;;

    뭐.. 이런 문제야 실무 수행하는 자네들이 더 잘 알겠지만 말야.. 흐흐~
    사용자 위주의 개발이라고 해도 개발자 입장에서는 좀 더 편하게 하고 싶은 맘도 있고 말야... 뭐, 앞으로는 다품종 소량생산이라고 하니 TTM관점에서는 개발자가 빨리 개발할 수 있는 환경도 나름대로는 의미있다고 생각되네...

    하여간, 덕분에 좋은 글 읽고 간다. ^^

    • BlogIcon soyoja 2008/07/16 06:07  댓글주소  수정/삭제

      엉...
      납기를 제때 맞춰서 빠르게 개발할 수 있는 환경도 분명 중요하지..
      확실히 프로젝트는 여러가지 환경 변수를 고려해야 하는 것 같다.

이름 암호 홈페이지



금년에도 어김없이 ACM-ICPC 의 시즌이 시작되었다. 
ACM = Association of Computing Machinary : 미국 컴퓨터학회,
ICPC = International Collegiate Programming Contest : 세계 대학생 프로그래밍 경시대회

Regional Contest 의 전초전 격이라 할 수 있는 각 지역의 국가별 / 학교별 예선들은 이미 전 세계적으로 한창 진행중이다. 2000 년 처음 치뤄진 이래 9 년째를 맞고 있는 ACM-ICPC 의 서울 지역 대회도 일정이 확정되었다.

ACM-ICPC Asia Regional Contest - Seoul, 대회 홈페이지

ACM-ICPC, 서울지역 대회 등록 페이지

ACM-ICPC Asia Regional Contest - Seoul 대회 스텝의 블로그



올해는 다른 해에 비해 각 지역별 예선의 참가팀 등록이 상당히 지지부진 한 편이다.
가장 큰 이유는 새로 리뉴얼 한 ACM-ICPC 공식 홈페이지가 너무 번잡스럽고 등록과정이 직관적이지 않기 때문이라고 생각한다. 여기에 각 지역별 대회의 일정이 아직 결정되지 않은 곳들도 너무 많다.

올해 ACM-ICPC 의 아시아 지역 대회는 총 15 개 지역에서 치뤄진다.  (TBA = To Be Announced )

사용자 삽입 이미지


중국
- 북경 (Beijing) : TBA
- 성도 (Chengdu) : 2008/11/01 - 2008/11/03
- 항주 (Hangzhou) : TBA
- 합비 (Hefei) : TBA
- 하얼빈 (Harbin) : 2008/10/11 - 2008/10/12

인도
- 암리타푸리 (Amritapuri) : TBA
- 칸푸르 (Kanpur) : TBA

일본
- 아이즈 (Aizu) : 2008/10/25 - 2008/10/26

이란
- 테헤란 (Teheran) : TBA

대만
- 타이페이 (Taipei) : 2008/11/08

말레이시아
- 쿠알라룸프르 (Kuala Lumpur) : TBA

베트남
- 호치민 (Ho-Chi-Min City) : TBA

인도네시아
- 자카르타 (Jakarta) : 2008/10/20 - 2008/10/21

방글라데시
- 다카 (Dhaka) : TBA

한국
- 서울 (Seoul) : 2008/11/06 - 2008/11/07

개인적인 관전포인트 몇 가지를 들자면...
우선 몇년만에 일본 대회와 한국 대회의 일정이 환상적으로 겹치지 않게 되어 금년에는 한국 지역 대회에서 일본팀들과 경쟁할 가능성이 매우 높아진 점이다. 매년 중국팀들이야 꾸준하게 참가해 왔지만, 일본팀을 볼 가능성이 생긴 것은 꽤 오래간만인듯 싶다. 매해 일본 대회와 한국 대회의 일정이 겹치는 바람에 이렇게 되었는데, 올해는 재미있게 ICPC 한일전을 관전해 보는 것도 즐거운 점이 될 듯 하다.

두번째로 한국 팀들의 성적 여부이다. 후배들이 올해 어떤 성적을 거둘지도 궁금하고, 한국팀이 금년에도 한국 지역 대회에서 챔피언의 자리를 지킬지도 관심사이다. 최근 3 년간 한국지역 대회에서 우승을 해 온 서울대학교의 Defending Champion 여부도 관심이 가며, 그 외에 TopCoder 에서 요새 좋은 모습을 보여주고 있는 몇몇 학교들의 금년 성적도 기대가 많이 된다. 

끝으로 매년 한국 대회는 질적으로, 양적으로 성장해 왔는데 금년에는 과연 몇학교, 몇팀이나 대회에 참가를 할지도 관심이다. 사실 ACM-ICPC 는 아직까지도 몇몇 학교와 참가 경험이 있는 소수의 학생 및 대회관계자들을 제외하고는 이런 대회가 있는지 조차 모르는 사람들이 IT 업계에서 태반이다. OB 의 입장에서. 대회가 좀더 많이 활성화되고 많은 지원을 받게 되어 중국처럼 우리나라의 ICPC 대회도 계속 커졌으면 하는 바램이다.


이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/226 관련글 쓰기
댓글을 달아주세요!
  1. Toivoa 2008/07/13 11:38  댓글주소  수정/삭제  댓글쓰기

    2004년에도 일본이랑 10일 차이었습니다. -0- 일본 대회도 재밌죠

    • BlogIcon soyoja 2008/07/14 00:29  댓글주소  수정/삭제

      아하... 지금 살펴보니 일본 대회와 일정이 겹치지 않은 해가 몇번 있었네요.. Toivoa 님께서 에히메 대회에 출전했던 년도군요.. ^^
      좋은 지적 감사함다.. 본문 수정했습니다. ;)

이름 암호 홈페이지



ACM-ICPC 서울지역 대회를 빼면 국내에서 대학생 이상 일반인을 대상으로 정기적으로 열리는 알고리즘 문제풀이 대회는 없다시피 했는데, ( TopCoder 나 IPSC 같은 주최자가 외국인 대회들 말고... ) 썬 코리아에서 지난 5월에 자바 알고리즘 경진대회 라는 것을 개최했다더라..

http://sdnkorea.com/blog/580

사용자 삽입 이미지

역시나 예상했던 것 처럼, 문제풀이 대회에서 이름을 날리던 TopCoder 의 상위 멤버들이 1-2-3 등을 모조리 휩쓸어버렷다.

낭중지추(囊中之錐 ) 라고 내가 좋아하는 고사성어가 있는데, 송곳은 주머니에 감춰놔도 삐쭉 쏫아 나와 자신의 존재를 알린다는 뜻. 한마디로 잘하는 사람은 어느 대회에서 든지 간에 입상한다?? 라고나 할까... ㅋ

대회 결과

1등 - 팀번호 12. Andromeda Express        / 팀원 : 구종만(
JongMan), 김진호(Astein), 정현환(libe)

2등 - 팀번호 08. Ryumeo & (Zzi|Jin)liet   / 팀원 : 류원하(ryuwonha), 강지훈(zizavino), 송은진

3등 - 팀번호 01. C#                                    / 팀원 : 최백준, 안재원(i274), 김우현(wooyaggo)


시상내역

 
- 금상(1팀) : 상장 및 100만원 상품권
 - 은상(1팀) : 상장 및 50만원 상품권
 - 동상(1팀) : 상장 및 30만원 상품권



최백준이란 분은 예전에 TopCoder 에서 GumX 라는 아이디로 상당히 인상적인 ( yellow rating 에 있었음.. ) 활약을 보이던 분인거 같은데 지금은 탈퇴를 했는지 TopCoder 에서 검색이 안된다.

3 등 팀이 작년도 ACM-ICPC 서울대회에서 은상을 받았던 서강대학교 KURU 팀이다. (구글링 해본 결과 팀원도 모두 같군.. ) 팀원 세 명이 모두 졸업을 하지 않은 상태이고 그대로 올해에도 출전할 가능성이 높아서 금년에도 좋은 성적을 거둘 것 같다.

대회 주최측에 문의를 해본 결과 파트타임 대학원 학생도 학교에 소속되어 있고, 학생증으로 자신의 신분을 증명할 수 있으므로 대회 참가가 가능했다. 그래서 나도 참가 자격은 있는 셈이었는데 사실 입상은 어렵더라도 재미삼아서라도 참가해 볼까 했는데 팀원 모으는 것이 정말 어렵더라.. -0-  (결국 생각만 하다가 참가 못했음)

내년에도 대회가 열린다면 대학원 동기들을 꼬셔서라도 함 참가해 보고 싶다는 생각이 팍팍 든다.

PS ) 썬 코리아가 대회를 키우고 좀 더 많은 참가자들을 참여시키려면 대회도 썬 코리아의 회사 블로그 내에 만들어 놓지 말고 단독 대회 홈페이지로 만들고, 또 기출문제와 전체 순위도 공개하면 어땠을까 하는 바램이다.
암튼 1회성이 아닌 매년 개최되는 정기적인 대회가 되었으면 한다. ;)
이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/210 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon 질문 2008/06/29 18:52  댓글주소  수정/삭제  댓글쓰기

    탑코더를 검색하다가 왔지만, 3등 팀의 아이디 색은 1,2등과 다르게 전부 파랑인데 왜 상위권인가요

    • BlogIcon soyoja 2008/06/29 20:36  댓글주소  수정/삭제

      개인적인 의견을 말씀드리자면 ^^
      현재 TopCoder 의 한국인들 중에서 Rating 이 파란색 이상인 분들은 총 48 명입니다. 그중에서 졸업하여 대회 참가가 안되는 사람, 개인사정으로 참가 못하는 사람등을 제외하면 실제 대회 참가자들 중에서는 Rating 이 Blue 이상만 되어도 충분히 상위권이 가능하다고 생각합니다.
      바꿔말하면, 사실 문제풀이 대회의 참가자들 대부분은 Div2 수준의 코더들이며, Div1 의 코더들이 팀을 이룬다면 ICPC 를 비롯한 국내 레벨의 문제풀이 대회에서는 대개 입상권을 노려보는 것이 가능하다고 생각됩니다.

  2. 질문 2008/07/26 23:15  댓글주소  수정/삭제  댓글쓰기

    제가 알기론 ACM-ICPC준비하는 사람이 모두 TopCoder를 하는 것이 아니아서 상위권은 아니라고 보고요

    현재 3등팀 아이디 색이 없음, 블루, 그린인데, 저 팀은 좀 운빨인거 같네요

    • BlogIcon LIBe 2008/07/31 21:18  댓글주소  수정/삭제

      3등을 수상했던 C#팀의 경우 앞에서 언급되었듯, 많은 강팀들이 참가한 ACM-ICPC에서도 상위권에 수상한 팀입니다.

      단순히 '운빨'로 치부하기에는 KURU팀의 당시 퍼포먼스를 봤을때는 좀 아니라고 생각됩니다.

      PS. 실명을 안밝히시고 글을 남기셨길래 떡밥이라고 생각하고 물어드렸습니다.

  3. 지나가다 2008/10/18 13:36  댓글주소  수정/삭제  댓글쓰기

    이런거 대관절 어떻게 하는건지......................
    C# 팀은 과내에서 상당히 유명한 사람들이라 심심풀이로 검색해보니까 이런 것들도 하고 있군요..
    한분이 수업시간마다 교수님을 물고 늘어지기로 유명해서..-_-a
    인상적인 활약을 했다는 최백준님은 제가 봤을 때는 일종의 '기인'입니다.
    코딩을 그렇게 잘하면서 귀찮아서 간단한 학교프로그래밍 점수는 바닥쪽이 많다는...

    • BlogIcon soyoja 2008/10/18 17:29  댓글주소  수정/삭제

      ㅎㅎ 유명한 분들이군요...
      금년 ACM-ICPC 에도 C# 팀 멤버들이 coderani 라는 팀으로 출전하는 것으로 알고 있습니당..

    • BlogIcon Baekjoon Choi 2008/11/09 22:15  댓글주소  수정/삭제

      안녕하세요. 최백준입니다.

      저 학교프로그래밍 점수 바닥 아닌데요 ㅜ.ㅜ

      뭔가 큰 오해하신듯...

이름 암호 홈페이지


대회 홈페이지에 공개된 Final Standing 입니다.


Rank School Name Team Name Solved Penalty
1 Seoul N. U. WE ARE BUT MEN, ROCK! 8 944
2 Zhongshan U. ZSU_Dubhe 8 1132
3 ICU Winter Coders 7 917
3 Seoul N. U. Incoming 7 816
4 HKUST ClearWaterBay 7 1040
5 Korea Advanced Institute of Science and Technology Cow Bessie 6 785
5 Seoul N. U. Mighty Friend 6 565
6 Sogang U. KURU 6 1066
7 Yonsei U. Keyboard Warrior 5 565
8 Tianjin U. TJU-DEmon 5 679
8 Korea Advanced Institute of Science and Technology ALLCHOL 5 883
9 POSTECH Poscat 4 369
9 Korea Advanced Institute of Science and Technology Farmer John 4 242
9 ICU Strawberry 4 295
9 ICU Anytime 4 306
10 Kyung Hee U. Zraler 4 503
11 Soongsil U. Inspiration 4 511
12 Korea U. DaTulRae 3 190
13 Inha U. Oh Duck Square 3 198
14 Ajou U. the pulza 3 234
15 Taiwan U. AC 3 323
16 Kookmin U. Bukak03 3 558
16 Soongsil U. GUTS 3 377
16 Yonsei U. August 3 464
16 POSTECH Art of Brothers 3 523
17 The Catholic U. of Korea Dot Timer 3 616
17 Soongsil U. GOA 3 619
17 Korea U. J. Lavis 3 921


- 제 7회 전국 대학생 프로그래밍 경시대회 수상 결과
( 학교 순위로 상위 10개 학교를 선정하여 수상하며 중복되는 학교의 경우 상위 1개 팀만 수상함.
상금 : 대상 월드파이널 출전경비 지원, 금상 100만원, 은상 70만원, 동상 50만원 )

대상
서울대학교 WE ARE BUT MEN, ROCK

금상
ICU (정보통신대학교) Winter Coders
KAIST (한국과학기술원) Cow Bessie

은상
서강대학교 KURU
연세대학교 Keaboard Warrior
포항공과대학교 Poscat

동상
경희대학교 Zraler
숭실대학교 Inspiration
고려대학교 DaTulRae
인하대학교 Oh Duck Square

총평
- 서울대의 2년 연속우승
서울대는 작년에 이어 2 년 연속으로 우승을 차지하였다. 온라인 예선에서 서울대의 세 팀이 1-2-3 등을 차지한데 이어 본선인 서울대회에서도 1-3-5 등을 차지하며 두터운 선수층을 과시하였다. 이 독주체제를 무너뜨릴 팀이 과연 언제 등장할지 관심사다.

- 중국의 계속되는 거센 도전
2005년 대회에서 상해교통대학 (Shanghai JiaoTong Univ.) 이 우승을 차지한 이래 작년과 올해 연속으로 중국팀이 2 위를 기록한다. 다행히 올해도 대회 우승은 한국팀이 수성하기는 했으나 중국팀은 국가차원의 대대적인 지원속에 매년 실력과 참가팀이 급증하는 추세라 향후에도 중국의 도전은 계속 거세질 전망이다.

- 여전한 전통의 강호들
ICU 와 KAIST, 포항공대, 연세대는 올해도 10위 이내의 성적을 기록하며 전통의 강호임을 입증하였다. 현재 월드파이널 출전은 서울대와 중산대가 확정적이며, 3위 ICU 도 와일드 카드로 월드파이널 출전 가능성이 열려있는 상태이다. 한편, KAIST 는 월드파이널 출전을 위해 아시아 타지역 예선에 기대를 걸어야 하는 상황이다.

- 작년과 올해의 순위변화
작년에 금상 (5위) 를 기록하며 깜짝 스타로 떠오른 카톨릭 대학은 작년의 멤버 대부분이 졸업을 하며 올해는 입상에 실패하였다. 반면 작년에 수상하지 못했던 서강대와 경희대가 좋은 성적을 거두면서 수상에 성공하였다. 2006년 입상에 실패했던 고려대학교도 올해는 다시 입상에 성공하였다.

- 꾸준한 숭실대
2003 년 이래 5 년 연속으로 입상에 성공, 대학생 프로그래밍 경시대회 7년 동안 6번 입상(은상 2회, 동상 4회) 하는 꾸준함을 과시한다.

- 예선에서 돌풍을 일으킨 팀들의 부진
온라인 예선에서 5위를 기록하며 좋은 성적이 기대되었던 한양대가 본선에서는 부진하였다. 예선 11위의 아주대 역시 입상권 팀으로 예상하였으나 본선에서 간발의 차이로 아쉽게 입상에서 실패하였다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/121 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지


몇몇 컴파일러(VC++ 6.0, VC++ 2005 등... ) 에서 int main() 과 void main() 이 둘다 컴파일 에러없이 잘 동작하는 반면, dev C++, g++ 과 같은 컴파일러에서는 void main() 은 컴파일 에러를 낸다. 늘 습관처럼 int main() 을 쓰던터라 이번기회에 int main() 과 void main() 의 차이에 대해 자세히 찾아보았다.

우선 결론부터 말하자면 int main() 이 C/C++ 표준에 맞는 표기이며, void main() 은 잘못된 표기인 것이다.

int main()
{
 return 0;
}

위의 코드에서 return 0 의 역활은 main() 함수가 정상적으로 종료됨을 의미하는 exit(0) 을 호출하고 main() 함수를 종료하게 된다. exit 의 파라미터인 status 값은 컴파일러마다 약간씩 다르게 정의되어 있으나 일반적으로 0 이면 정상종료를 의미하며 0 이외의 숫자는 pre-defined 된 각각의 에러 타입을 의미한다.
참고로 Visual C++ 2005 에서는 이 status 가 다음과 같이 STDLIB.H 에 정의되어 있다.
#define EXIT_SUCCESS    0
#define EXIT_FAILURE    1

그러므로 void main() 으로 코딩을 한다면 설사 컴파일러가 컴파일 에러를 발생시키지 않는다 할지라도 프로세스 상에서는 main() 이 올바르지 않은 종료조건을 OS 에 리턴하고 자신을 종료할 가능성이 있게 된다.

왜 그렇다면 많은 서적과 예제에서 여전히 잘못된 표기인 void main() 을 쓰고 있을까?

초창기의 C 에서는 void 타입의 함수란 존재하지 않았으며, return 이 의미가 없는 경우에는 int 형 garbage 를 리턴하는 함수를 썼다 한다. 초기의 이러한 전통때문에 리턴값이 별 의미없는 int 형 함수들이 시간이 지나면서 프로그래머들의 취향에 따라 void 형 함수들로 고쳐 사용되었는데 이 과정에서 main() 함수도 void main() 으로 많이 사용되어진 것이 아닌가 추측된다. void main() 으로 실행할 경우 default 로 정상종료를 시키는 컴파일러들이 많아짐에 따라 프로그래머들은 별 문제 없이 이러한 코딩습관을 갖게 되었고, 사용자들이 이런 습관대로 쓰는 경우가 많아지자 컴파일러 제작사들도 사용자들의 습관에 따라 void main() 을 warning 이나 컴파일 에러없이 컴파일 되도록 만들게 되었다... 이것이 유력한 주장이다.

참고 : http://www.eskimo.com/~scs/readings/voidmain.960823.html

또다른 참고 : http://libe.tistory.com/2861180

사실 이건 그렇게 대단한 이슈는 아니지만 가끔 궁금해하는 사람들이 있어서 정리해 보았다. 약간 귀찮더라도 코딩은 표준대로 쓰는 것이 향후의 이식성을 고려할 때 좋을 것 같다 = )

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/100 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon Hikikomori 2007/09/30 09:32  댓글주소  수정/삭제  댓글쓰기

    히히, 전 이제 막 씨언어 접한 학생인데,
    학교에선 맨날 교수님이 Visual C 로, 문자 출력시에 void main()을 쓰더라구요,
    전 dev++에 익숙해서 그런지 맨날 void 쓰니까 막햇갈려서,
    그래서 그냥 int main() 이것만 써요,ㅋ

    왜 그럴까 궁금했는데, 이제 쫌 알겠어요, 게시글 굿또!

  2. BlogIcon hyperdash 2007/10/02 01:06  댓글주소  수정/삭제  댓글쓰기

    호옷... 이거 1학년때가 생각나는군....
    k = 1;
    k++ + ++k = ?
    ++k + k++ = ?
    뭐 이런거 고민하고 그랬었지...

  3. skyblueang 2008/11/07 13:19  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다~
    좋은내용이라 퍼갑니다~ ^^

  4. BlogIcon merovingian 2008/12/23 22:17  댓글주소  수정/삭제  댓글쓰기

    좋은 내용 잘 보고 갑니다. 퍼가요~

이름 암호 홈페이지


구글 공식 블로그에 불과 몇시간 전에 공개된 내용이다.

http://googleblog.blogspot.com/2007/09/our-plans-for-code-jam.html

즉, 구글이 조만간 Google Code Jam 을 개최하기 위해서 준비하고 있으며, 2003 년 부터 진행되었던 TopCoder 의 플랫폼을 활용한 방식이 아닌, 구글이 자체적으로 준비, 개발하는 새로운 프로그래밍 대회 형식이 될 것이라고 공개한 것이다.

Google Code Jam 이란?
- Google 이 주최, 후원하는 전세계 모든 프로그래머를 대상으로 한 대규모 프로그래밍 문제풀이 대회이다. 작년의 경우 전세계에서 약 2 만명이 참가하여, 최종 결선에 오른 100 명은 뉴욕에서 결선 대회를 치루었다. 구글에서 뉴욕까지 참가하는 대회 경비를 모두 후원하였으며, 1위에게는 1만 달러의 상금이 주어졌다.

작년의 경우 한국에서는 2 명이 최종 결선에 참가하여, 그 중 한명은
Google 에 입사하였고 나머지 한분도 알고리즘 문제풀이 대회에서 굉장히 유명한 활약을 하시는 분이다. ^^


사용자 삽입 이미지

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/89 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지



 2005 년 제 15회 JOLT 상 수상작.
컴퓨터 관련 서적으로 꽤 높은 순위로 꾸준하게 팔리고 있음.


사용자 삽입 이미지


많은 사람들이 읽고, 추천한 책이다. 꽤나 여러날을 걸려서 읽었는데, 읽은 소감은 한마디로 "과연 많은 사람들이 공통적으로 추천할만한 이유가 있다" 였다.

사용자 삽입 이미지
이 책은 조엘 스폴스키(Joel Spolsky) 라는 이스라엘 출신의 사업가겸 소프트웨어 엔지니어가 자신의 IT 분야의 경험과 기술적인 지식을 바탕으로 컴퓨터와 IT 업계전반에 걸친 여러가지 주제에 대해서 가볍고 재미있게 다루고 있다. 원래 이글 자체가 조엘의 블로그 (
http://joelonsoftware.com) 에 연재되었던 이야기들을 묶은 것이라서 수필집을 읽는 기분으로 가볍게 에피소드 별로 볼 수 있어서 좋았다.

IT 업계에 몸을 담고 있는 종사자라면 여러가지로 공감이 갈수 밖에 없는 이야기들이 너무나 많아서, 사실 이 책을 나름 음미하면서 꾸준히 읽다보니 이렇게 다 읽는데 시간이 오래 걸린 것 같다.

기억나는 몇가지 이야기를 적어보자면, 우선 이 책에서는 소프트웨어 개발에 있어서 설계와 명세의 중요성을 강조하고 있다. 이 부분은 정말 프로젝트를 수행하면서 실제로 뼈져리게 느끼게 되는 사항이다!

개발에 착수하기 전에 설계와 명세가 부정확하거나 모호한 부분들이 남아있게 되면 나중에 코딩작업에 들어가서 필연적으로 이런 사항들이 엉터리로 구현되거나 개발자의 임의로 구현하기 십상이다. 그리고 이러한 모듈들은 결국 버그로 이어진다. 프로그래머들은 소위 말하는 "코딩중독" 증에 빠지기 쉬운 경향이 있어, 코딩 시작전 차분하게 개발하려는 명세와 스펙을 종이에 적어보고 구현방법을 설계를 잡아놓은 후에 개발하면 꼼꼼하고 깔끔한 구조의 코드가 나올 수 있는 것을, 일단 구현부터 시작해놓고 보면 땜질식 코드가 양산되고 버그와 코딩시간도 기하급수적으로 늘어나는 경험을 많은 이들이 해 보았을 것이다. 중간중간 변경되는 요구사항과 불명확한 스펙때문에 소스코드를 여기저기 고치다보면 나중에는 완전히 누더기가 되어버려서 소스코드가 누구도 쉽사리 손대기 어려운 상태가 되어버리는 경험을 해본 사람들이 많을 것이다.

소스버전 컨트롤과 일일 빌드의 중요성을 언급한 것도 매우 와 닿는다. 이름만 들으면 알만한 업계에서 잘나간다는 소프트웨어 회사들조차 개발자가 코딩작업을 마친 코드를 별도의 소스 컨트롤을 거치지 않고 개발자의 하드디스크에서 바로 릴리즈용 CD 로 구워버리는 만행(!) 을 저지르는 경우가 흔하다. (보통 이런 코드들은 어이없는 실수를 갖고 있을 가능성이 농후하다 )

또한 테스트와 QA (Quality Assuarance ) 의 중요성을 강조한 것이 흥미롭다. 사실 국내 소프트웨어 업계의 여건상 전문적인 독립 QA 조직을 갖춘 회사는 많지 않다.  소규모 소프트웨어 회사의 경우 Tester 는 보통 신참개발자가 겸임을 하는 경우가 많으며 Test 만 전담하는 인력도 대개는 계약직이나 아르바이트 형태로 고용되어 Test 작업에 필요한 노하우들은 무시되는 상황이다. 심지어는 개발자레벨의 테스트만 통과하면 소프트웨어가 릴리즈 되는 경우도 있는데, 이런 소프트웨어가 시장에 릴리즈 된 후에 야기하는 무지막지한 버그에 대해서 재미있게 설명하고 있다.

한때 잘나가는 브라우저인 넷스케이프 조차 무수한 버그를 갖고 있는 상태에서 시장에 릴리즈 한 후에 사용자들의 피드백을 받아 버그를 수정한 후속 버전을 내놓는 방식으로 서비스를 해 왔다는 어이없는 에피소드를 소개하기도 한다.
( 국내 온라인 게임들도 대개 끊임없이 버그를 잡으면서 무리하게 상용서비스를 진행하는 경우가 많으니... )

조엘 자신이 개발자들을 채용하기 위해서 사용하는 면접방법에 대한 소개도 매우 흥미롭다. 사실 국내 소프트웨어 회사들이 의외로 프로그래머들을 채용하면서 프로그래밍 시험을 면접 시험으로 보는 경우가 드물다는 것은 놀라운 사실이다. ( 이건 축구단이 축구선수들의 입단테스트를 하면서 공차는 테스트를 하지 않는다는 것과 같은 이야기다. ) 한때 인터넷을 떠돌았던 넥슨의 입사시험 문제 나 테터앤컴패니에서 면접시험때 코딩시험을 보았는데 의외로 많은 사람들이 코딩이 제대로 안되더라... 는 이야기들은 그래서 많은 화제가 되고 있는 것 같다. ( 한가지를 더 소개하자면 어렵기로 유명한 구글의 면접을 들 수 있는데... 구글은 까다로운 면접으로 워낙 유명하니 여기서는 일단 스킵~ 그런데 구글 뿐만 아니라 MS 나 IBM, Yahoo 와 같은 어지간한 외국 IT 회사들은 모두 기술면접이 어렵기로 유명하다 )

이런 연유로 예전에 소개했듯이 TopCoder 같은 회사가 프로그래머의 객관적인 실력을 측정하여 IT회사에 좋은 개발자들을 소개하는 Job Opportunity 서비스 모델이 성공을 거두는 듯 하다.
( 조엘의 블로그에 가 보면 개발자가 자신의 개발능력을 어필하기 위한 가장 좋은 방법 중 하나로 ACM-ICPC 나 TopCoder 와 같은 프로그래밍 대회에서 좋은 성적을 거두는 것을 권장하고 있다. )

사실 이 책에서 다루고 있는 이야기는 참으로 방대하고, IT 업계의 역사에서 시작해서 현재의 트렌드, MS 나 넷스케이프와 같이 한 시대를 풍미한 업계들의 비하인드 스토리부터 시작해서 소프트웨어 프로젝트 관리 방법에 이르기까지 많은 재미있는 소재들을 다루고 있어서 이 블로그에서 모두 다루기는 힘들기 떄문에 기억에 남는 내용들을 시간이 날때마다 내 의견과 함께 다시 적어보고 싶다. 

어쨋든 매우 재미있고, 쉽게 읽을 수 있는 흥미로운 책이다. 생각보다 우리나라와 별반 다를게 없는 외국 IT 업계의 불합리함에 대해서도 느낄수 있고, 그런 상황을 어떻게 개선할 수 있는지에 대한 친절한 조언도 있으니 국내 IT 업계에서 소위 말하는 개발자의 고통을 느끼는 분들에게는 좋은 참고가 될 것 같다. ( 나 역시 마찬가지로 이 책에서 꽤 많은 도움을 얻었다. 물론 실천이 더욱 중요하겠지만... ^^ )

   전자공학을 전공한 내 친구는 이 책이 너무 어렵다는 의견을 주기도 했지만... IT 업계 종사자들, 특히 소프트웨어 개발자라고 스스로 생각하는 사람들은 반드시 읽어야 하는 필독서라 하겠다.

PS) 이 글은 Yes24 독자서평에 올린 글입니다. ^^

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/83 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지


리퍼러를 분석해 보면 ACM-ICPC(세계대학생 프로그래밍 경진대회) 나 프로그래밍 경시대회 정보를 검색하다 이곳에 오는 분들도 꽤 되는 것 같다. 그래서 오늘은 TopCoder 에 대해서 소개하고자 한다.

프로그래밍 분야가 다른분야와 달리 어려운 점 중 하나는 프로그래머의 역량을 객관적수치로 평가하기가 어렵다는 것이다. 예를 들면 영어 능력은 토익/토플 과 같은 시험 성적을 통해 간접적으로 나마 평가가 가능하고, 운전 능력은 그 사람의 운전 경력과 무사고 몇년~ 이런 숫자를 통해 평가가 가능하다.

하지만 프로그래머의 코딩 실력을 평가해보려면 어떻게 해야 하는가?? 정보통신부 노임단가 기준대로 학력/경력/각종 자격증 소유 여부로 매겨야 하나?? 대답은 분명히 No 다. 프로그래밍 실력이 경력/학력/자격증과 정비례하지 않는 경우가 많다는 사실은 많은 현업 개발자들의 경험을 통해 입증되었다. ( IT 업계특성상 경력/학력이 높아질수록 엔지니어는 프로그래밍에서 멀어지고 아키텍트 or 관리자를 지향하게 된다. )

그래서 프로그래머의 역량을 측정하기 위한 방법중 하나로 도입된 것이 바로 알고리즘과 문제해결 능력을 묻는 코딩문제를 얼마나 잘 푸는지를 평가하는 방식이다.
IOI (국제 정보 올림피아드)ACM-ICPC 와 같은 알고리즘 문제풀이 대회를 학교와 교육기관에서 매년 많은 예산을 들여 개최하고, Google, MS 같은 IT 기업들이 개발자들의 입사시험 문제로 알고리즘 코딩 문제를 내는 것은 바로 이러한 이유 떄문일 것이다.

하지만 IOI 와 ACM-ICPC 는 소수의 학생들을 대상으로 한정되어 있고,
UVaPKU , USACO 와 같은 프로그래밍 연습 사이트도 존재하나 비영리 사이트인 관계로 정기적인 온라인 대회도 별로 없고, 학습자료나 풀이방법에 대한 친철한 가이드도 부족하여 체계적으로 프로그래밍 연습을 하기엔 불편한 점이 많다.

이 와중에 미국의 한 회사가 정기적으로 온라인상에서 전세계 모든 개발자들을 대상으로 알고리즘 문제풀이 대회를 개최하고, 결과를 Rating 시스템을 도입해 수치/등수화한 것이 있으니 바로 TopCoder 매치이다.

사용자 삽입 이미지

TopCoder Inc. 라는 회사의 모토를 보면, 개발자들의 역량을 객관적으로 평가하기 위한 온라인 프로그래밍 대회 서비스를 열고, 이 결과들을 통해 여러 회사들이 개발자들을 쉽게 채용을 할 수 있는 Employment Service 를 연결하고 있다. (TopCoder Inc. 는 이런 회사들의 스폰서쉽이 주 수입원인 것 같다)

프로그래밍 대회는 Algorithm 분야 및 Design(컴포넌트 설계), Development(컴포넌트 개발), Marathon Match(2주간의 장기 코딩대회) 로 나뉘어지며, 본인이 참여하고 있는 Algorithm 매치는 주 1회 꼴로 열리는 SRM(Single Round Match) 을 통해서 성적이 매겨진다.

현재 한국에서는 60 여명의 코더가 활동중이며,
한국의 국가 순위는 이글을 쓰는 현재 15위 이다. TopCoder 를 통해 전세계의 개발자들 중에서 자신이 어느정도 위치인지 대략적으로나마 알수 있고, 또 자신을 단련하는 좋은 연습장이 될 수 있다. 그리고 무엇보다도 정말 재미있다! ^^

자... 그럼 혹시 TopCoder 에 가입하고 싶은 분들이 계신가..

http://www.topcoder.com/reg/ 

위의 링크에 가서 Competition Registration 항목을 선택하고 가입하면 된다...
참고로 가입시 적는 항목중 "Referring Member" 란 항목이 있는데, 추천회원을 의미한다. 이 글을 보고 가입하려는 분들은 글쓴이의 수고를 생각해서 Soyoja 라고 써 주면 감사하겠다 =D  (싫다면 할 수 없다. ㅎㅎ)

대회 방식은 간단하다. TopCoder 에 회원 등록을 한 후 Java 로 만들어진 Competetion Arena 라는 프로그램을 다운받고,
Event Calendar 를 보고 SRM 이 열리는 시간에 접속해서 대회를 하면 된다. (표시된 시간은 미국 동부 표준시인 것을 주의) SRM 은 코딩 75분, 5분 휴식 후 다른 사람들이 짠 코드의 버그를 잡는 Challenge 15 분으로 총 2 시간 정도가 소요된다.

회원 가입 및 TopCoder 활동은 모두 무료이며... 대회에서 성적이 좋으면 여러가지 재미난 혜택들이 많으니 많은 한국 개발자분들의 참여가 있으면 좋겠다... =)

이올린에 북마크하기(0) 이올린에 추천하기(0)

'Contest > TopCoder' 카테고리의 다른 글

TopCoder SRM Issue  (2) 2008/12/29
온라인 프로그래밍 경시대회 TopCoder 소개  (14) 2007/07/22
http://soyoja.com/trackback/56 관련글 쓰기
  1. TopCoder 시작하기..

    FROM Mission Top Secret Destination Unkown..~ 2007/08/08 01:54  삭제

    저희 동아리 위키 페이지에서 몇 줄만; - 룰 - Algorithm Competition 의 라운드하나는 다음 과정으로 나뉘어진다. Coding phase: 75분. 문제를 보고 코딩을 한다. 문제별로 최대 점수가 있고, 해당 문제를 여는 시점부터 시간이 계산되어, 답을 제출할 때까지 시간이 길수록 점수가 낮아진다. 대개는 문제 최대 점수와 난이도는 비례한다. 만약 easy 를 열고, 답을 제출하지 않은 뒤, 다시 medium 을 열어서 풀고, 다시..

  2. Flex 코딩으로 돈버는 방법

    FROM 열이아빠의 RIA 이야기 2008/11/02 22:55  삭제

    우연히 아래와 같은 제목의 글을 보게 되었습니다. Flex on TopCoder http://gurufaction.blogspot.com/2008/10/flex-on-topcoder.html 오호. 원래는 Java 와 .NET 만 참여할 수 있었는데 추가적으로 Flex 개발부분이 들어갔나 봅니다. Flex.org 에 관련된 내용이 잠깐 언급이 되어있는데 날짜가 10월 9일이니깐 얼마된것은 아니네요. http://flex.org/company/topc..

  3. Top Coder에 도전하세요!

    FROM [장선진] 삶을 위한 소프트웨어 2009/01/01 20:20  삭제

    평소 소프트웨어(Software) 개발에 관심이 많거나, 특히 알고리듬(Algorithm)이나 소프트웨어 디자인(Software Design)에 관심이 많다면 Top Coder(http://www.topcoder.com)라는 사이트에서 자신의 능력을 다른 사람들과 함께 겨루어 보는 것도 참 좋은 일이라고 생각합니다. 전 세계에서 소프트웨어에 관심이 많은 사람들이 모여서 자신의 능력을 겨루고 있는데 재미있는 점은 우리나라의 순위입니다. 현재 우리나라의..

댓글을 달아주세요!
  1. BlogIcon 송규욱 2007/08/08 01:47  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 졸업하시고도 열심히 하시네요..
    저도 TopCoder를 시작해보려고하는데.. 앞으로 종종 찾아오겠습니다..

  2. BlogIcon JM 2007/11/27 14:54  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, 구종만입니다. :)
    부탁드릴 게 있어서 몇번 irc 에서 찾았는데 그때마다 안계시더군요.. ^^;; 그래서 와서 리플 남깁니다.
    혹시 이 블로그 엔트리를 알고스팟 오픈렉쳐 게시판에 올려주시면 안될까요? 귀찮으시다면 제가 와서 퍼가도 (^^;;) 괜찮습니다.

    탑코더나 각종 대회에 대한 소개글이 필요한데.. 잘 써놓으신 것 같아서 전재하고 싶습니다. ㅎㅎㅎㅎ
    미리 고맙습니다~ ^^

  3. BlogIcon JM 2007/11/29 16:42  댓글주소  수정/삭제  댓글쓰기

    네.. 낼름 퍼갔습니다. 감사합니다!!! ^^

  4. Raina 2008/01/31 17:00  댓글주소  수정/삭제  댓글쓰기

    오 이런것도 있네요.
    조만간 시간내서 저도 한번 시작해봐야겠네요.
    재미 있을 것 같아요.
    좋은 정보 감사합니다. ^^

  5. BlogIcon doodoori2 2008/10/19 03:02  댓글주소  수정/삭제  댓글쓰기

    이번에 처음 참가해보았는데요 ㅎ
    방마다 다른 문제가 뜨는건가요? 아니면 모든 Room에 같은 문제가 들어가는건가요?ㅎ
    점수 채점 방식도 좀 궁금하더라구요a
    영어를 읽는데는 많은 에너지를 소모해야해서 ㅠㅋㅋ

    • BlogIcon soyoja 2008/10/20 09:43  댓글주소  수정/삭제

      같은 Division 내의 모든 방에 같은 문제가 뜹니다.
      Rating 1200 점을 기준으로 1200 이상이면 Divison 1, 1200 점 미만이면 Division 2 로 나뉘어지며, Division 별로는 문제가 다르지만, 같은 Division 내에서는 방이 달라도 문제는 같습니다. ^^
      채점방식은 SRM 이 완전히 완료된 이후에 문제 출제측에서 준비한 모든 test case 에 대해서 모두 통과했을 경우에만 System Test Pass 가 되며 점수를 받게 됩니다. ^^

  6. BlogIcon 지돌스타 2008/11/03 15:26  댓글주소  수정/삭제  댓글쓰기

    와우! 이런것도 있네요

  7. 미키드 2009/07/23 01:41  댓글주소  수정/삭제  댓글쓰기

    요거 퍼갈께요~

이름 암호 홈페이지


웹 서핑을 하면서 블로그를 읽다가 흥미로운 글을 하나 읽게 되었다.

서광열님의 소프트웨어 개발 이야기 에 올라와 있는 ACM 문제 풀지말라 

요지는 ACM-ICPC(세계 대학생 프로그래밍 경시대회) 유형의 문제들은 딱 떨어지는 정답을 만들기 위해 단순화시킨 요구사항과 언제나 정답이 있는 문제이기 때문에 저학년의 프로그래밍 공부에 도움이 될지 몰라도, 학부 고학년 수준에 이르게 되면 눈높이 수학식의 문제 풀이 연습밖에 되지 않기 때문에 프로그래머로서의 깊이있는 사고능력과 다양한 디자인 능력을 오히려 방해한다는 것이다.

ACM-ICPC 에 출전했었고, 현업에 있는 지금도 ACM-ICPC 유형의 알고리즘 문제들을 재미삼아, 공부삼아 푸는 입장에서 이 주장에 대해 일부 공감이 가면서도 반론을 제기하고 싶다.

우선 이 블로그의 의견에 동의하는 것은, 많은 ACM-ICPC 준비생들이 빠지기 쉬운 오류 중 하나로 알고리즘이나 기출문제들을 공식처럼 외우고, 쉬운 문제들을 빨리, 많이 푸는 기계적인 연습을 해서 자신이 기존에 풀어본 문제와 비슷한 유형이 출제되거나, 혹은 본인이 알고있는 알고리즘을 끼워넣으면 바로 풀리는 문제를 풀수있게 훈련을 한다는 것이다. 보통 이런 사람들은 아는 문제는 쉽게 쉽게 금방 풀지만 조금만 응용이 되거나 사고를 요구하는 문제에는 손을 놔버리는 경우가 많다. 또한 실제 이런식으로 공부를 하면 연습할때는 문제를 많이 푼 것 처럼 보여도 실제 대회나 프로젝트에 임하였을때는 그동안 공부한 것이 큰 도움이 되지 못하는 경우가 많다. 알고리즘을 공식처럼 끼워서 푸는 문제상황은 대회에서나 현업에서나 그리 잘 발생하는 경우가 아니기 때문이다. ( 가끔 있긴 있다. )

ACM-ICPC 의 본래 취지를 생각해보면 책에서 배운 알고리즘을 외워서 예제처럼 집어넣으면 바로 풀리는 문제들을 푸는 대회는 아닐 것이다. 다만 ACM-ICPC 출전자들의 수준차는 IOI 부터 준비한 최상위권 학생들부터 일반학생들에 이르기까지 다양한 스펙트럼을 보여주고 있어 실제 대회에서 모두 어려운 문제들로만 출제가 된다면 변별력도 없고, 준비한지 얼마 되지 않는 학생들에게 대회에 대한 의미가 없을 수 있기 떄문에 쉬운 문제 2-3 문제에 어려운 문제가 혼용되어 출제하는 것이라 생각한다.

사실, 개인적으로 ACM-ICPC 에 대해 많은 추억을 갖고 있는 입장으로서 이 글에 대해서는 반론을 많이 제기하고 싶다. 우선, ACM-ICPC 유형의 문제들은 다양한 패턴의 풀이가 나오는 경우들이 많다. 같은 문제를 풀더라도 O(N^2) 로 푸는 사람이 있는가하면 O(N) 혹은 O(1) 로 푸는 방법도 있을 수 있다.

자신이 처음에 구상한 알고리즘과 자료구조를 갖고 문제를 풀어본 후, 자기보다 더 깔끔하고 효율적으로 문제를 푼 사람의 소스코드를 보면 많은 것을 배울 수 있다. 동일한 Spec 의 문제를 다른사람은 어떻게 접근하여 해결했는지를 배울 수 있는 중요한 기회이며, 현업의 실제 프로젝트에서는 이런 방식의 경험을 하기가 상당히 어렵다.

또한, boundary test 나 overflow 와 같이 실제 프로젝트에서 치명적으로 발생하는 유형의 버그에 대한 경험을 다양하게 해볼 수 있다. ACM-ICPC 의 문제들은 솔루션의 무결성을 점검하기 위해 다양한 test data 를 제공하는데, 모든 test case 를 통과할 수 있는 깔끔하고 완벽한 솔루션의 중요성을 직접 체험할 수 있는 더없이 좋은 기회가 바로 이런 알고리즘 문제풀기라 할 수 있다. 현업에서는 개발 - QA 테스트를 통해 진행되는 프로세스를 ACM 문제풀이를 통해 단순화시켜 경험해 보고 있다고 볼 수 있는 것이다.

특히, 알고리즘(algorithm) 이란 학문은 책으로만 배워서는 안되며, 실제 알고리즘을 다양한 응용사례에 맞게 직접 구현해 보는 것이 무엇보다도 중요한데, 알고리즘의 공부에 있어서 ACM-ICPC 유형의 문제를 풀어보는 것은 정말 좋은 공부방법이라 할 수 있다.

Google 이나 IBM,  Microsoft 와 같은 회사들이 기술면접에서 ACM-ICPC 유형의 알고리즘 문제를 면접때 제출하는 것은 여러가지로 시사하는 바가 크다고 생각한다. (사실 위와 같은 대기업 뿐만 아니라 외국의 IT 회사들은 많은 회사가 이런 소위말하는 "압박면접" 을 채택하는 것으로 보인다. 외국 회사의 기술면접 스타일에 대해서는 "조엘 온 소프트웨어" 를 보면 잘 나와있다. )

ACM-ICPC 와 같은 문제풀이의 장점을 한 가지만 더 들자면 ACM-ICPC 나 TopCoder 와 같은 대회 참가를 통해서 세계 각국의 수준높은 프로그래머들을 많이 만날 수 있고(온라인 상이서 혹은 오프라인 상에서) 그들의 솔루션과 소스코드를 분석해 볼 기회가 생기며 - 앞서 말했듯이 같은 문제를 나와 다른 자료구조와 알고리즘, 다른 코딩 테크닉을 활용해서 그들이 어떻게 풀었는지를 보는 것은 정말 중요하다 - 이러한 과정에서 본인에게 굉장한 motivation 을 줄 수 있는 기회가 된다. 추가로 이런 대회에서 성적이 좋으면 본인의 이력서에 멋진 이력으로 추가할 수 있다. 그리고 무엇보다도 재미 라는 즐거움이 있다. ^^

이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/37 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon Neon 2007/07/03 00:27  댓글주소  수정/삭제  댓글쓰기

    문제를 외워서 푼다고 생각하는 사람은 그렇게 골치아픈 문제를 왜 풀려는 걸까요?
    똑똑한 학부 1~2학년생이 한참 들여다보면 뭐든지 풀 수 있다는 말도 참 어이없게 들립니다. 3명이 그런식으로 문제 풀면 금새 6~7문제 풀고 월파 나가겠네요.

    • BlogIcon soyoja 2007/07/03 16:16  댓글주소  수정/삭제

      네... 솔루션을 외우거나 고민도 안해보고 답부터 먼저보고 문제를 푸는 경우를 이른바 "문제낭비" 라고 KOI4U 에서 표현하더군요... ^^
      그리고 문제는 정말 그 유형과 깊이가 다양해서... 한참 들여다보면 결국 풀리는 문제가 있고... 며칠, 심지어 몇달 혹은 몇 년? (물론 몇년동안 계속 그 문제만 생각하는 것은 아니겠지만) 에 걸쳐서 고민하게 만드는 문제도 있더군요.. ^^

  2. JongsooLee 2007/07/03 02:03  댓글주소  수정/삭제  댓글쓰기

    정말 ACM 문제가 안 좋으니 풀지 말란 소리는 아닌 것 같은데...^^
    "알고리즘도 중요하지만 알고리즘만 중요한 건 아니고 다른 중요한 것도 많으니...넓게 보세요."라고 얘기하는 것처럼 보임.
    근데 그 포스트 보니 제목을 좀 자극적으로 쓰기는 했다...ㅎ

    • BlogIcon soyoja 2007/07/03 16:19  댓글주소  수정/삭제

      엉. 근데 처음 글쓰신 분은 ACM 문제풀이가 득보다 해가 많다고 본문에 언급을 했길래...나는 반론을 제기한거지. =)

이름 암호 홈페이지


즐겨 가보는 블로그 중 하나인 김창준님의 애자일 블로그에서 참 좋은 글이 있어서 여기에 적어본다. 프로그래머의 위기지학(爲己之學). 바로 남을 위한 프로그래밍이 아닌, 자기 자신을 위한 프로그래밍을 해야 한다는 뜻이다.

http://agile.egloos.com/2807583

여기에 많은 공감을 하게 되는 것은, 내가 보아온 많은 훌륭한 프로그래머들이 밥벌어 먹고 살기 위한 프로그래밍이 아닌, 자기 자신을 위한 프로그램을 만들고, 이로 부터 자신의 목적에 맞는 많은 생산성 향상과 즐거움을 얻는 것을 보면서 감탄한 적이 많았기 때문이다.
국내의 대표적인 백신 프로그램인 V3 도 안철수씨의 개인 PC 에 감염된 바이러스를 제거하기 위해서 만든 V1 백신이 그 시초였고, 현재 100만명 이상이 사용하고 있는 대표적인 사진 관리 프로그램중 하나인 포토웍스(
http://www.andojung.com ) 도 andojung 님의 개인적인 취미로 부터 시작된 훌륭한 프로그램이었다. ( 사실 andojung 님은 전에 나의 회사 고참이기도 했다... ㅋㅋㅋ )

많은 프로그래머들이 개발업무에 있어서 보다 효율적이고 퍼포먼스를 높이기 위해 부가적인 유틸을 만들어서 개발에 활용하기도 한다. 예를 들어 내가 본 예를 들자면 대량의 데이터를 읽고 처리하는 프로그램을 개발함에 있어, 데이터를 일일히 raw 상태로 읽지 않고 빠른 처리를 위해 데이터 파싱 프로그램을 별도로 만들어 활용한다든가, DB 작업을 할때 대량의 가상 유저 DB 를 무식하게 노가다로 만드는 것이아니라 제너레이터 프로그램을 따로 제작해서 이로 부터 데이터를 생성해서 DB 에 자동 인서트하는 쿼리 프로그램을 만든다든가 하는 것들이었다. 물론 그냥 노가다로 하는게 훨씬 더 빠른 경우도 많다. =) 그래서 현업에서는 대부분의 사람들이 별도유틸 제작시간보다 노가다 시간이 훨씬 긴 경우에만 별도 유틸을 제작할 생각을 하는 것 같기는 하다. 중요한것은 노가다를 하고말고가 아니고 항상 어떻게 하면 같은 일을 하더라도 자신의 코딩능력을 활용해서 효율적으로 일을 하느냐가 아닐까 싶다...;

그럼.. 내가 만든 위기지학의 프로그램이 있는가? 물론 있다  ;)
전에 회사에서 틈틈이 영어공부를 하기 위해서 만든 단어장 암기 프로그램... ㅋㅋㅋ




사용자 삽입 이미지
                  (클릭하시면 크게 보실수 있어요~ )




한창 영어공부를 열심히 하던 시절, 딴짓하면서도 단어를 외울 수 있게 고안된 프로그램이다. 나름대로 원본 토플단어장으로 부터 파싱해서 데이터 수집, 버튼 안누르고도 자동으로 단어가 넘어가는 타이머, 틀린단어 체크 및 로그 기능등 편리하다고 생각되는 기능들을 추가해서 만든 프로그램이다. (UI 가 허접한 이유는 화면에 띄어놓아도 다른 사람들 눈에 안띄게 하기 위함.. ㅋㅋ) 사실 이것과 비슷한 프로그램들도 여럿 있기는 하지만 그래도 직접 만들어서 써서 그런지 애착이 많이 가는 넘중 하나다. ㅎㅎ
이올린에 북마크하기(0) 이올린에 추천하기(0)
http://soyoja.com/trackback/23 관련글 쓰기
댓글을 달아주세요!
이름 암호 홈페이지



예전 홈페이지에 써놓았던 글을 여기로 옮겨왔다.
벌써 반년이나 지난 일이구나...

2006 년 11월 9일.

오늘 agile 방법론 세미나를 회사에서 했다. 마이크로 소프트웨어를 비롯해서 여러 컴퓨터 잡지에 프로그래밍과 개발방법론에 관해 많은 기고를 하고 몇몇 업체에 agile 방법론 컨설팅으로 이 분야에서 꽤 유명한 김창준 씨가 직접 와서 세미나를 진행했다.

김창준씨 소개
http://xper.org/wiki/xp/_b1_e8_c3_a2_c1_d8

애자일 방법론 소개
http://agile.egloos.com

사실 그리 많지 않은 개발 경험이지만 학교와 멤버쉽, 그리고 회사에서 여러 프로젝트와 외주관리를 진행해보면서 가면갈수록 개발방법론과 소프트웨어 공학에 대해 의구심이 드는 경우가 많았다. 바로 현실과 이상의 괴리라고나 할까. 내가 만나본, 많은 개발경력을 가지고 있고 업체에서 손꼽히는 뛰어난 개발자들 조차도 소프트웨어 개발 방법론을 제대로 내재화하여 실제 프로젝트에 적용하는 사례는 거의 보지를 못했고, 또 매번 프로젝트를 할때마다 그리는 UML 다이어그램들이 실제 프로젝트의 퍼포먼스 향상에 도움을 주는 것을 체감하기 힘들었기에 이러한 이론적인 방법론들이 과연 현업에서 어떻게 적용되야 하고, 또 얼마나 효과가 있을 것인지 의문이 들었던 것이다.
(이상의 생각은 사실 작년 11월 경에 가졌던 생각이고, 요즘에 드는 생각은 설계와 좋은 방법론에 따라 표준화 된 소프트웨어 개발은 생산성 향상에 분명 도움이 될 수 있다. 문제는 어떻게 하면 소프트웨어 개발에 있어 좋은 설계를 만들고, 이를 바탕으로 중간에 일어날 수 있는 요구사항의 변경이나 설계시에 발견하지 못했던 많은 오류들을 적절히 컨트롤해 가면서 설계를 개발과 매칭할 수 있는가... 이다. 그리고, 설계를 하는 사람은 반드시 많은 개발경험과 소프트웨어 지식을 갖춘 아키텍쳐가 되어야 한다는 생각에는 변함이 없다.)

나의 질문 : 방법론 세미나를 들을때마다 드는 의문인데, 현업에서는 이러한 방법론을 내재화하여 개발 효율성과 결과물의 성능 향상에 도움을 주도록 적용하는 사례가 거의 없다시피 하며, ( 나와 내 주위의 경험상으로 볼떄. ) 현업에서 적용시키기 어려운 점 이 많습니다. 이러한 부분에 대해서 어떻게 생각하시는 지?

김창준 : ( 대략 3 분정도 침묵이 흐른 후 ) 현업에 적용시키기 어렵고, 노력을 많이 해야 한다. 하지만 이러한 방법론이 실제 개발에 있어서 가장 효율적이고 좋은 방법이라고 생각한다.

사실 이러한 대답에 좀 실망을 많이 했다. agile 방법론이 좋다! 라는 이야기는 이미 수도없이 들어왓기 때문에, 실제 현업에서 성공적으로 적용되는 사례  ( 개발자가 내재화 할 수 있는 ) 에 대해서 자세하게 듣고 싶었는데 그러한 부분에 대해서는 언급이 거의 없었던 것이다.

외부 회의때문에 끝까지 세미나를 듣지 못해서 아쉬웠는데. 어쨌든 나름대로 개발방법론의 적용과 현업 개발자간의 괴리감에 대해서 다시 한번 생각해 볼 수 있는 시간이 되어서 나 자신에게도 의미가 있던 것 같다.

이올린에 북마크하기(0) 이올린에 추천하기(0)

'IT Story' 카테고리의 다른 글

용어정의 - 매쉬업(Mash Up)  (1) 2007/06/24
프로그래머의 위기지학  (0) 2007/06/19
시맨틱 웹(Semantic Web)  (0) 2007/06/18
Agile 방법론 세미나 ( with 김창준 )  (1) 2007/06/17
Web 2.0 과 한국의 인터넷 트렌드  (0) 2007/06/16
iPod, 그 성공 스토리  (0) 2007/06/16
http://soyoja.com/trackback/20 관련글 쓰기
댓글을 달아주세요!
  1. BlogIcon soyoja 2007/06/18 20:18  댓글주소  수정/삭제  댓글쓰기

    안녕하세요... 글을 남겨주시고... 솔직히 많이 놀랬습니다. ^^
    제 개인블로그는 별로 찾아오는 분이 안계셔서요....
    창준님 입장에서는 분명 불쾌할수 있는 이야기일텐데... 논리적으로 잘 설명해 주셔서 정말 감사하고 제가 머슥해지네요... ;;
    항상 프로젝트를 진행해 보면 최초 설계와 적절한 개발방법론을 적용해서 실제 프로젝트에서 개발자가 얼마나 더 효율적으로 일을하고, 프로젝트의 생산성 향상에 기여할 수 있는지가 늘 의문이었는지라 이런 글을 쓰게 되었습니다. 말씀하신 성공사례에 대해서는 저도 글을 찾아서 읽어보고.. 지금 진행중인 프로젝트에도 어떻게 참고할 수 있을지 더 생각해 봐야 할것 같네요...
    글 마지막 부분의 경력에 관한 이야기는 저의 선입견으로 쓴 글이니 웃어 넘겨주셨으면 합니다... ^^ 오해의 소지가 있을만한 글이라서 지웠습니다~
    그럼 오늘도 좋은 하루 되세요..
    추신 ) 헉... 댓글 지우셨나... ;;

이름 암호 홈페이지