줄다리기 문제

Posted at 2010/06/05 02:18// Posted in 개발/개발이야기
사람들이 있습니다.
그 사람들을 두 팀으로 나누어 줄다리기를 하려고 합니다.
두 그룹 사람들의 몸무게의 합이 가장 비슷하게 만들려고 합니다.

예를 들어
40 50 70 100

이렇게 네명인 경우는

40, 100
50, 70

이렇게 나누는게 가장 공평해 지겠지요.

두팀으로 나눌때 사람수가 반반이 되도록 나누어야 합니다. (총 사람수가 홀수라면 한쪽이 한쪽보다 1명이 더 있어도 됩니다.)
뭐 대략 이런 문제인데요.

관심있으신 분들은 풀어보세요. 입력되는 사람 수가 많아지면 복잡해 지겠죠?

이걸 풀면서 느낀건데요, 사람의 몸무게를 랜덤으로 생성하게 하면, 사람 수가 많아지면 질수록 양팀의 몸무게합이 거의 비슷해지더군요.

이번 선거에서도 누군가의 소문을 듣고 (X당 안찍으면 전쟁난다, X당 안찍으면 우리지역 경제 죽는다 이런 소문들) 비합리적인 선택을 하셨을 분들도 많을텐데, 소문의 개수가 많아지고 다양해질 수록 올바른 선택을 할 확률이 높아지지 않나 하는 생각이 들었습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/06/05 02:18 2010/06/05 02:18

http://www.wearethebest.co.kr/blog/trackback/266

댓글을 남겨주세요

[로그인][오픈아이디란?]

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

함수형 언어

Posted at 2010/06/05 02:16// Posted in 개발/개발이야기
아래는 함수형 언어인 하스켈로 팩토리얼 (n!)를 구하는 소스입니다.

factorial 0 = 1
factorial n = n * factorial (n-1)

위와 같이 두줄이면 되고, "factorial 10" 과 같은 식으로 호출하면 됩니다.
수학에서 정의하는 팩토리얼과 형태가 같은 (거의 흡사하다는) 걸 알 수 있습니다.

원리는 간단한데요.
흡사 수식을 전개하듯이 진행됩니다. 과정을 보시면 단순한 문자열 치환이라고 생각하셔도 됩니다.

factorial 10
(factorial n 형태이므로, 미리 정의했던 factorial n = n * factorial (n-1) 교체)
10 * factorial (10-1)
10 * (9 * factorial 8)
10 * (9 * (8 * factorial 7))
...
10 * (9 * (8 * (7 * (6 * (5 * (4 * (3 * (2 * (1 * (factorial 0))))))))))
(위에서 factorial 0 = 1 로 정의를 했으므로 그것으로 교체)
10 * (9 * (8 * (7 * (6 * (5 * (4 * (3 * (2 * (1 * (1))))))))))

뭐 이런 식인데요. 기존의 절차적, 객체지향 언어들처럼 스택을 통한 함수 재귀 호출을 하지 않고, 일종의 문자열 치환처럼 "바꿔쓰기 규칙"이란걸 사용해서 위와 같이 전개가 됩니다.

더이상 교체할 것이 없으면 사칙 연산을 진행합니다.
그래서 최종적으로 3628800 이라는 결과가 나옵니다.

내가 아는 프로그래밍 언어와 그것을 이용하여 코딩하는 방식이 전부가 아니란걸 생각하게 해 주는 것 같습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/06/05 02:16 2010/06/05 02:16

http://www.wearethebest.co.kr/blog/trackback/265

댓글을 남겨주세요

[로그인][오픈아이디란?]

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

MS와 애자일

Posted at 2010/05/31 00:51// Posted in 개발/개발이야기
HARD CODE: 나잘난 박사의 IT 정글 서바이벌 가이드 (에릭브레히너 저)

마이크로소프트 골수 관리자인 에릭 브레히너가 가상의 인물 나잘난 박사를 통해 통렬히 낱낱이 공개하는 비공식 마이크로소프트 개발 매뉴얼이다. 초우량 기업 관리자가 말하는 IT 정글에서 살아남는 서바이벌 가이드를 담았다.

리팩토링과 지속적인 통합을 제외하고는 TDD와 스크럼이 마이크로소프트에서 시도한 애자일 기법 중 가장 쉽고 효과적인 기법으로 판명났다. - 하드코드 중에서

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/05/31 00:51 2010/05/31 00:51

http://www.wearethebest.co.kr/blog/trackback/264

댓글을 남겨주세요

[로그인][오픈아이디란?]

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

프로그래머 능력 매트릭스

Posted at 2010/05/26 02:40// Posted in 개발/개발이야기
프로그래머 능력 매트릭스
크리에이티브 커먼즈 라이센스
Creative Commons License
2010/05/26 02:40 2010/05/26 02:40

http://www.wearethebest.co.kr/blog/trackback/263

댓글을 남겨주세요

[로그인][오픈아이디란?]

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

파이썬과 C/C++의 가독성 차이

Posted at 2010/05/25 23:06// Posted in 개발/개발이야기

알고스팟 (http://algospot.com/ )에서 알고리즘 문제를 풀었습니다.
가상의 미팅 주선 회사에서 주선 성공률을 높이기 위한 '짝맞추기'라는 알고리즘 문제인데요. (http://algospot.com/zbxe/?mid=aoj&action=problem&no=100 )

다음은 이 문제의 1등을 기록한 "혀콰"님의 C/C++ 소스입니다.


#include<stdio.h>
#include<algorithm>
int t, n, a, b, dab;
int o, i, j, j2, p, cnt1[2005], cnt2[2005], cnt;
char c[100005];
int main() {
scanf("%d\n", &t);
for (o=1;o<=t;o++) {
scanf("%d\n", &n);
gets(c);
i=0; p=0; a=0; cnt=0;
while(c[i]!='\0') {
if ('0'<=c[i] && c[i]<='9') {
a*=10;
a+=c[i]-'0';
}
else if (c[i]==' ') {
if (p) a*=-1;
cnt1[a+1000]++;
cnt++;
a=0; p=0;
}
else if (c[i]=='-') p=1;
i++;
}
if (cnt != n) {
if (p) a*=-1;
cnt1[a+1000]++;
}

gets(c);
i=0; p=0; b=0; cnt=0;
while(c[i]!='\0') {
if ('0'<=c[i] && c[i]<='9') {
b*=10;
b+=c[i]-'0';
}
else if (c[i]==' ') {
if (p) b*=-1;
cnt2[b+1000]++;
cnt++;
b=0; p=0;
}
else if (c[i]=='-') p=1;
i++;
}
if (cnt != n) {
if (p) b*=-1;
cnt2[b+1000]++;
}

j=0; j2=0; dab=0; cnt=0;
while (1) {
if (cnt1[j] && cnt2[j2]) {
cnt1[j]--;
cnt2[j2]--;
dab += abs(j-j2);
cnt++;
if (cnt==n) break;
}
else if (!cnt1[j]) j++;
else j2++;
}
printf("%d\n", dab);
}
return 0;
}



다음은 파이썬으로 작성된 "JM"님의 소스입니다.



import sys
rl = sys.stdin.readline

cases = int(rl())
for cc in xrange(cases):
rl()
a = map(int, rl().split())
b = map(int, rl().split())
a.sort()
b.sort()
print reduce(lambda a, b: a + b,
[abs(c - d) for c, d in zip(a, b)])



두 언어의 소스 가독성을 비교해 보니 어떠신가요?

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/05/25 23:06 2010/05/25 23:06

http://www.wearethebest.co.kr/blog/trackback/262

  1. LIBe
    2010/06/07 05:27 [Edit/Del] [Reply]
    안녕하세요. 웹에서 검색을 하다가 우연찮게 페이지를 발견해서 글을 남깁니다.

    위의 "혀콰"님의 C++ 코드와 "JM"님의 python 소스코드의 가독성을 따지기에는 무리가 있다고 생각합니다.

    우선 "혀콰"님의 코드 경우 속도를 최대한 빨리 하기 위한 시도의 결과이다 보니 코드가 더러워진 감이 없잖아 있는것 같기도 합니다만, python 소스코드와 C++ 소스코드의 가독성을 비교 하려면, 그래도 C++에서 간결하게 짜여진 소스코드를 놓고 비교를 해야 하는것이 아닐련지 라는 생각이 드네요.

    물론 python으로 구현 하였을경우 가독성에 이점이 발생할 수 있다는 생각을 합니다만, 위의 2개의 코드는 좀 무리가 있다고 봅니다 :)

    개인적으로 제가 짠 소스코드와 비교를 한번 해보심이 어떨련지 생각합니다. 나름 C++로 간결하게 짰다고 생각합니다.


    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    typedef long long ll;
    int main() {
    int tn;
    scanf("%d", &tn);
    while(tn--) {
    int n;
    scanf("%d",&n);
    vector<int> a(n), b(n);
    for(int i=0;i<n;++i) scanf("%d",&a[i]);
    for(int i=0;i<n;++i) scanf("%d",&b[i]);
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    ll ret = 0;
    for(int i=0;i<n;++i) ret += abs(a[i]-b[i]);
    printf("%lld\n", ret);
    }
    }

댓글을 남겨주세요

[로그인][오픈아이디란?]

Name *

Password *

Link (Your Homepage or Blog)

Comment

Secret

1 2 3 4 5 ... 31